===== Настройка веб-сервера на базе стека 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~~