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, 1396

5.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]:/root

5.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

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

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.