===== Настройка веб-сервера на базе стека LEMP в Ubuntu Server 14.04 LTS. Часть 12. Настройка скриптов резервного копирования сайтов и баз данных MySQL =====
В это части мы рассмотрим пример настройки простых скриптов для выполнения регулярного резервного копирования корневых папок сайтов и баз данных MySQL на [[:unix-linux:ubuntu:ubuntu-14-04-lts-trusty-tahr:how-to-install-lemp-web-server-on-ubuntu-14-04|веб-сервер на стеке LEMP]]. За основу взят [[https://gist.github.com/chrishough/4522386|набор bash-скриптов с GitHub]] со своими переработками. Исходим из условия, что предварительно на нашем веб-сервере создан [[:unix-linux:linux-cli-tools:linux-how-to-add-and-format-partition-on-new-disk-with-parted-and-add-it-to-fstab|дополнительный выделенный диск]] под резервное копирование с точкой монтирования **/mnt/backup**
\\
==== Резервное копирование баз данных MySQL ====
[[:unix-linux:ubuntu:ubuntu-14-04-lts-trusty-tahr:how-to-install-lemp-web-server-on-ubuntu-14-04:setup-mysql-for-wordpress-and-phpbb|В одной из прошлых частей]] мы рассмотрели пример того, как сохранить в защищённом виде учётные данные для автоматического подключения к **mysql** от имени **root**-пользователя, поэтому в нижеописанных примерах мы не будем в явном виде указывать эти учётные данные.
Для начала нам нужно будет освежить в памяти список баз MySQL, которые мы будем подвергать резервному копированию. Отталкиваемся от того условия, что нас интересует бэкап не всех баз, а лишь некоторых (продуктивных), так как вполне возможно, что в нашем экземпляре MySQL будет ещё и ряд тестовых баз.
Переходим в режим суперпользователя, подключаемся к MySQL и запрашиваем список всех баз:
sudo su -
mysql
mysql > show databases;
Вывод будет примерно таким:
+---------------------+
| Database |
+---------------------+
| information_schema |
| blog-db |
| forum-db |
| testsite-db |
| #mysql50#lost+found |
| lost+found |
| mysql |
| performance_schema |
+---------------------+
7 rows in set (0.00 sec)
Определившись со списком баз, которые мы будем подвергать резервному копированию, переходим к настройке.
Создаём каталог для сохранения резервных копий БД и сразу ограничиваем к нему доступ:
sudo mkdir -p /mnt/backup/daily/databases/
sudo chmod 700 /mnt/backup/daily/databases/
Создаём скрипт резервного копирования:
sudo nano /usr/local/sbin/backup-databases.sh
Наполняем его содержимым:
#!/bin/bash
#
# Verify directory structure exists prior to running this job
#
BackUpDIR="/mnt/backup/daily/databases/";
TimeStamp=$(date +"%Y.%m.%d-%H:%M:%S");
# DBs list in format "db1 db2 db3 db4"
#
DBList="blog-db forum-db";
for DB in $DBList;
do
mysqldump $DB > $BackUpDIR$DB.$TimeStamp.sql;
xz $BackUpDIR$DB.$TimeStamp.sql
done
Делаем скрипт исполняемым и ограничиваем к нему доступ:
sudo chmod 700 /usr/local/sbin/backup-databases.sh
Пробуем выполнить скрипт, запутсив его вручную от имени суперпользователя:
sudo su -
/usr/local/sbin/backup-databases.sh
Скрипт должен отработать без ошибок. После окончания его работы проверим содержимое каталога сохранения резервных копий:
sudo ls -la /mnt/backup/daily/databases/
drwx------ 2 root root 4096 Apr 4 11:32 .
drwx------ 3 root root 4096 Apr 4 11:10 ..
-rw-r--r-- 1 root root 4994140 Apr 4 11:31 blog-db.2016.04.04-11:31:37.sql.xz
-rw-r--r-- 1 root root 375700 Apr 4 11:32 forum-db.2016.04.04-11:31:37.sql.xz
Добавляем задание резервного копирования в планировщик **cron**
sudo nano /etc/cron.d/backup-databases
Содержимое файла задания на ежедневное выполнение в 00:30:
# Daily mysql databases backup
30 00 * * * root /usr/local/sbin/backup-mysql-databases.sh
\\
==== Резервное копирование файлов веб-сайтов ====
Создаём каталог для сохранения резервных копий файлов сайтов:
sudo mkdir -p /mnt/backup/daily/websites/
sudo chmod 700 /mnt/backup/daily/websites/
Создаём скрипт:
sudo nano /usr/local/sbin/backup-websites.sh
Наполняем его содержимым:
#!/bin/bash
#
# Verify directory structure exists prior to running this job
#
BackUpDIR="/mnt/backup/daily/websites/";
SrvDir="/var/www/html/";
#
# Format of SiteList="sitefolder1 sitefolder2 sitefolder3"
SiteList="root blog forum wiki";
TimeStamp=$(date +"%Y.%m.%d-%H:%M:%S");
for Site in $SiteList;
do
tar -cJf "$BackUpDIR$Site.website.$TimeStamp.tar.xz" -P $SrvDir$Site;
done
Делаем скрипт исполняемым и ограничиваем к нему доступ:
sudo chmod 700 /usr/local/sbin/backup-websites.sh
Пробуем выполнить скрипт с правами суперпользователя:
sudo su -
/usr/local/sbin/backup-websites.sh
Скрипт должен отработать без ошибок. После окончания его работы проверим содержимое каталога для сохранения резервных копий:
sudo ls -la /mnt/backup/daily/websites/
drwx------ 2 root root 4096 Apr 4 13:05 .
drwx------ 4 root root 4096 Apr 4 12:29 ..
-rw-r--r-- 1 root root 99416096 Apr 4 13:04 blog.website.2016.04.04-12:54:23.tar.xz
-rw-r--r-- 1 root root 4320420 Apr 4 13:05 forum.website.2016.04.04-12:54:23.tar.xz
-rw-r--r-- 1 root root 380 Apr 4 12:54 root.website.2016.04.04-12:54:23.tar.xz
-rw-r--r-- 1 root root 12538776 Apr 4 13:06 wiki.website.2016.04.04-12:54:23.tar.xz
Добавляем задание резервного копирования в планировщик **cron**:
sudo nano /etc/cron.d/backup-websites
Содержимое файла задания на ежедневное выполнение в 01:00:
# Daily websites root folders backup
00 01 * * * root /usr/local/sbin/backup-websites.sh
\\
==== Очистка старых резервных копий ====
Создаём скрипт очистки:
sudo nano /usr/local/sbin/backup-cleanup.sh
Наполняем скрипт содержимым:
#!/bin/bash
#
BackUpDIR="/mnt/backup/daily/";
SubDIRs="databases websites";
for SubDIR in $SubDIRs;
do
if [ $(find $BackUpDIR$SubDIR/ -name '*.xz' -mtime -6 | wc -l) -eq 0 ]; then
# no fresh backups for last 6 days
continue
else
# delete backups greater than 7 days old
find $BackUpDIR$SubDIR/ -name '*.xz' -mtime +7 -delete
fi
done
Скрипт выполняет поиск и удаление всех файлов резервных копий старше 7 дней. При этом если создание новых бэкапов перестало работать и нет файлов свежее 6 последних дней, то удаление бэкапов отменяется.
Делаем скрипт исполняемым и ограничиваем к нему доступ:
sudo chmod 700 /usr/local/sbin/backup-cleanup.sh
Пробуем выполнить скрипт с правами суперпользователя:
sudo su -
/usr/local/sbin/backup-cleanup.sh
Скрипт должен отработать без явных ошибок.
Добавляем задание резервного копирования в **cron**:
sudo nano /etc/cron.d/backup-cleanup
Содержимое файла задания на ежедневное выполнение в 02:00:
# Daily remove backups greater than 7 days old
00 02 * * * root /usr/local/sbin/backup-cleanup.sh
----
{{:user:blogroot.png?50&nolink |}} Автор первичной редакции:\\ [[user:blogroot|Алексей Максимов]] \\ Время публикации: 06.04.2016 14:07
{{tag>Linux Ubuntu "Ubuntu Server" "Ubuntu 14.04" "14.04 LTS" "web server" Backup MySQL mysqldump Cron Bash Script Cleanup}}
~~DISCUSSION~~