Резервное копирование mysql

Опубликовано beregov.a.e - чт, 11/15/2018 - 21:41

Резервное копирование mysql

Предлагаю вашему вниманию скрипт на bash для резервного копирования баз данных mysql. Скрипт написан для freebsd. Для linux необходимо переписать места где формируются  переменные deys months years. Будет ниже

Немного истории происхождения и почему так реализовано.

Перед запуском процедуры резервного копирования обязательно проверяем дату текущего года. Так как однажды после остановке сервера и его технического обслуживания(продувка от пыли, замена термопасты, замена батарейки). Время сбилось. И сработало задание в cron. Что привело к тому что все резервные копии были удалены. После чего время синхронизировалось. И пришлось долго выяснять из-за чего архивы были удалены, и когда время синхронизировалось то и сделанный бэкап был удалён. К счастью тогда восстановление бэкапов не потребовалось.

#!/usr/local/bin/bash

year=`date +%Y` # Текущий год

deys=`for (( i=0; i<=31 ; i++ )) ; do date -v-${i}d +%Y-%m-%d ; done` # Количество дней

months=`for (( i=0; i<=12 ; i++ )) ; do date -v-${i}m +%Y-%m-01 ; done` #Месяцев

years=`for (( i=0; i<=12 ; i++ )) ; do date -v-${i}y +%Y-01-01 ; done` #Годов

save_db=`echo ${deys} ${months} ${years} | sed 's![ \t]!\\\|!g'` # создаём строку с исключениями которые не удаляем

databases=(database1 database2 database3 database4) #

TMP_SQL=/tmp/ #

BACKUPDIR=/var/db/backup/ #

backup () {

for db in "${databases[@]}"

do

FILE=${TMP_SQL}`date "+%Y-%m-%d"`_${db} # Имя для резервной копии

mysqldump --routines --single-transaction --no-autocommit ${db} -uroot > ${FILE}.sql # выгрузка дампа базы

xz -9 ${FILE}.sql # архивация xz архивом

mv ${FILE}.sql.xz ${BACKUPDIR} # переносим архивную копию в директорию где хоронятся бэкапы

done

find ${BACKUPDIR} -type f | grep -v ${save_db} | xargs rm -f # Удаляем старые резервные копии согласно настроек

}

if [ $year -ge 2018 ]; # Проверяем какой сегодня год. Если больше 2018 или равно то выполняем создание резервной копии базы

then

backup

fi

 

База размером в 6 Гигобайт архивировалась около часа при этом в раза в два архив меньше занимает места если архивировать gzip. При этом gzip при максимальном сжатии в раза четыре жмёт быстрее чем xz. Так что выбор исходя из ваших потребностей.

Для linux

days=`for (( i=0; i<=31 ; i++ )) ; do date --date="${i} day ago" +"%F" ; done`

months=`for (( i=0; i<=12 ; i++ )) ; do date --date="${i} month ago" +"%Y-%m-01" ; done`

years=`for (( i=0; i<=12 ; i++ )) ; do date --date="${i} year ago" +"%Y-01-01" ; done`

 

Теги