Поиск…


замечания

Репликация используется для копирования данных [Backup] с одного сервера базы данных MySQL на один или несколько серверов баз данных MySQL.

Мастер - сервер базы данных MySQL, который служит для копирования данных

Slave - сервер базы данных MySQL, копирует данные, которые обслуживает Master

С MySQL репликация по умолчанию асинхронна. Это означает, что ведомые устройства не должны постоянно подключаться для получения обновлений от ведущего устройства. Например, если ваше подчиненное устройство выключено или не подключено к ведущему устройству, и вы переключите подчиненное устройство или подключитесь к мастеру позднее, то он автоматически синхронизируется с Мастером.

В зависимости от конфигурации вы можете реплицировать все базы данных, выбранные базы данных или даже выбранные таблицы в базе данных.

Форматы репликации

Существует два основных типа форматов репликации

Репликация на основе отчетов (SBR) - которая реплицирует все SQL-запросы. В этом случае мастер записывает операторы SQL в двоичный журнал. Репликация ведущего на ведомое устройство выполняется путем выполнения этих операторов SQL на ведомом.

Репликация на основе строк (RBR) - которая реплицирует только измененные строки. В этом случае мастер записывает события в двоичный журнал, который указывает, как изменяются отдельные строки таблицы. Репликация ведущего на ведомое устройство выполняется путем копирования событий, представляющих изменения в строках таблицы, на ведомое устройство.

Вы также можете использовать третью разновидность, смешанную репликацию (MBR) . В этом случае используются как ведение журнала на основе инструкций, так и строк. Журнал будет создан в зависимости от того, что наиболее подходит для изменения.

Формат, основанный на утверждениях, был по умолчанию в версиях MySQL старше 5.7.7. В MySQL 5.7.7 и более поздних версиях по умолчанию используется формат на основе строк.

Мастер-подчиненная настройка репликации

Рассмотрим 2 сервера MySQL для настройки репликации, один - Мастер, а другой - подчиненный.

Мы собираемся настроить Учителя, чтобы он хранил журнал всех действий, выполненных на нем. Мы собираемся настроить Slave-сервер, чтобы он смотрел на журнал в Master и всякий раз, когда происходят изменения в журнале на Master, он должен делать то же самое.

Конфигурация мастера

Прежде всего, нам нужно создать пользователя на Мастере. Этот пользователь будет использоваться Slave для создания соединения с Master.

CREATE USER 'user_name'@'%' IDENTIFIED BY 'user_password';
GRANT REPLICATION SLAVE ON *.* TO 'user_name'@'%';
FLUSH PRIVILEGES;

Изменение user_name и user_password в соответствии с вашим именем пользователя и паролем.

Теперь my.inf (my.cnf в Linux) должен быть отредактирован. Включите следующие строки в раздел [mysqld].

server-id = 1
log-bin = mysql-bin.log
binlog-do-db = your_database

Первая строка используется для назначения идентификатора этому серверу MySQL.

Во второй строке говорится, что MySQL начинает записывать журнал в указанный файл журнала. В Linux это можно настроить как log-bin = /home/mysql/logs/mysql-bin.log . Если вы запускаете репликацию на сервере MySQL, в котором репликация уже используется, убедитесь, что этот каталог пуст во всех журналах репликации.

Третья строка используется для настройки базы данных, для которой мы собираемся писать журнал. Вы должны заменить your_database своим именем базы данных.

Убедитесь, что skip-networking не включен и перезапуск сервера MySQL (мастер)

Конфигурация ведомого

Файл my.inf должен быть отредактирован в Slave. Включите следующие строки в раздел [mysqld].

server-id = 2
master-host = master_ip_address
master-connect-retry = 60

master-user = user_name
master-password = user_password
replicate-do-db = your_database

relay-log = slave-relay.log
relay-log-index = slave-relay-log.index

Первая строка используется для назначения идентификатора этому серверу MySQL. Этот идентификатор должен быть уникальным.

Вторая строка - это IP-адрес главного сервера. Измените это в соответствии с IP-адресом вашей основной системы

Третья строка используется для установки предела повтора в секундах.

В следующих двух строках указывается имя пользователя и пароль для ведомого устройства, с помощью которого он соединяет Master.

Следующая строка задает базу данных, которую необходимо реплицировать.

Последние две строки используются для назначения имен файлов relay-log и relay-log-index .

Убедитесь, что skip-networking не включен и перезапустите сервер MySQL (Slave)

