Автоматическая синхронизация баз данных сайтов |
![]() |
Добавил(а) microsin |
Сценарий: два сайта с одинаковым содержимым работают на разных доменах. На одном из них работает полноценный бекап, в котором сохраняются как базы данных, так и все сопутствующие файлы. На втором хостинг дешевый, и бекапа фактически нет, либо его надо делать вручную в личном кабинете пользователя, что конечно неудобно. Поэтому возникла идея написать скрипт для синхронизации содержимого двух сайтов. Задание crontab будет запускать этот скрипт, и он будет производить следующие действия. Для упрощения сайт, на котором есть бекап, назовем Сайт A, а второй сайт, который должен синхронизироваться, назовем Сайт B. 1. Хост Сайта A с помощью sshfs [1] выполняет монтирование папки пользователя хоста Сайта B. 2. Создается дамп базы данных Сайта A в папку пользователя хоста B. 3. Происходит подключение ssh [2] к командной строке Сайта B [2], и созданный дамп базы данных заливается на Сайт B. 4. Дамп базы данных удаляется, происходит размонтирование папки пользователя Сайта B. 5. С помощью rsync [5] синхронизируются файлы сайтов. [Скрипт bash] Текст скрипта bash, который запускается на Сайте A: #!/bin/bash
# Монтирование удаленной папки домашней директории пользователя Сайта B:
echo Mount remote folder... sshfs -o password_stdin,default_permissions userSiteB@AddrSiteB.ru:/home/userSiteB \ /mnt <<< 'password_userSiteB' # Дамп базы данных MySQL сервера сразу на папку удаленного сервера:
echo Dump database... mysqldump --defaults-extra-file=~/mysqldump.config база_данных_Сайта_A > \ /mnt/dump.sql # Заливка из дампа на Сервер B:
echo Restore database... sshpass -p 'password_userSiteB' ssh -o StrictHostKeyChecking=no userSiteB@AddrSiteB.ru \ mysql --password=пароль_MySQL_B -u пользователь_MySQL_B база_данных_Сайта_B < /mnt/dump.sql # Удаление дампа базы данных:echo Remove dump
rm -f /mnt/dump.sql
# Размонтирование папки на удаленном сервере:
echo Unmount
umount /mnt
# Синхронизация файлов: sshpass -p 'password_userSiteB' rsync -t -r --exclude=configuration.php -e ssh \ /var/www/userSiteB/AddrSiteA.ru/* userSiteB@AddrSiteB.ru:/home/userSiteB/www/AddrSiteB.ru echo Done!
В этом скрипте используются следующие параметры: userSiteB логин пользователя Сайта B. AddrSiteA.ru адрес Сайта A (доменное имя или IP). AddrSiteB.ru адрес Сайта B (доменное имя или IP). /mnt системная папка Сайта A, применяемая для точек монтирования. password_userSiteB пароль пользователя Сайта B. mysqldump.config конфигурационный файл для утилиты mysqldump, где указаны логин и пароль пользователя базы данных Сайта B (см. [3]). база_данных_Сайта_A имя базы данных на Сайте A. /mnt/dump.sql файл дампа базы данных Сайта A. пароль_MySQL_B пароль пользователя MySQL на Сайте B. пользователь_MySQL_B имя пользователя MySQL на Сайте B. Замечание: файловые пути должны быть абсолютными (относительно корневого каталога /), чтобы демон cron мог нормально выполнить скрипт. Обратите внимание, что на последнем шаге в командную строку rsync добавлена опция --exclude=configuration.php, чтобы исключить конфигурационный файл Joomla. Этот файл должен отличаться для сайтов A и B. [Создание задания crontab] Запустите команду для настройки задания crontab от имени пользователя root: # crontab -u root -e
Откроется окно текстового редактора по умолчанию, где нужно в конец файла добавить строку задания: 0 1 * * * bash /root/cloneA2B.sh Задание в строке указывается в формате "минута час день_месяца месяц день_недели команда". В данном примере указаны следующие параметры задания: 0 задание запускается на нулевой минуте часа. 1 задание запускается в 1 часу ночи. * задание запустится на любом дне месяца. * задание запустится на любом месяце. * задание запустится в любой день недели. bash /root/cloneA2B.sh запускаемая команда задания. Здесь указано имя скрипта, пример которого был показан выше. Сохраните и закройте файл. Созданное задание можно посмотреть командой crontab -l (предполагается, что она выполняется от имени пользователя root): # crontab -l
# Edit this file to introduce tasks to be run by cron.
...
# m h dom mon dow command
0 1 * * * bash /root/cloneA2B.sh
[Ссылки] 1. sshfs: монтирование файловой системы удаленного сервера. |