Вики IT-KB

Пошаговые руководства, шпаргалки, полезные ссылки...

Инструменты пользователя

Инструменты сайта


unix-linux:ubuntu:ubuntu-14-04-lts-trusty-tahr:how-to-install-lemp-web-server-on-ubuntu-14-04:setup-daily-backup-scripts-for-mysql-databases-and-wordpress-phpbb-dokuwiki-sites

Настройка веб-сервера на базе стека LEMP в Ubuntu Server 14.04 LTS. Часть 12. Настройка скриптов резервного копирования сайтов и баз данных MySQL

В это части мы рассмотрим пример настройки простых скриптов для выполнения регулярного резервного копирования корневых папок сайтов и баз данных MySQL на веб-сервер на стеке LEMP. За основу взят набор bash-скриптов с GitHub со своими переработками. Исходим из условия, что предварительно на нашем веб-сервере создан дополнительный выделенный диск под резервное копирование с точкой монтирования /mnt/backup


Резервное копирование баз данных MySQL

В одной из прошлых частей мы рассмотрели пример того, как сохранить в защищённом виде учётные данные для автоматического подключения к 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

Наполняем его содержимым:

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:

backup-databases
# 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

Наполняем его содержимым:

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:

backup-websites
# Daily websites root folders backup 
00 01 * * *	root /usr/local/sbin/backup-websites.sh


Очистка старых резервных копий

Создаём скрипт очистки:

sudo nano /usr/local/sbin/backup-cleanup.sh

Наполняем скрипт содержимым:

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:

backup-cleanup.sh
# Daily remove backups greater than 7 days old 
00 02 * * * root /usr/local/sbin/backup-cleanup.sh

Автор первичной редакции:
Алексей Максимов
Время публикации: 06.04.2016 14:07

Обсуждение

АндрейАндрей, 16.10.2017 18:21
Годные скрипты, спасибо.

Только нужно добавить, что необходимо использовать файл

.my.conf в домашнем каталоге, иначе список баз и соответственно их бэкап не проходит
Алексей МаксимовАлексей Максимов, 16.10.2017 18:57
Спасибо за Ваш отзыв, Андрей. Отсылка на информацию про подключение к mysql есть в начале статьи. Там то всё и описано.
Ваш комментарий:
 

unix-linux/ubuntu/ubuntu-14-04-lts-trusty-tahr/how-to-install-lemp-web-server-on-ubuntu-14-04/setup-daily-backup-scripts-for-mysql-databases-and-wordpress-phpbb-dokuwiki-sites.txt · Последние изменения: 06.04.2016 16:07 — Алексей Максимов