Назад | Перейти на главную страницу

Резервное копирование базы данных MySQL и gzip

Я пытаюсь получить немного больше пользы от своих резервных копий 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-архивы ваших баз данных и отправлять их на удаленный сервер. :)