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.gz
cd /misc/mysql-4.1.12
./configure --prefix=/usr/local/mysql-master
make
make install
cd /usr/local/mysql-master/bin
./mysql_install_db

(irá criar uma pasta var)

cd ../var
cp /misc/mysql-4.1.12/support-files/my-medium.cnf my.cnf
cd ..
groupadd mysql
useradd -g mysql mysql
chown -R root .
chown -R mysql var
chgrp -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-slave
make
make install
cd /usr/local/mysql-slave
cd bin
./mysql_install_db

(irá criar uma pasta var)

cd ../var
cp /opt/mysql-4.1.12/support-files/my-medium.cnf my.cnf
cd ..
groupadd mysql
useradd -g mysql mysql
chown -R root .
chown -R mysql var
chgrp -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.sock

Crie 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.sock
mysql> 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.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: 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.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.