Пошаговые руководства, шпаргалки, полезные ссылки...
БлогФорумАвторы
Полезные Online-сервисы
Перечень Бесплатного ПО
Подписка на RSS-канал
В это части мы рассмотрим пример настройки простых скриптов для выполнения регулярного резервного копирования корневых папок сайтов и баз данных MySQL на веб-сервер на стеке LEMP. За основу взят набор bash-скриптов с GitHub со своими переработками. Исходим из условия, что предварительно на нашем веб-сервере создан дополнительный выделенный диск под резервное копирование с точкой монтирования /mnt/backup
В одной из прошлых частей мы рассмотрели пример того, как сохранить в защищённом виде учётные данные для автоматического подключения к 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
Автор первичной редакции: Алексей Максимов Время публикации: 06.04.2016 14:07