Скрипт для бекапа таблиц в БД + шифрования
Oct 2, 2017 17:29 · 237 words · 2 minute read
Мы уже рассматривали примеры создания резервных копий баз данных и восстановления из них, были даже полностью готовые к употреблению скрипты.
Но как поступить, если нужна резервная копия не всей БД, а лишь одной таблицы? Давайте разберемся!
Скрипт выполняет резервное копирование БД (кроме 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