31.10.2011 22:27, Sergey Kobzar написав(ла):
On 10/31/11 21:14, Alexandr Kovalenko wrote:

Ну тогда мы говорим о разных системах.

Сергей, я бы на Вашем месте обратил внимание на то, в какую рассылку
Вы пишете.

ОК :)

Btw, под словом "система" имелась ввиду система бэкапов, а не ОС.

Буду благодарен, если кто из здесь присутствующих поделится своей
success story бэкапов MySQL на базе BSD + ZFS и не встанет ли оно буквой
Zю при высоких нагрузках/больших объемах.

Ну где-то так:
@monthly zfSnap -a 1y -p monthly_ utwig-sas/mysql utwig-sas/pgsql
@weekly zfSnap -a 1m -p weekly_ utwig-sas/mysql utwig-sas/pgsql
@daily zfSnap -a 1w -p daily_ utwig-sas/mysql utwig-sas/pgsql ; zfSnap -d -p daily_ -p weekly_ -p monthly_ ; zfSnap -d -p daily_ -p weekly_ -p monthly_

В планах ещё придумать скрипт который будет из снепшота делать архив базы. Есть в ужасном состоянии скрипт который позволяет перекидывать снепшоты в другую файловую систему (или на другой компьютер). Смысл такой пересылки например в том, что при перекидывании в fs с compression=gzip-9 и без recordsize=8k база занимает раза в два меньше места.

В аттаче библиотека на шелле которая использовалась до этого, работает исключительно с MyISAM, зато позволяет создавать жатые инкрементные бекапы. Пример там же. Останавливает базу на пару минут.

--
Sphinx of black quartz judge my vow.
#!/bin/sh -

if [ -n "$LOGLIB" ]; then
        CurrentUser=`whoami`
        CurrentTask=`basename $0`
        loggerOptions=`echo $LOGLIB|awk 'BEGIN{FS=":"}{print"-t "$1" -p "$2}'`
        llog () {
                if [ -n "$*" ]; then
                        if [ -n "$1" -a "$1" = '-' ]; then
                                shift
                                if [ -n "$*" ]; then
                                        sed -l "s|^ 
*|[$CurrentUser:$CurrentTask] $* |"
                                else
                                        sed -l "s|^ 
*|[$CurrentUser:$CurrentTask] |"
                                fi
                        else
                                echo "[$CurrentUser:$CurrentTask] $*"
                        fi
                else
                        sed -l "s|^ *|[$CurrentUser:$CurrentTask] |"
                fi | logger $loggerOptions
        }
else
        llog () {
                :
        }
fi
#!/bin/sh -

PATH=$PATH:/usr/local/bin

MyLibDir=`dirname $0`
LOGLIB='price:info'
. "$MyLibDir/loglib.sh"

BackupDirectory='/home/backup/db'
TablesToBackup='/var/spool/mysql/etc/TablesToBackup'

if [ -f "$TablesToBackup" ]; then
        BackupTables=`cat $TablesToBackup | grep -v '^#'`
fi

backupWarmUp() {
        (
                echo "warming up incremental backup"
                mkdir -p "$BackupDirectory/current"
                for dir in $BackupTables; do
                        if [ -d "/var/db/mysql/$dir" ]; then
                                rsync -rtWS --chmod=Dug+x,u+rw,g+r,o-rwx 
--delete --exclude "*.bz2" "/var/db/mysql/$dir" "$BackupDirectory/current"
                        else
                                echo "directory /var/db/mysql/$dir not found"
                        fi
                done
        ) | llog -
}

backupStopMysql() {
        (
                echo "stopping mysql"
                /usr/local/etc/rc.d/mysql-server stop >/dev/null
        ) | llog -
}

backupComplete() {
        (
                echo "completing incremental backup"
                for dir in $BackupTables; do
                        if [ -d "/var/db/mysql/$dir" ]; then
                                rsync -rtWS --chmod=Dug+x,u+rw,g+r,o-rwx 
--delete --exclude "*.bz2" "/var/db/mysql/$dir" "$BackupDirectory/current"
                        else
                                echo "directory /var/db/mysql/$dir not found"
                        fi
                done
        ) | llog -
}

backupStartMysql() {
        (
                echo "starting mysql"
                /usr/local/etc/rc.d/mysql-server start </dev/null >/dev/null 
2>&1
        ) | llog -
}

backupSpawnCopies() {
        (
                DAY=`date "+%u"`
                DAYOFMONTH=`date "+%e"`
                WEEK=`date "+%W"`
                MONTH=`date "+%m"`

                cd "$BackupDirectory/current"

                echo "compressing tables"
                for dir in $BackupTables; do
                        make -C "$BackupDirectory/current/$dir" -f 
"$MyLibDir/compress.make" -j2 -s
                done

                echo "creating daily backup"
                rm -rf "$BackupDirectory/daily/$DAY"
                mkdir -p "$BackupDirectory/daily/$DAY"
                find . -type d -print0 | xargs -0 -Ifoo mkdir -p 
"$BackupDirectory/daily/$DAY/foo"
                find . -type f -regex '.*\.bz2$' -print0 | xargs -0 -Ifoo ln 
foo "$BackupDirectory/daily/$DAY/foo"

                if [ "$DAY" -eq "1" ]; then
                        echo "creating weekly backup"
                        rm -rf "$BackupDirectory/weekly/$WEEK"
                        mkdir -p "$BackupDirectory/weekly/$WEEK"
                        find . -type d -print0 | xargs -0 -Ifoo mkdir -p 
"$BackupDirectory/weekly/$WEEK/foo"
                        find . -type f -regex '.*\.bz2$' -print0 | xargs -0 
-Ifoo ln foo "$BackupDirectory/weekly/$WEEK/foo"
                fi

                if [ "$DAYOFMONTH" -eq "1" ]; then
                        echo "creating monthly backup"
                        rm -rf "$BackupDirectory/monthly/$MONTH"
                        mkdir -p "$BackupDirectory/monthly/$MONTH"
                        find . -type d -print0 | xargs -0 -Ifoo mkdir -p 
"$BackupDirectory/monthly/$MONTH/foo"
                        find . -type f -regex '.*\.bz2$' -print0 | xargs -0 
-Ifoo ln foo "$BackupDirectory/monthly/$MONTH/foo"
                fi
        ) | llog -
}
# $Id: compress.make 94 2010-10-17 11:15:48Z arcade $

AllFiles != find . -type f -not -name '*.bz2'
CompressedFiles = ${AllFiles:C/$/.bz2/g}

all: ${CompressedFiles}

${CompressedFiles}: ${@:C/\.bz2$//g}
        bzip2 -kf9 $?
#!/bin/sh -

# $Id: mysqlBackup 12 2008-08-19 14:30:56Z arcade $

PATH=$PATH:/usr/local/bin

MyLibDir=`dirname $0`
LOGLIB='price:info'
. "$MyLibDir"/loglib.sh
. "$MyLibDir"/mysqlBackup.sh

backupWarmUp

backupStopMysql

backupComplete

backupStartMysql

backupSpawnCopies

Ответить