Скопировать данные в подчиненный

Если данные постоянно добавляются к Мастеру, мы должны будем предотвратить доступ к базе данных на Мастере, чтобы ничего не было добавлено. Этого можно добиться, запустив следующую инструкцию в Master.

FLUSH TABLES WITH READ LOCK;

Если данные не добавляются на сервер, вы можете пропустить вышеуказанный шаг.

Мы собираемся взять резервную копию данных Master с помощью mysqldump

mysqldump your_database -u root -p > D://Backup/backup.sql;

Измените свою your_database и каталог резервного копирования в соответствии с настройками. Теперь у вас будет файл под названием backup.sql в данном месте.

Если ваша база данных не существует в вашем подчиненном устройстве, создайте ее, выполнив следующие

CREATE DATABASE `your_database`;

Теперь нам нужно импортировать резервную копию на сервер Slave MySQL.

mysql -u root -p your_database  <D://Backup/backup.sql
--->Change `your_database` and backup directory according to your setup

Запустить репликацию

Чтобы начать репликацию, нам нужно найти имя файла журнала и место регистрации в Мастере. Итак, запустите в Master

SHOW MASTER STATUS;

Это даст вам результат, как показано ниже

+---------------------+----------+-------------------------------+------------------+
| File                | Position | Binlog_Do_DB                  | Binlog_Ignore_DB |
+---------------------+----------+-------------------------------+------------------+
| mysql-bin.000001    | 130      | your_database                 |                  |
+---------------------+----------+-------------------------------+------------------+

Затем запустите следующее в Slave

SLAVE STOP;
CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='user_name', 
   MASTER_PASSWORD='user_password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=130;
SLAVE START;

Сначала мы останавливаем Раба. Затем мы точно скажем, где искать файл главного журнала. Для имени MASTER_LOG_FILE и MASTER_LOG_POS используйте значения, которые мы получили, выполнив команду SHOW MASTER STATUS на Master.

Вы должны изменить IP-адрес мастера в MASTER_HOST и соответствующим образом изменить его и пароль.

Раб теперь будет ждать. Статус ведомого устройства можно просмотреть, запустив следующий

SHOW SLAVE STATUS;

Если вы ранее выполняли FLUSH TABLES WITH READ LOCK в Master, освободите таблицы от блокировки, запустив следующие

UNLOCK TABLES;

Теперь Мастер хранит журнал для каждого действия, выполняемого на нем, а подчиненный сервер просматривает журнал мастера. Всякий раз, когда происходят изменения в журнале Master, Slave реплицирует это.

Ошибки репликации

Всякий раз, когда во время выполнения запроса на ведомом появляется ошибка, MySQL автоматически останавливает репликацию, чтобы идентифицировать проблему и исправить ее. Это главным образом потому, что событие вызвало дублирование ключа или строки не было найдено, и оно не может быть обновлено или удалено. Вы можете пропустить такие ошибки, даже если это не рекомендуется

Чтобы пропустить только один запрос, который висит на подчиненном устройстве, используйте следующий синтаксис

SET GLOBAL sql_slave_skip_counter = N;

Этот оператор пропускает следующие N событий от мастера. Этот оператор действителен только тогда, когда подчиненные потоки не работают. В противном случае возникает ошибка.

STOP SLAVE;
SET GLOBAL sql_slave_skip_counter=1;
START SLAVE;

В некоторых случаях это нормально. Но если оператор является частью транзакции с несколькими операторами, он становится более сложным, потому что пропустить оператор создания ошибки приведет к пропущению всей транзакции.

Если вы хотите пропустить больше запросов, которые производят одинаковый код ошибки, и если вы уверены, что пропустить эти ошибки не приведет к непоследовательности вашего ведомого и вы хотите пропустить их все, вы бы добавили строку, чтобы пропустить этот код ошибки в my.cnf ,

Например, вы можете пропустить все повторяющиеся ошибки, которые могут возникнуть

1062 | Error 'Duplicate entry 'xyz' for key 1' on query

Затем добавьте следующее в свой my.cnf

slave-skip-errors = 1062

Вы можете пропустить также другие типы ошибок или все коды ошибок, но убедитесь, что пропуская эти ошибки не приведет к непоследовательности вашего подчиненного. Ниже приведены синтаксис и примеры

slave-skip-errors=[err_code1,err_code2,...|all]

slave-skip-errors=1062,1053
slave-skip-errors=all
slave-skip-errors=ddl_exist_errors


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow