Более менее умный backup баз mysql

Записная книжка, блин ))

Backup баз mysql. Отдельная база в отдельную папку. Отсортированы по дате.
Файлы старше 30 дней удаляются. (не удаляются пустые папки (( )




#!/bin/bash
USERNAME="backup"     # пользователь БД
PASSWORD="password"       # пароль БД
HOSTDB="localhost"          # Хост БД
# пути к нужным сомандам. Иначе, при запуске из крона могут ненайтись
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
GZIP="$(which gzip)"
# Основная директория, где лежат бекапы
DEST="/root/backup"
# Директория для бекапа БД
BACKUPDIR="$DEST/mysql"
# Получаем текушую дату и создаем отдельные переменные для создания папок
NOW="$(date +"%Y-%m-%d")"
YEAR="$(date +"%Y")"
MONTH="$(date +"%m")"

FILE=""

DBLIST=""
# БД, которые бекапить не нужно
NOTDB="test information_schema mysql performance_schema"
[ ! -d $BACKUPDIR ] && mkdir -p $BACKUPDIR || :
# Ограничиваем доступ к бекапам только для рута
$CHOWN 0.0 -R $DEST
$CHMOD 0600 $DEST
# Получаем список всех БД
DBLIST="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')"
for db in $DBLIST
do
    skipdb=-1
    if [ "$NOTDB" != "" ];    then
        for i in $NOTDB
        do
            [ "$db" == "$i" ] && skipdb=1 || :
        done
    fi
    if [ "$skipdb" == "-1" ] ; then
        [ ! -d $BACKUPDIR/$db ] && mkdir -p $BACKUPDIR/$db || :
        [ ! -d $BACKUPDIR/$db/$YEAR ] && mkdir -p $BACKUPDIR/$db/$YEAR || :
        [ ! -d $BACKUPDIR/$db/$YEAR/$MONTH ] && mkdir -p $BACKUPDIR/$db/$YEAR/$MONTH || :
        FILE="$BACKUPDIR/$db/$YEAR/$MONTH/$NOW.$db.sql.gz"
        # запускаем mysqldump на нужную базу и тут же натравливаем на выход gzip
        $MYSQLDUMP -u $USERNAME -h $HOSTDB -p$PASSWORD $db | $GZIP -9 > $FILE
    fi
done
#рекурсивно очищаем папку бекапов от файлов старше 30 дней.
find $BACKUPDIR/ -mtime +30 -type f -exec rm -f {} \;


Ну, и чуть не забыл. Для этого нам нужен пользователь MySQL, который умеет SELECT, LOCK TABLES, RELOAD и SHOW DATABASES на все базы.
Из консоли его можно сделать так:
GRANT SHOW DATABASES, SELECT, LOCK TABLES, RELOAD ON *.* to 'backup'@'localhost' identified by 'password';


Комментарии

Популярные сообщения из этого блога

Shit Happens!!!

Мифология и Фольклор

Готический фетиш и BDSM