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.cnfProcure 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 restartEu 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.cnfProcure 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, 13965.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.sqlCopie o dump para o servidor2:
scp /root/mysqldump.sql [email protected]:/root5.4 Importar o dump no servidor2
mysql -u root -p < /root/mysqldump.sqlDesligue o mysql no servidor2:
service mysql stopCopie 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.cnfInicie o MySQL no servidor2:
service mysql starte 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.cnfProcure 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.indee reinicie o MySQL:
service mysql restartFaç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
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.