Скрипт для бекапа таблиц в БД + шифрования

Oct 2, 2017 17:29 · 237 words · 2 minute read mysql backup

Мы уже рассматривали примеры создания резервных копий баз данных и восстановления из них, были даже полностью готовые к употреблению скрипты.

Но как поступить, если нужна резервная копия не всей БД, а лишь одной таблицы? Давайте разберемся!

Скрипт выполняет резервное копирование БД (кроме test | information_schema | performance_schema) и отдельных таблиц в этих БД с помощью утилиты mysqldump. Дамп таблиц сжимается сначала в .gz, потом в .bz2 (при этом архив .gz удаляется). Созданный архив .bz2 шифруется с помощью openssl с последующим удалением незашифрованного архива. Хранится 5 резервных копий, более старые — удаляются.

#!/bin/bash
 
date=`date +%Y-%m-%d`
MYSQL=/usr/bin/mysql
DUMP=/usr/bin/mysqldump
DUMPOPTIONS="-ceqQ --single-transaction --add-drop-table --allow-keywords --events"
ACCOUNT="--defaults-file=/root/.my.cnf" # данные для подключения к MySQL
PASS=`cat /root/bin/.pass` # пароль для шифрования архива
BKPDIR="/var/backup/sync/mysql/"
DBASES_DIR="$BKPDIR/$date/db"
TABLES_DIR="$BKPDIR/$date/tables"
DATABASES=`$MYSQL $ACCOUNT -Bse 'show databases'|grep -vP 'information_schema|performance_schema'`
mkdir -p $DBASES_DIR
for i in $DATABASES; do
    if [ "$i" = "test" ];
    then
        continue
    fi
    echo $DATABASES:;
    [ ! -d $TABLES_DIR/$i ] && mkdir -p $TABLES_DIR/$i
    schem="\`$i\`"
    TABLES=`$MYSQL $ACCOUNT -Bse "show tables from $schem"`
    for j in $TABLES;do
        echo $i ___ $j ;
        $DUMP $ACCOUNT $DUMPOPTIONS $i $j | gzip -1 > $TABLES_DIR/$i/$j.sql.gz
        zcat $TABLES_DIR/$i/$j.sql.gz | bzip2 -c | tee -a $DBASES_DIR/$i.sql.bz2 > $TABLES_DIR/$i/$j.sql.bz2 && rm -f $TABLES_DIR/$i/$j.sql.gz
        openssl enc -aes-256-cbc -salt -pass pass:$PASS -in $TABLES_DIR/$i/$j.sql.bz2 -out $TABLES_DIR/$i/$j.sql.bz2.enc
        rm -f $TABLES_DIR/$i/$j.sql.bz2
    done
done
  
arh=5
for cusr in `ls $BKPDIR --full-time -t | awk '{print $9}'`;
    do
    if (("$arh" < 1))
    then
        `rm -fr $BKPDIR/$cusr`
    fi
    let "arh -= 1"
done
tweet Share