MySQL репликация · 4 min read · Nov 20, 2025
Установка веб-сервера, почтового сервера и кластера MySQL на Debian 8.4 Jessie с ISPConfig 3.1 - Страница 2
5. MySQL Master-Master Репликация
5.1 Подготовка Server1
Войдите в MySQL и создайте учетную запись специально для репликации в MySQL. Я использую отдельного пользователя для репликации, чтобы минимизировать возможность компрометации других учетных записей (имя пользователя и пароль хранятся в открытом виде в файле или таблице репозитория информации мастера):
CREATE USER 'slaveuser2'@'server2.example.tld' IDENTIFIED BY 'slave_user_password';
CREATE USER 'slaveuser2'@'192.168.0.106' IDENTIFIED BY 'slave_user_password';
CREATE USER 'slaveuser2'@'2001:db8::2' IDENTIFIED BY 'slave_user_password';и предоставьте привилегию REPLICATION SLAVE:
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'server2.example.tld';
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'192.168.0.106';
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser2'@'2001:db8::2';
QUIT;Внесите некоторые изменения для репликации в вашу MySQL-Конфигурацию:
vi /etc/mysql/my.cnfНайдите раздел, который начинается с [mysqld], и добавьте в него следующие параметры (закомментировав все существующие конфликтующие параметры):
[...]
[mysqld]
server-id = 1
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
log_bin = mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_format = mixed
sync_binlog = 1
relay-log = slave-relay.log
relay-log-index = slave-relay-log.index
slave_skip_errors = 1007,1008,1050, 1396
bind-address = ::и перезапустите MySQL после этого:
service mysql restartЯ просто пропускаю некоторые ошибки слейва. Я объяснил это в своем блоге:
- 1007 = Невозможно создать базу данных ‘%s’; база данных существует
- 1008 = Невозможно удалить базу данных ‘%s’; база данных не существует
- 1050 = Таблица ‘%s’ уже существует
- 1396 = Операция %s не удалась для %s - Невозможно создать пользователя
вы можете найти список кодов ошибок MySQL здесь: Коды и сообщения об ошибках сервера
5.2 Подготовка Server2
Внесите некоторые изменения для репликации в вашу MySQL-Конфигурацию:
vi /etc/mysql/my.cnfНайдите раздел, который начинается с [mysqld], и добавьте в него следующие параметры (закомментировав все существующие конфликтующие параметры):
[...]
[mysqld]
server-id = 2
log_bin = mysql-bin.log
expire_logs_days = 10
max_binlog_size = 100M
binlog_format = mixed
sync_binlog = 1
slave_skip_errors = 1007,1008,1050, 13965.3 Создание снимка существующих баз данных на server1
Сделайте дамп баз данных на server1 и введите пароль root MySQL:
mysqldump -p --all-databases --allow-keywords --master-data --events --single-transaction > /root/mysqldump.sqlСкопируйте дамп на server2:
scp /root/mysqldump.sql [email protected]:/root5.4 Импортируйте дамп на server2
mysql -u root -p < /root/mysqldump.sqlОстановите mysql на server2:
service mysql stopСкопируйте файл по умолчанию для MySQL с server1 на server2. Переключитесь на server1 и выполните
scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnfЗапустите MySQL на server2:
service mysql startи войдите в MySQL, чтобы установить мастер-сервер с:
CHANGE MASTER TO MASTER_HOST="server1.example.tld", MASTER_USER="slaveuser2", MASTER_PASSWORD="slave_user_password";Запустите слейв:
START SLAVE;и проверьте статус слейва с помощью
SHOW SLAVE STATUS \GРезультат будет чем-то вроде
************************* 1. row ***********************
Slave_IO_State: Waiting for master to send event
Master_Host: server1.example.tld
Master_User: slaveuser2
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 109989
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 110276
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 109989
Relay_Log_Space: 110574
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: No
Gtid_IO_Pos:Если “Seconds Behind Master” не 0, подождите, пока слейв не прочитает все данные с мастера (просто повторите команду, чтобы получить текущее значение). Убедитесь, что server2 использует правильный мастер-лог и позицию лога.
На server1 выполните в MySQL:
SHOW MASTER STATUS \G*********************** 1. row ************************* File: mysql-bin.000991 Position: 69185362 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec)
И сравните координаты бинарного лога репликации мастера.
Мы выполняем репликацию MySQL Master-Slave, где server1 является мастером, а server2 - слейвом.
5.5 MySQL Master-Master-Репликация
Создайте MySQL-пользователя для репликации и предоставьте привилегию в MySQL:
CREATE USER 'slaveuser1'@'server1.example.tld' IDENTIFIED BY 'slave_user_password';
CREATE USER 'slaveuser1'@'192.168.0.105' IDENTIFIED BY 'slave_user_password';
CREATE USER 'slaveuser1'@'2001:db8::1' IDENTIFIED BY 'slave_user_password';
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'server1.example.tld';
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'192.168.0.105';
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser1'@'2001:db8::1';
QUIT;Внесите некоторые изменения для репликации в вашу MySQL-Конфигурацию на server2:
vi /etc/mysql/my.cnfНайдите раздел, который начинается с [mysqld], и добавьте в него следующие параметры (закомментировав все существующие конфликтующие параметры):
[...]
[mysqld]
[...]
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2
relay-log = slave-relay.log
relay-log-index = slave-relay-log.indeи перезапустите MySQL:
service mysql restartВойдите в MySQL и получите координаты бинарного лога мастера:
SHOW MASTER STATUS \G************************* 1. row *************************
File: mysql-bin.000002
Position: 326
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)Войдите в MySQL на server1 и установите мастер-сервер с
CHANGE MASTER TO MASTER_HOST="server2.example.tld", MASTER_USER="slaveuser1", MASTER_PASSWORD="slave_user_password", MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=326;Запустите слейв:
START SLAVE;и проверьте статус слейва с помощью
SHOW SLAVE STATUS \GПроверьте, что слейв работает:
Slave_IO_Running: Yes
Slave_SQL_Running: YesЕсли ваша репликация перестанет работать, вы можете найти дополнительную информацию здесь:
Get new posts in your inbox
No spam. Unsubscribe anytime.