Скрипт архивации БД MySQL
Скрипт автоматической архивации БД MySQL
Использование
Запись в crontab
30 1 * * * root ( /root/backup-mysql >> /home/backup/backup.log 2>&1 )Запускает в 01:30 и ведет лог сообщений в файл /home/backup/backup.log
В скрипте меняем основные параметры:
- BACKUPDIR : директория где будут размещаться файлы
- MAXNUMBER : количество хранимых файлов бекапа для каждой БД. Подробнее
- HOST : адрес БД
- USER : пользователь
- PASS : пароль
- DBLIST : перечень имен БД, если значение не задано, то будут архивироваться все найденные БД, доступные пользователю $USER
- DBEXCLUDE : перечень имен БД, которые будут пропущены
Бампы сохраняются в файлы с именами формата $DBNAME.$NOWDATE.sql.bz2
mail.20090101.sql.bz2
Листинг
#!/bin/bash # Скрипт создания архивированного дампа БД MySQL # !!! Директории слешами НЕ закрывать !!! BACKUPDIR=/home/backup/mysql # Максимально число хранимых архивов MAXNUMBER=7 # Настройка подключения HOST="localhost" USER="user" PASS="mysqlpassword" # Перечень БД # DBLIST="db1 db2"; DBLIST="" все найденные DBLIST="" # Список исключенных БД (при DBLIST="") DBEXCLUDE="information_schema" NOWTIME=`date '+%Y-%m-%d %H:%M'` NOWDATE=`date '+%Y%m%d'` DOTNAME="\.sql\.bz2" # Сообщение по завершению выполнения function end_msg() { echo "========== `date '+%Y-%m-%d %H:%M'` END backup-mysql ==========" echo "" } echo "========== `date '+%Y-%m-%d %H:%M'` START backup-mysql ==========" if [ ! -d "$BACKUPDIR" ]; then echo "Директория не верна" end_msg exit 0 fi if [ -z "$DBLIST" ]; then ################## Архивация всех БД ###################### # Получение массива имен БД DBLIST=`mysql --user=$USER --password=$PASS --host=$HOST --batch --skip-column-names -e "show databases"` # Исключение имен БД for DBNAME in $DBEXCLUDE; do DBLIST=`echo "$DBLIST" | sed "/^$DBNAME\$/d"` done # Выполнение дампа for DBNAME in $DBLIST; do echo "$DBNAME" /usr/bin/mysqldump --routines --triggers --opt --user=$USER --password=$PASS --host=$HOST $DBNAME > $BACKUPDIR/$DBNAME.$NOWDATE.sql -C bzip2 -f $BACKUPDIR/$DBNAME.$NOWDATE.sql done ############################################################ else ################## Архивация из списка БД ################## # Выполнение дампа for DBNAME in $DBLIST; do echo "$DBNAME" /usr/bin/mysqldump --routines --triggers --opt --user=$USER --password=$PASS --host=$HOST $DBNAME > $BACKUPDIR/$DBNAME.$NOWDATE.sql -C bzip2 -f $BACKUPDIR/$DBNAME.$NOWDATE.sql done ############################################################ fi ####### Контроль количества файлов ############## FILELIST=`ls $BACKUPDIR | sed -e '/[0-9]\{8\}'$DOTNAME'$/!d'` FILENAMES=`echo "$FILELIST" | sed -e 's/\(^.*\)\([0-9]\{8\}'$DOTNAME'$\).*/\1/g' | sort -u` for CURRENT in $FILENAMES; do # Получение списка дат для текущего архива на удаление TEMP1=`echo "$FILELIST" | sed -e '/\(^'$CURRENT'\)\([0-9]\{8\}\)\('$DOTNAME'$\)/!d' -e 's/\(^'$CURRENT'\)\([0-9]\{8\}\)\('$DOTNAME'$\)/\2/g' | sort -rn` TEMP1=`echo "$TEMP1" | sed -e '1,'$MAXNUMBER'd'` #Склеивание for TEMP2 in $TEMP1; do DELETELIST=`echo $CURRENT$TEMP2${DOTNAME//\\\/} && echo "$DELETELIST"` done DELETELIST=`echo "$DELETELIST" | sed -e '/^$/d'` done if [ -n "$DELETELIST" ]; then echo "========== Файлы будут удалены ==========" echo "$DELETELIST" fi for CURRENT in $DELETELIST; do rm $BACKUPDIR/$CURRENT done end_msg exit 0
Обсуждение
Скрипт содержит 3 ошибки: 1. Реализационная (некритично): Цикл выгрузки и упаковки дампа повторяется, Правильно будет вынести этот цикл из условия - где создается список баз данных для обработки. 2. Нет обработки ошибок (фатально): Выгрузка дампа: результат операции на деревню дедушке. Правильно будет добавить обработку ошибок. 3. Нет обработки ошибок (фатально): Упаковка дампа: результат операции на деревню дедушке. Правильно будет добавить обработку ошибок.
А есть исправленная версия?