[Требует обновления] Резервное копирование баз MySQL

Рано или поздно встает вопрос создания резервных копии баз MySQL. Если используются только таблицы MyISAM, то можно просто копировать раз в день файлы директории /var/lib/mysql/. При использовании InnoDB простого копирования не достаточно, так как часть данных хранится в бинарных логах и восстановить одну базу без лишних манипуляций тяжело.
Ниже предоставлен скрипт который можно использовать для создания дампов баз данных по расписанию. Он создает дампы всех доступных пользователю баз и автоматически удаляет их по истечению 14 дней. Скрипт простой, с комментариями, поэтому его можно легко модифицировать под ваши нужды.

MyUSER="mysql_user" # USERNAME
MyPASS="password" # PASSWORD
#for ISPmanager
#MyPASS=`cat /usr/local/ispmgr/etc/ispmgr.conf | grep Password | awk '{print $2}' | head -n1`
#Plesk
#MyPASS=`cat /etc/psa/.psa.shadow`
MyHOST="localhost" # Hostname
# Linux bin paths, change this if it can not be autodetected via which command
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"

# Backup Dest directory, change this if you have someother location
DEST="/backup"
# Main directory where backup will be stored
MBD="$DEST/mysql"
###################################
#delete old_backup 14 day
find $MDB -mtime +14 | xargs rm -rf
##############################################
# Get data in yyyy-mm-dd format
NOW="$(date +"%Y-%m-%d")"
# Main directory where backup will be stored
MBD="$DEST/mysql/$NOW"

# File to store current backup file
FILE=""
# Store list of databases
DBS=""

# DO NOT BACKUP these databases
IGGY="information_schema"
[ ! -d $MBD ] && mkdir -p $MBD || :
# Only owner can access it!
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST
# Get all database list first
DBS="$($MYSQL -u $MyUSER -p$MyPASS -Bse 'show databases')"
REPORTFILE="$MBD/dump.log"
echo "================= START DB backup ==================" >> $REPORTFILE
for db in $DBS
do
skipdb=-1
if [ "$IGGY" != "" ];
then
for i in $IGGY
do
[ "$db" == "$i" ] && skipdb=1 || :
done
fi

if [ "$skipdb" == "-1" ] ; then
FILE="$MBD/$db.sql.gz"
# do all inone job in pipe,
# connect to mysql using mysqldump for select mysql database
# and pipe it out to gz file in backup dir :)
$MYSQLDUMP -u $MyUSER -p$MyPASS --opt $db | $GZIP -9 > $FILE
echo "$(date +"%X") $db dumped" >> $REPORTFILE
fi
done
echo "================= END DB backup ===================="

Добавляем задание в планировщик:

* 03 * * * /backup/mysqlbackup.sh

необходимо запускать его во время того как сервер минимально нагружен (лучше рано утром).
Так же не забываем сделать его исполняемым:

chmod +x /backup/mysqlbackup.sh
Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий