Скрипт создает бэкап всех баз данных MySQL за исключением указанных баз и таблиц.
На выходе получаем дампы сжатые gz и именуемые по названию базы и дате создания бэкапа.
Бэкапы каждой базы в отдельной папке.
/BackUp Base1 db-base1-2016-12-25-18-00.sql.gz Base2 db-base2-2016-12-25-18-00.sql.gz
Старые бэкапы (старше 10-ти дней) автоматически удаляются.
#!/bin/bash# Cкрипт позволяет делать бэкап MySQL баз с исключением баз и таблиц, # бэкап которых делать не требуется. # Бэкапы старше 10-ти дней автоматически удаляются.# Папка в которой будет храниться бэкапBKP_DIR="$HOME/Backup/DB"# Настройки MysqlMYSQL_USER="root"MYSQL_PASSWORD=# Базы, которые будут проигнорированы при бэкапеSKIP_DB=( "sys" "mysql" "phpmyadmin" "information_schema" "performance_schema" )# Таблицы которые будут проигнорированы при бэкапеEXCLUDED_TABLES=( "cache" "xmlsitemap" "sessions" "history" "wathdog")# Формат даты и времениDATE=`date "+%Y-%m-%d"`TIME=`date "+%H-%M"`# Получаем список всех базDBS="$(mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} -Bse 'show databases')"# Функция, для проверки на вхождение записи в массивеin_array() { haystack=("$@") needle=$1 unset haystack[0] for i in "${haystack[@]}"; do if [ "$needle" == "$i" ]; then return 1 fi done return 0}for DB in $DBS; do # Проверяем, есть ли текущая база в списке игнорируемых in_array $DB "${SKIP_DB[@]}" # если нет if [ "$?" == 0 ]; then # Cоздаём путь до папки с бэкапом mkdir -p ${BKP_DIR}/${DB} cd ${BKP_DIR}/${DB} # Формируем строку для исключенных таблиц IGNORED_TABLES_STRING='' for TABLE in "${EXCLUDED_TABLES[@]}" do : IGNORED_TABLES_STRING+=" --ignore-table=${DB}.${TABLE}" done # Проверяем, восстанавливаем и оптимизируем таблицы в базе # Процедура достаточно долгая и ресурсоёмкая. Можно отключить без последствий для бэкапа. # mysqlcheck -u${MYSQL_USER} -p${MYSQL_PASSWORD} --auto-repair --optimize ${DB} # Делаем структуру базы данных без самих данных mysqldump -u${MYSQL_USER} -p${MYSQL_PASSWORD} --no-data ${DB} > db-${DB}-${DATE}-${TIME}.sql # Делаем дамп базы данных с исключенными таблицами и дописываем в конец уже созданного бэкапа mysqldump -u${MYSQL_USER} -p${MYSQL_PASSWORD} $DB ${IGNORED_TABLES_STRING} >> db-${DB}-${DATE}-${TIME}.sql # Cжимаем GZIP'ом на максимальном сжатии gzip -N9 db-$DB-$DATE-$TIME.sql # Удаляем старые бэкапы, которым больше 10 дней find $BKP_DIR/$DB/* -mtime +10 -exec rm -rf {} \; fidoneexit 0;
Для автоматизации запуска можно добавить скрипт в cron c запуском в нужное время. На пример, для запуска ежедневно в 3 часа 0 минут:
sudo crontab -e
И добавляем:
0 3 * * * /usr/local/bin/mysql_backup.sh
Не забыв при этом сохранить скрипт по адресу /usr/local/bin/mysql_backup.sh и сделав его выполняемым sudo chmod +x /usr/local/bin/mysql_backup.sh
sudo chmod +x /usr/local/bin/mysql_backup.sh