Реализация автоматического резервного копирования базы данных и сайта средствами bash.
Перед каждым администратором сайта, встаёт вопрос реализации резервного копирования базы данных сайта и программного кода сайта, в данной статье, я предложу своё видение данной задачи на примере.
Предположившим у нас есть сайт и база данных, необходимо создать скрипт резервного копирования и добавить скрипт в планировщик заданий cron.
Дано:
Веб-сервер на базе Apache2 PHP MySQL
Структура каталогов системы:
1 2 3 4 5 6 7 8 9 |
user@server:~# df -h Файл.система Размер Использовано Дост Использовано% Cмонтировано в /dev/sda1 4,7G 2,2G 2,3G 50% / udev 2,0G 4,0K 2,0G 1% /dev tmpfs 396M 252K 396M 1% /run none 5,0M 0 5,0M 0% /run/lock none 2,0G 0 2,0G 0% /run/shm /dev/sda_boot 268M 58M 191M 24% /boot /dev/sda2 37G 319M 35G 1% /home |
Задача:
Ежедневное резервное копирование сайта на PHP и базы данных MySQL
Реализация резервного копирования
Сайт находится в каталоге /home, который смонтирован на отдельном разделе
1 2 |
user@server:~# df -h | grep home /dev/sda2 37G 319M 35G 1% /home |
В каталоге /home создан подкаталог data в котором находятся:
Каталог резервного копирования /home/data/backup
Каталог с файлами сайта /home/data/www
Папка скриптов автоматизации /home/data/sheduler
В папке скриптов автоматизации создадим два каталога: eventtask и shell, в каталоге shell создаём скрипт резервного копирования базы данных
Скрипт резервного копирования базы данных MySQL
1 2 3 |
user@server:/home/data/sheduler/shell # sudo touch database_backup.sh # Теперь сделать его исполняемым user@server:/home/data/sheduler/shell # sudo chmod +x database_backup.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# После создания файла скрипта, можно переходить к его редактированию: user@server:/home/data/sheduler/shell # sudo nano database_backup.sh #!/bin/bash # Script for create database dump # Autor: Sobol Denis 2014.10.09 # Copyright Sobol Denis 2014 snakesclub@yandex.ru # *********************************************** # Variables user="root" // -- пользователь базы данных pass="Password" // -- пароль базы данных db_1="database1" // -- название базы данных для копирования db_2="database2" // -- название базы данных для копирования db_3="database3" // -- название базы данных для копирования db_4="database4" // -- название базы данных для копирования db_5="database5" // -- название базы данных для копирования shost="localhost" // -- адрес хоста, в данном случае localhost backupdir="/home/data/backup/database" // -- каталог для хранения резервных копий datetime=$(date +"%Y.%m.%d-%H:%M") // -- дата и время в формате ГГГГ.ММ.ДД-ЧЧ:ММ // -- пример 2016.05.10-16:15 // -- будет использоваться для имени файла резервной копии DATE=`date +'%Y.%m.%d'` // -- дата и время в формате ГГГГ.ММ.ДД // -- пример 2016.05.10, будет использоваться для имени папки DUMPDIR="$backupdir/$DATE" // -- каталог создаваемой резервной копии // -- пример, /home/data/backup/database/2016.05.10 OLD_TIME="9" // -- "глубина" резервных копий (сколько дней хранить) # Функция создания резервной копии function backup() { if ! [ -d "$DUMPDIR" ]; then mkdir -p $DUMPDIR fi for i in $db_1 $db_2 $db_3 $db_4 $db_5 do mysqldump -u "$user" --password="$pass" "$i" | gzip > $DUMPDIR'/'$datetime'_'$i.tar.gz done } # Функция очистки старых резервных копий function clear_old() { for OLD in $(find $backupdir -type d -mtime $OLD_TIME) do rm -rf $OLD done } backup clear_old |
Скрипт резервного копирования файлов сайта
1 2 3 |
user@server:/home/data/sheduler/shell # sudo touch application_backup.sh # Теперь сделать его исполняемым user@server:/home/data/sheduler/shell # sudo chmod +x application_backup.sh |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# После создания файла скрипта, можно переходить к его редактированию: user@server:/home/data/sheduler/shell # sudo nano application_backup.sh #!/bin/bash # Script for create application backup # Autor: Sobol Denis 2014.10.09 # Copyright Sobol Denis 2014 snakesclub@yandex.ru # *********************************************** # Variables backupdir="/home/data/backup/www" // -- каталог для хранения резервных копий datetime=$(date +"%Y.%m.%d-%H:%M") // -- дата и время в формате ГГГГ.ММ.ДД-ЧЧ:ММ // -- пример 2016.05.10-16:15 // -- будет использоваться для имени файла резервной копии DATE=`date +'%Y.%m.%d'` // -- дата и время в формате ГГГГ.ММ.ДД datadir="/home/data/www" DUMPDIR="$backupdir/$DATE"// -- каталог создаваемой резервной копии // -- пример, /home/data/backup/www/2016.05.10 OLD_TIME="9" // -- "глубина" резервных копий (сколько дней хранить) # Функция создания резервной копии function backup() { if ! [ -d "$DUMPDIR" ]; then mkdir -p $DUMPDIR fi tar -zcf $DUMPDIR'/'$datetime.tar.gz $datadir/* } # Функция очистки старых резервных копий function clear_old() { for OLD in $(find $backupdir -type d -mtime $OLD_TIME) do rm -rf $OLD done } backup clear_old |
Скрипт планировщика заданий cron
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# Теперь в /home/data/sheduler создаём файл расписаний заданий планировщика cron user@server:/home/data/sheduler/eventtask # sudo touch taskmanager # В который впишем созданные нами скрипты user@server:/home/data/sheduler/eventtask # sudo nano taskmanager SHELL=/bin/bash MAILTO=root # System # Update cron */15 * * * * /home/data/sheduler/shell/autoupdate_crontab.sh # Backup # Backup database 30 5 * * * /home/data/sheduler/shell/database_backup.sh # Backup application 40 5 * * * /home/data/sheduler/shell/application_backup.sh |
Теперь создадим скрипт планировщика заданий cron, который будет автоматически обновлять задания планировщика
1 2 3 |
user@server:/home/data/sheduler/shell # sudo touch autoupdate_crontab.sh # Теперь сделать его исполняемым user@server:/home/data/sheduler/shell # sudo chmod +x application_backup.sh |
1 2 3 4 5 6 7 |
# После создания файла скрипта, можно переходить к его редактированию: user@server:/home/data/sheduler/shell # sudo nano autoupdate_crontab.sh #!/bin/sh # Script for update crontab # Autor: Sobol Denis 2014.10.09 # Copyright Sobol Denis 2014 crontab /home/data/sheduler/eventtask/taskmanager |
После этого всего, мы настроили автоматическое резервное копирование базы данных и файлов сайта ежедневно в 05:30 и 05:40 часов соответственно.