MySQL Replication · 4 min read · Nov 20, 2025

Instalando um Cluster Web, Email e Banco de Dados MySQL no Debian 8.4 Jessie com ISPConfig 3.1 - Página 2

5. Replicação MySQL Master-Master

5.1 Preparar o Servidor1

Faça login no MySQL e crie uma conta especificamente para replicação no MySQL. Eu uso um usuário separado para a replicação para minimizar a possibilidade de comprometimento de outras contas (nome de usuário e senha são armazenados em texto simples no arquivo ou tabela de repositório de informações do master):

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';

e conceda o privilégio 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;

Faça algumas alterações para a replicação na sua configuração do MySQL:

vi /etc/mysql/my.cnf

Procure pela seção que começa com [mysqld], e coloque as seguintes opções nela (comentando todas as opções conflitantes existentes):

[...]  
[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             = ::

e reinicie o MySQL depois:

service mysql restart

Eu simplesmente ignoro alguns erros de escravo. Eu expliquei isso no meu blog:

  • 1007 = Não é possível criar o banco de dados ‘%s’; o banco de dados existe
  • 1008 = Não é possível excluir o banco de dados ‘%s’; o banco de dados não existe
  • 1050 = A tabela ‘%s’ já existe
  • 1396 = A operação %s falhou para %s - Não é possível criar o usuário

você pode encontrar a lista de códigos de erro do MySQL aqui: Códigos e Mensagens de Erro do Servidor

5.2 Preparar o Servidor2

Faça algumas alterações para a replicação na sua configuração do MySQL:

vi /etc/mysql/my.cnf

Procure pela seção que começa com [mysqld], e coloque as seguintes opções nela (comentando todas as opções conflitantes existentes):

[...]  
[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 Criar um snapshot dos bancos de dados existentes no servidor1

Despeje os bancos de dados no servidor1 e insira a senha root do MySQL:

mysqldump -p --all-databases --allow-keywords --master-data --events --single-transaction > /root/mysqldump.sql

Copie o dump para o servidor2:

scp /root/mysqldump.sql [email protected]:/root

5.4 Importar o dump no servidor2

mysql -u root -p < /root/mysqldump.sql

Desligue o mysql no servidor2:

service mysql stop

Copie o arquivo de configurações padrão do MySQL do servidor1 para o servidor2. Mude para servidor1 e execute

scp /etc/mysql/debian.cnf [email protected]:/etc/mysql/debian.cnf

Inicie o MySQL no servidor2:

service mysql start

e faça login no MySQL para definir o servidor master com:

CHANGE MASTER TO MASTER_HOST="server1.example.tld", MASTER_USER="slaveuser2", MASTER_PASSWORD="slave_user_password";

Inicie o escravo:

START SLAVE;

e verifique o status do escravo com

SHOW SLAVE STATUS \G

O resultado será algo como

************************* 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:

Se “Seconds Behind Master” não for 0, aguarde até que o Slave tenha lido todos os dados do master (basta repetir o comando para obter o valor atual). Certifique-se de que o servidor2 está usando o log do master e a posição do log corretos.

No servidor1 execute no 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)

E compare as Coordenadas do Log Binário do Master de Replicação.

Estamos executando uma Replicação MySQL Master-Slave onde o servidor1 é o master e o servidor2 é o slave.

5.5 Replicação MySQL Master-Master

Crie o usuário MySQL para a replicação e conceda o privilégio no 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;

Faça algumas alterações para a replicação na sua configuração do MySQL no servidor2:

vi /etc/mysql/my.cnf

Procure pela seção que começa com [mysqld], e coloque as seguintes opções nela (comentando todas as opções conflitantes existentes):

[...]  
[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

e reinicie o MySQL:

service mysql restart

Faça login no MySQL e obtenha as Coordenadas do Log Binário do Master:

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)

Faça login no MySQL no servidor1 e defina o servidor master com

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;

Inicie o slave:

START SLAVE;

e verifique o status do slave com

SHOW SLAVE STATUS \G

Verifique se o slave está em execução:

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

Se sua replicação parar de funcionar, você pode encontrar informações adicionais aqui:

  • Como Ignorar Certos Erros na Replicação MySQL
  • reiniciar replicação master-master mysql
  • replicação mysql – Não foi possível analisar a entrada do evento de log de relay
Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.