LINUX.ORG.RU
ФорумAdmin

Резервное копирование mysql


0

1

Решил сделать автоматическое резервное копирование баз данных mysql. Так как баз данных у меня много и их количество и название периодически меняется, решил сделать так:
/usr/bin/mysqldump -uadmin -P3306 -h127.0.0.1 -p******** --all-databases | gzip -c > /mnt/md1/tmp-backup/`date «+%Y-%m-%d»`.bz2
Но в этом случае все базы выгружаются в 1 файл и в случае падения одной базы восстанавливать придется все...
Можно ли выгрузить все базы в один каталог, под своим названием?

Можно.

Можно. Кажися суть финта ушами заключается в вызове show databases и обработке выхлопа. Сейчас поищу.

Camel ★★★★★ ()
Ответ на: Можно. от Camel

Наталкивание на идею.

Вот кусок кода, должен помочь дойти до правильного сценария:

DATABASES=$(echo "SHOW DATABASES" | sql | clean)

for db in ${DATABASES}
do
        [ -d "$CWD/$db" ] || mkdir -p "$CWD/$db"

        TABLES=$(echo "SHOW TABLES" | sql $db | clean)
        for table in ${TABLES}
        do
                FILE="$CWD/$db/$table".gz
                if was_table_modified $FILE $db $table
                then
                        mysqldump --opt $db $table | gzip > "$FILE".new
                        if [ ! -f "$FILE" ] || ! cmp -s "$FILE" "$FILE".new
                        then
                                mv "$FILE".new "$FILE"
                        else
                                rm -f "$FILE".new
                        fi
                fi
        done
done

Camel ★★★★★ ()
Ответ на: Наталкивание на идею. от Camel

Другой вариант.

Кажися этот сценарий у меня с Bacul'ой работал:

#!/bin/sh

# Directory to store backups in
DST=/data/spool/dbback
# A regex, passed to egrep -v, for which databases to ignore
IGNREG='^snort$'
# The MySQL username and password
DBUSER=root
DBPASS=password
# Any backups older than this will be deleted first
KEEPDAYS=7

DATE=$(date  +%Y-%m-%d)

cd /var/lib/mysql

find ${DST} -type f -mtime +${KEEPDAYS} -exec rm -f {} \;
rmdir $DST/* 2>/dev/null

mkdir -p ${DST}/${DATE}
for db in $(echo 'show databases;' | mysql -s -u ${DBUSER} -p${DBPASS} | egrep -v ${IGNREG}) ; do
        echo -n "Backing up ${db}... "
        mysqldump --opt -u ${DBUSER} -p${DBPASS} $db | gzip -c > ${DST}/${DATE}/${db}.txt.gz
        echo "Done."
done

exit 0

Camel ★★★★★ ()
Ответ на: комментарий от iliaxxx

Я просто написал маленький скриптик, который вытаскивает из одного большого дампа кусочек с нужной базой, это тоже способ :)

blind_oracle ★★★★★ ()
DBLIST=$(echo 'show schemas' | mysql $PARAMS \
| egrep -v '^mysql$|^information_schema$|^Database$')
for db in $DBLIST; do
    mysqldump $PARAMS $db | gzip -9 > DBs/$db.sql.gz
done

А на каталог DBs натравить rdiff-backup, пускай он заведует датами и прочим. Хотя можно и без него.

undertaker ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.