Ниже приведено быстрое и грязное решение для сохранения базы данных, синхронизированной с помощью главной копии OVS, что вы можете настроить за 30 минут на существующие базы данных.
Это гораздо более легкая установка (но неуверенность), чем Правильная репликация MySQL в реальном времени Один Отказ Кроме того, у вас есть полный контроль над синхронизацией синхронизации, поскольку вы можете использовать Cronjob для инициирования процесса синхронизации.
Ниже MySQL
и mysqldump
Команды оптимизированы, чтобы работать с экземплярами MySQL, работающим внутри контейнера Docker.
Создать файл с именем make-snapshots.sh
С подведением ниже контента на вашем главном сервере, а затем сделать его исполняемым с помощью chmod + x ./make-snapshots.sh
Отказ
#!/bin/bash export MYSQL_PWD=PasswordMaster1 # Read the last snapshotted ID source last_tablename_id # Remove the old snapshot rm dump_tablename.sql # Write snapshot mysqldump --protocol=TCP --ssl-mode=DISABLED -u username -t --where "id > $LAST_TABLENAME_ID" dbname tablename > dump_tablename.sql # Remove the last snapshot rm last_tablename_id # Extract and write last ID echo "export LAST_TABLENAME_ID=`grep -oP "\),\((\d+)" dump_tablename.sql | tac | head -1 | cut -b 4-`" > last_tablename_id
Перед запуском вашего первого моментального снимка Создать last_tablename_id
С ниже:
export LAST_TABLENAME_ID=0
Это гарантирует, что первый снимок будет содержать все существующие данные, то есть как mysqldump
SQL будет равен КУДА ID> 0
Отказ
Как работает битовая снимка
Благодаря --Дж
Параметр передан на mysqldump
который говорит о резервном копировании всех рядов в таблице, отвечающую критериям.
После каждого mysqldump
Резервное копирование Наш сценарий проверяет, какой был последний экспортированный идентификатор из таблицы, который затем сохраняется в last_tablename_id
файл. Каждая последующая прогона будет прочитать этот номер и включать только строки, которые еще не были экспортированы.
GreeP -OP "\), \ ((\ d +)
ищут вхождения ), (123
строка внутри дампа. Тогда TAC
Является ли изменение вывода GreeP, голова -1
принимает только первую строку и вырезать
Удаление запуска ), (
персонажи, оставляющие количество первого столбца ( который предполагается, что ID
— Первичный ключ ).
Крепко
Добавьте ежедневное создание монимка в 2:00 на работу Crontab -e
и добавление подряд ниже в вашем Crontab.
0 2 * * * cd ~/master && ./make-snapshots.sh
На вашем рабском сервере, то есть тот, который вытащит новейшие данные из основной базы данных, создать файл с именем pull-snapshots.sh
и сделать его исполняемым с помощью chmod + x
Отказ
#!/bin/bash export MYSQL_PWD=PasswordSlave1 # Remove last snapshot rm dump_tablename.sql # Pull a snapshot from the master server scp username@99.0.0.1:~/master/dump_tablename.sql . mysql --protocol=TCP --ssl-mode=DISABLED -u username dbname < dump_tablename.sql
Для SCP
Для запуска без запроса пароля вам нужно Настройка на основе ключей аутентификация между двумя серверами.
Крепко
Добавьте ниже строку в ваш Crontab, поэтому он работает через 30 минут, чем у магистра, например, e.g. в 2:30.
30 2 * * * cd ~/your/script/path && ./pull-snapshots.sh
Вуаля! Ваша база данных теперь синхронизируется с мастером!
- Не полагайтесь на
Греп
Как будто не было никаких новых записей в базе данных, тоlast_tablename_id
будет отсутствовать удостоверение личности, напримерLast_tablename_id =
. Лучше полагаться наMySQL
Запрос непосредственно перед запускомmysqldump
Отказ - Создайте специальный пользователь в DB раб, который только для выполнения
Вставить
В вашей базе данных на случай, если ваш главный сервер скомпрометируется, и кто-то вводил вредный SQL вДамп _ *. SQL
файлы. Вы не хотите бегатьDrop Database
, так далее. - Проверьте наличие ошибок в MySQL Dump и не перезаписывайте
last_tablename_id
Файл, если произошла ошибка (чтобы сохранить последний успешный экспортированный ID) - Если вам нужно что-нибудь более, просто используйте надлежащая настройка репликации
Оригинал: «https://dev.to/limal/mysql-replication-over-ssh-3ak5»