[[ Скрипт архивации БД MySQL ]]

MySQL

Скрипт архивации БД 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




Обсуждение

Тавинцев Валерий, 2014/02/25 22:04

Скрипт содержит 3 ошибки: 1. Реализационная (некритично): Цикл выгрузки и упаковки дампа повторяется, Правильно будет вынести этот цикл из условия - где создается список баз данных для обработки. 2. Нет обработки ошибок (фатально): Выгрузка дампа: результат операции на деревню дедушке. Правильно будет добавить обработку ошибок. 3. Нет обработки ошибок (фатально): Упаковка дампа: результат операции на деревню дедушке. Правильно будет добавить обработку ошибок.

Kenshin, 2014/07/30 13:44

А есть исправленная версия?

Ваш комментарий. Вики-синтаксис разрешён:
31 +4 = 
 
practice/mysql/script2.txt · Последнее изменение: 2022/08/31 14:53 — 127.0.0.1
Gentoo Linux Gentoo Linux Driven by DokuWiki