Администрирование FreeBSD, Linux, ... Автоматическая синхронизация баз данных сайтов Mon, February 26 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Автоматическая синхронизация баз данных сайтов Печать
Добавил(а) 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

[Ссылки]

1sshfs: монтирование файловой системы удаленного сервера.
2. ssh: как выполнять команды на удаленном сервере.
3MySQL - как делать backup.
4. CRONTAB - ФОРМАТ ЗАПИСИ СОБЫТИЙ site:pai-bx.com.
5rsync: синтаксис, примеры использования.
6. How to pass password automatically for rsync SSH command? site:stackoverflow.com.

 

Добавить комментарий


Защитный код
Обновить

Top of Page