Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 Nov 2008 01:05:48 +0000
From:      Pete French <petefrench@ticketswitch.com>
To:        pjd@FreeBSD.org
Cc:        freebsd-stable@freebsd.org
Subject:   Re: Curious failure of ZFS snapshots
Message-ID:  <E1L6aku-000NAk-Q1@dilbert.ticketswitch.com>
In-Reply-To: <20081130000059.GC1494@garage.freebsd.pl>

next in thread | previous in thread | raw e-mail | index | archive | help
> It's not file system on-disk structure fault, as far as I understand,
> because reboot fixes it. I belive it's how you access the snapshots.

I was about to say "a reboot doesnt fix it for me" - as I swear i tried
that before, but I have discovered you are right, as I just rebooted the
server and it is fine.

Here is what I am doing - this script is run with an argument '7am' or '7pm'
once per day. the mysql database is a slave replication from a master,
so there is a continuous trickle of data into it. The symbolic
links are there so you can connect to the mysql server and access
'xxx-7am' or 'xxx-7pm' to get a previous version of database 'xxx'.
In case its not obvious, the filesystem 'tank/zfs' is mounted on the
director '/var/db/mysql'. If you run this for a few cycles it should
preseumably break for you too.

-pete.

-------------------------------------------------------------------

#!/bin/sh

SUFFIX=$1
FS_NAME=tank/mysql
DB_DIR=/var/db/mysql

# First we should make sure we are root
if test `/usr/bin/whoami` != "root"
then
        /bin/echo You must be root to run this script
        exit
fi

# Check that we have a suffix
if test "${SUFFIX}" = ""
then
        /bin/echo "usage: $0 <suffix>"
        exit
fi

# Stop mysql, unlink the links and destroy the snapshot
/usr/local/etc/rc.d/mysql-server stop > /dev/null
/bin/rm -f ${DB_DIR}/*-${SUFFIX}
/sbin/zfs destroy ${FS_NAME}@${SUFFIX}

# Create the new (dated) snapshot
/bin/date > ${DB_DIR}/SNAPSHOT_DATE
/sbin/zfs snapshot ${FS_NAME}@${SUFFIX}
/bin/rm -f ${DB_DIR}/SNAPSHOT_DATE

# Find all mysql subdirectories and link them
/usr/bin/find ${DB_DIR}/ -name '[a-z]*' -type d -maxdepth 1 -print | while read DIR
do
        BASE_DIR=`/usr/bin/basename ${DIR}`
        /bin/ln -s ${DB_DIR}/.zfs/snapshot/${SUFFIX}/${BASE_DIR} ${DIR}-${SUFFIX}
done

# Restart mysql
/usr/local/etc/rc.d/mysql-server start > /dev/null




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?E1L6aku-000NAk-Q1>