Я пытаюсь получить немного больше пользы от своих резервных копий MySQL. Я хочу заархивировать свою резервную копию, когда она будет завершена из задания cron. Вот сценарий, который у меня есть для резервного копирования.
#!/bin/sh
date=`date -Iminutes`
mysqldump --all-databases > /var/sqlbackup/sqlbackup-$date.sql -pmypassword
find /var/sqlbackup/ -mtime 3 | xargs rm
Любая помощь будет полезна, даже если это указатель на то, как это сделать лучше.
Вот сценарий резервного копирования / обслуживания, который я использую:
#!/usr/bin/sh
#backup all mysql databases
# list MySQL databases and dump each
DIR=
DATESTAMP=$(date +%Y%m%d)
DB_USER=
DB_PASS=
# remove old backups
find ${DIR} -type f -mtime +5 -exec rm -rf {} \;
DB_LIST=`mysql -u $DB_USER -p"$DB_PASS" -e'show databases;'`
DB_LIST=${DB_LIST##Database}
for DB in $DB_LIST;
do
FILENAME=${DIR}${DB}-${DATESTAMP}.sql.gz
mysqldump -u $DB_USER -p"$DB_PASS" --opt --flush-logs $DB | gzip > $FILENAME
done
mysqlcheck -u $DB_USER -p"$DB_PASS" --all-databases > /root/mysql_backups/check_errors-${DATESTAMP}.log
Этот сценарий генерирует индивидуальную резервную копию каждой базы данных с помощью gzip, поэтому вам не нужно восстанавливать базы данных всего сервера, если есть проблема только с одной БД. Он также включает некоторую проверку работоспособности mysql и находит старые резервные копии базы данных и удаляет их.
Для восстановления по запросу:
Пару раз приходилось восстанавливать. Такое случается.
gunzip backup_file.sql.gz
mysql -u <username> -p <database_name> < backup_file.sql
Вероятно, есть более «однострочный» способ сделать это ... но у меня это сработало.
#!/bin/sh
date=`date -Iminutes`
find /var/sqlbackup/ -name 'sqlbackup-*' -mtime +2 -delete
mysqldump --all-databases -pmypassword | gzip > /var/sqlbackup/sqlbackup-$date.sql.gz
Вы можете подключиться к gzip
сжать.
Я переместил находку до mysqldump. Я не уверен, насколько велики ваши базы данных, но это поможет снизить использование диска и избежать проблем с пространством.
Обычно лучше использовать -mtime +2
вместо того -mtime 3
чтобы повлиять на все, что старше двух дней, а не на файлы трехдневной давности. Таким образом, если ваша cron пропустит день, вы не получите старые файлы, пропущенные при удалении.
Лично я предпочитаю ограничивать find
к шаблону имени, чтобы убедиться, что вы ничего не удалите неожиданно.
В -delete
опция в find полезна, если вы не хотите использовать xargs
. Оба способа будут работать, но я предпочитаю использовать меньше команд, когда это возможно.
Вы можете просто добавить gzip /var/sqlbackup/sqlbackup-$date.sql
до конца вашего скрипта.
Попробуй это:
date=`date -Iminutes`
mysqldump --all-databases -pmypassword | gzip > /var/sqlbackup/sqlbackup-$date.gz
Вы когда-нибудь изучали irsync от сетей R-FX?
Отличный небольшой скрипт, который позволит вам брать горячие копии и gzip-архивы ваших баз данных и отправлять их на удаленный сервер. :)