Всегда когда возникала необходимость делать резервные копии баз MySQL, приходилось заниматься долгой гуглежкой, из несколькоких предложеных решений собирать одно свое собственное.
Наконец я собрад наиболее приемлимый для себя вариант, позволяющий копировать одновременно несколько баз, с упаковкой в один архив.
Собственно код:
#!/bin/sh -e BACKUPDIR='/mnt/backupstor/mysql' BACKUPCOUNT=7 # Kodi SQL backup NOW=$(date "+%Y-%m-%d %H:%M:%S"); echo $NOW 'Kodi database backup started' mysqldump -i -uroot MyMusic72 > $BACKUPDIR/kodi-music.sql mysqldump -i -uroot MyVideos116 > $BACKUPDIR/kodi-video.sql NOW=$(date "+%Y-%m-%d %H:%M:%S"); echo $NOW 'Kodi database backup ended' # Web SQL backup NOW=$(date "+%Y-%m-%d %H:%M:%S"); echo $NOW 'Web database backup started' mysqldump -i -uroot kosmuxa_ru > $BACKUPDIR/site.sql mysqldump -i -uroot cloud_kosmuxa_ru > $BACKUPDIR/cloud.sql NOW=$(date "+%Y-%m-%d %H:%M:%S"); echo $NOW 'Web database backup ended' # Archiving dumps NOW=$(date "+%Y-%m-%d %H:%M:%S"); echo $NOW 'Archiving dupms...' gzip -c $BACKUPDIR/*.sql > $BACKUPDIR/backup-`date "+%Y-%m-%d"`.gz COUNT=`ls -l $BACKUPDIR | grep .sql | wc | awk '{print $1}'` if [ $COUNT -gt $BACKUPCOUNT ]; then NOW=$(date "+%Y-%m-%d %H:%M:%S"); echo $NOW 'Archives rotated' find $BACKUPDIR -type f -mtime +$BACKUPCOUNT -print0 | xargs -0 rm -f fi rm -f $BACKUPDIR/*.sql exit 0
Скрипт реальный и действующий. Итак, по строкам:
- первые две строчки — настройки нашего скрипта, в переменных задаем каталог куда буду сохраняться резервные копии и количество хранимых копий;
- все строки с
echo
нужны для логгирования скрипта; - строки начинающиес с
mysqldump
— собственно процесс копирования базы данных в скрипт sql; - далее с помощью gzip сжимаем наши скрипты в один архив с датой в имени;
- в условии проверяем, что мы достигли хранимого количества архивов и устаревшие удаляем;
- и, напоследок, удаляем нежатые скрипты sql;
Вот и все думаю получился лаконичный и масштабируемый скрипт, осталось его поставить в cron от root.