Banco de Dados · 6 min read · Jan 31, 2026
Replicação MySQL na Mesma Máquina
Este Como Fazer explica a replicação no MySQL na mesma máquina.
Você tem grandes acessos, com um site baseado em banco de dados e desempenho, redundância, segurança agora vem à mente. O DBA agora é inserido por muitas mãos para buscar uma boa solução para fazer rostos felizes. Então, aqui vêm palavras como Cluster, Replicação, Backup, Fail Over e outras. O que são essas? Atualmente discutimos a Replicação em termos de um site baseado em banco de dados para grandes acessos.
O que é Replicação e por que?
A replicação permite que o DBA clone o banco de dados do mestre para outro servidor de banco de dados com o mesmo banco de dados. Isso inclui as identidades de mestre e escravo. O escravo faz uma cópia exata do servidor de banco de dados mestre e/ou seus bancos de dados. Pode haver uma relação um-para-um, um-para-muitos, muitos-para-um entre mestre(s) e escravo(s). O escravo lê continuamente o log binário no mestre (binlog armazena as consultas escritas no servidor de banco de dados mestre) e obtém entrada para seu servidor de banco de dados escravo.
Para que a Replicação não é:
considere a solução para backup, desempenho, segurança e redundância. Existem outras técnicas para isso.
Atualmente vemos a Replicação do servidor MySQL na mesma máquina, ou seja, mestre e escravo rodando na mesma máquina. Também discutiremos alguns problemas com a replicação.
Pré-requisitos:
Servidor MySQL 4.1.12 ou superior em formato de fonte. Baixe-o em http://mysql.com em formato de fonte. Você pode, para facilitar, baixar o cliente mysql de http://mysql.com ou colocar o mysql na variável ambiental. Caso contrário, o mysql teria que ser chamado dos respectivos diretórios mestre/escravo. Alguma distribuição Linux. (Eu usei Fedora Core 2). Remova as dependências para o servidor mysql.
Instalação e Configuração do MySQL Master:
Baixe mysql-4.1.12 Fonte na pasta /misc
tar xzvf mysql-4.1.12.tar.gzcd /misc/mysql-4.1.12./configure --prefix=/usr/local/mysql-mastermakemake installcd /usr/local/mysql-master/bin./mysql_install_db(irá criar uma pasta var)
cd ../varcp /misc/mysql-4.1.12/support-files/my-medium.cnf my.cnfcd ..groupadd mysqluseradd -g mysql mysqlchown -R root .chown -R mysql varchgrp -R mysql .[mysqld]
port = 3306
socket = /usr/local/mysql-master/mysql.sock
#skip-networking // precisamos pular isso no nosso caso, pois estamos fazendo tanto mestre quanto escravo na mesma máquina.
# Servidor Master de Replicação (padrão)
# o log binário é necessário para replicação
log-bin
# id único requerido entre 1 e 2^32 - 1
# padrão é 1 se master-host não estiver definido
# mas não funcionará como um mestre se omitido
server-id = 1
configure outras configurações de acordo com sua necessidade ou mantenha as mesmas, funcionará!! :)
Agora inicie o servidor mysql por:
cd /usr/local/mysql-master/bin./mysqld_safe --defaults-file=/usr/local/mysql-master/var/my.cnf &;MySQL Slave:
Agora extraia mysql-4.1.12.tar.gz em um diretório diferente,
cd /opt/mysql-4.1.12./configure --prefix=/usr/local/mysql-slavemakemake installcd /usr/local/mysql-slavecd bin./mysql_install_db(irá criar uma pasta var)
cd ../varcp /opt/mysql-4.1.12/support-files/my-medium.cnf my.cnfcd ..groupadd mysqluseradd -g mysql mysqlchown -R root .chown -R mysql varchgrp -R mysql .Edite my.cnf na pasta var
[mysqld]
port = 3307
socket = /usr/local/mysql-slave/var/mysql.sock
#skip-networking
server-id = 2
# O mestre de replicação para este escravo - requerido
master-host = localhost
master-user = slavedb
master-password = q1w2e3r4t5
master-port = 3306
Agora inicie o servidor mysql por:
cd /usr/local/mysql-slave/bin./mysqld_safe --defaults-file=/usr/local/mysql-slave/var/my.cnf &Configurar Replicação:
conecte-se ao mysql master por:
mysql --sock=/usr/local/mysql-master/mysql.sockCrie uma conta no master para o escravo:
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slavedb@"192.168.1.27/255.255.255.0" identified by 'q1w2e3r4t5'; Query OK, 0 rows affected (0.28 sec)conecte-se ao mysql slave por:
mysql --sock=/usr/local/mysql-slave/mysql.sockmysql> slave start;Query OK, 0 rows afetados, 1 aviso (0.04 sec)
Testando:
conexão mysql no master:
mysql> show master status\G;************************* 1. row ***********************
File: adam-bin.000001
Position: 227
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.01 sec)
ERROR:
No query specified conecte mysql no slave
mysql> show slave status\G;*********************** 1. row ************************* Slave_IO_State: Connecting to master Master_Host: localhost Master_User: slavedb Master_Port: 3306 Connect_Retry: 60
Master_Log_File: adam-bin.000001
Read_Master_Log_Pos: 4
Relay_Log_File: adam-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: adam-bin.000001Slave_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: 4
Relay_Log_Space: 4
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: NULL
1 row in set (0.00 sec)
ERROR:
No query specified O arquivo binlog no master e sua posição devem ser os mesmos no mysql slave por show slave status\G;
Se tudo estiver bem, você está executando uma cópia funcional de uma relação um-para-um entre mestre e escravo no mesmo sistema.
Alguns Problemas:
A replicação pode falhar devido a vários problemas. Compartilho algumas de minhas experiências com replicação.
problema: replicação falha, master caiu.
O mestre pode estar fora do ar devido a muitas razões. VERIFIQUE os LIMITES DE ARQUIVO NO BANCO DE DADOS, CONSULTAS SQL E USO DE DISCO. Se alguma das razões aparecer, conserte isso, reinicie o mysqld e verifique o status do mestre:
mysql> show master status\G;* 1. row * adam-bin.000003
Position: 227
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.01 sec)
agora verifique o escravo: por show slave status:
mysql> show slave status\G;* 1. row *
Slave_IO_State: Connecting to master
Master_Host: localhost
Master_User: slavedb
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: adam-bin.000001
Read_Master_Log_Pos: 4
Relay_Log_File: adam-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: adam-bin.000001
Slave_IO_Running: No
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: 4
Relay_Log_Space: 4
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: NULL
1 row in set (0.00 sec)
como os valores acima mostram que o mestre foi incrementado para o 3º binlog enquanto o escravo ainda está apontado para o binlog1. então altere esse valor conectando-se ao mysql slave
mysql>; stop slave;mysql> change master to master_log_file='adam-bin.000003', master_log_pos=227;mysql> start slave;Agora verifique com show slave status\G; está funcionando bem.
Problema 2: Se erro de chave duplicada aparecer nos escravos
i.e
No escravo
Mysql> show slave status\G;* 1. row *
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.152
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: adam-bin.000048
Read_Master_Log_Pos: 317714810
Relay_Log_File: db4-relay-bin.000001
Relay_Log_Pos: 290512385
Relay_Master_Log_File: adam-bin.000048
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1062
Last_Error: Error ‘Duplicate entry ‘dekq5g820avnfdmar5qi9dkhv3’ for key 1’ on query. Default database:’session_sql’. Query: ‘INSERT INTO sessi ons5 VALUES (‘dekq5g820avnfdmar5qi9dkhv3’, UNIX_TIMESTAMP(NOW()) + 18000, ‘redir ect|i:1;’)’
Skip_Counter:0
Exec_Master_Log_Pos: 290512419
Relay_Log_Space: 317714776
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: NULL
1 row in set (0.00 sec)
Isso significa que, pela indisponibilidade do mestre, o escravo foi lido, ou pela indisponibilidade do escravo, o mestre foi atualizado, então uma consulta encontrou duas chaves primárias para uma entrada, o que é uma confusão.
Então, consertar isso é: No escravo:
Mysql> set global sql_slave_skip_counter=1;Mysql> start slave;Mysql> show slave status\G;Isso mostrará o valor sincronizado com o mestre. Corrigido.
Receba novas postagens na sua caixa de entrada
Sem spam. Cancele a assinatura a qualquer momento.