Replicação de Dados
Bom dia a todos.
Tenho duas máquinas com o mysql 4.0.22 e estou tentando efetuar a replicação de acordo com um artigo da DBFreeMagazine.
Na máquina 1(onde eu efetuo o replicação), eu configurei o my.ini desta forma:
[mysqld]
log-bin
server-id = 1
Na máquina 2 (de onde vem os dados), eu configurei o my.ini da seguinte forma:
[mysqld]
server-id = 2
master-host = 192.168.0.1
master-user = root
master-password =
replicate-do-db = Lojas
Depois reiniciei as duas máquinas. Quando eu eexecuto a instrução ´show slave status´, este me retorna que tenho permissão para replicação, mas não está acontecendo nada.
Alguém pode me dizer o q pode estar acontecendo?
É o usuário que não pode ser ´root´ ?
A replicação não ocorre na versão 4.0.22 ?
A replicação só ocorre após 1 hora ? Se sim, como posso diminuir este intervalo de tempo ?
Grato pela atenção.
Tenho duas máquinas com o mysql 4.0.22 e estou tentando efetuar a replicação de acordo com um artigo da DBFreeMagazine.
Na máquina 1(onde eu efetuo o replicação), eu configurei o my.ini desta forma:
[mysqld]
log-bin
server-id = 1
Na máquina 2 (de onde vem os dados), eu configurei o my.ini da seguinte forma:
[mysqld]
server-id = 2
master-host = 192.168.0.1
master-user = root
master-password =
replicate-do-db = Lojas
Depois reiniciei as duas máquinas. Quando eu eexecuto a instrução ´show slave status´, este me retorna que tenho permissão para replicação, mas não está acontecendo nada.
Alguém pode me dizer o q pode estar acontecendo?
É o usuário que não pode ser ´root´ ?
A replicação não ocorre na versão 4.0.22 ?
A replicação só ocorre após 1 hora ? Se sim, como posso diminuir este intervalo de tempo ?
Grato pela atenção.
Turbo Drive
Curtidas 0
Respostas
Mysys
02/08/2006
1) Passos no MASTER
Antes de partir para a configuração temos que nos conectar no MySQL que será o servidor e executar:
mysql -p
Enter password: **********
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 285 to server version: 3.23.52-log
Type ´help;´ or ´h´ for help. Type ´c´ to clear the buffer.
mysql> GRANT FILE ON *.* TO USUARIO@HOST_SLAVE IDENTIFIED BY ´SENHA´;
Query OK, 0 rows affected (0.10 sec)
mysql> quit
Bye
/etc/rc.d/init.d/mysqld stop
cd /var/lib/mysql/minha_database
tar -czvf minha_database.tar.gz *
2) Passos no SLAVE
Vamos então copiar as tabelas compactadas no master (minha_database.tar.gz) para o diretório de dados do MySQL local, no meu caso /usr/local/mysql/data.
cd /usr/local/mysql/data/
./bin/mysql -p
Enter password: **********
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 285 to server version: 3.23.52-log
Type ´help;´ or ´h´ for help. Type ´c´ to clear the buffer.
mysql> create database minha_database;
Query OK, 1 row affected (0.00 sec)
mysql> quit
cd minha_database
killall -9 mysqld
tar -zxvf ../minha_database.tar.gz
3) Configurações do /etc/my.cnf
Configuração do /etc/my.conf do slave:
[mysqld]
master-host=192.168.1.1 # host do servidor
master-user=rafael usuário no servidor
master-password=1c3_m4n senha no servidor
master-connect-retry=60 tempo pra tentar reconectar
server-id=2 identificação
log-slave-updates registra em log as atualizações da replicação
log=/usr/local/mysql/data/mysql.log diretório de log de todas os comandos executados no mysql
[safe_mysqld]
err-log=/usr/local/mysql/data/mysql.err log de erros
Configuração do /etc/my.conf do slave:
[mysqld]
log-bin=/var/lib/mysql/binlog/mysql_bin.log # registra os logs binários as replicações
server-id=1 identificação
binlog-do-db = minha_database database a ser usada para replicação
caso deseje atualizar todas as tabelas menos uma deve-se
usar a variável binlog-ignore-db=TABELA no lugar da binlog-do-db
log=/var/log/mysqld.log local onde serão registrados os logs do mysql
[safe_mysqld]
err-log=/var/log/mysqld.err log erros do mysql
4) Iniciar e checar serviços
Inicie o mysql no servidor e depois no slave.
Vamos checar se o slave está funcionando corretamente. Digite:
cd /usr/local/mysql/data/
./bin/mysql -p
Enter password: **********
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 285 to server version: 3.23.52-log
Type ´help;´ or ´h´ for help. Type ´c´ to clear the buffer.
mysql> show slave status;
# Que te retornará uma tabela com os dados da formatada abaixo:
Master_Host Master_User Master_Port Connect_retry
192.168.1.1 rafael 3306 60
Slave_Running Replicate_do_db Log_File Pos
dexter-bin.001 562 Yes 0
Replicate_ignore_db Last_errno Last_error Skip_counter
0 - - -
Se aparecer Yes na coluna ´Slave_Running´ parabéns, você conseguiu!!! Caso contrário, de uma olhada nos logs de erro para ver a razão disso.
5) Verificando a replicação
Insira ou altere algum valor de registro no servidor master e veja se confira se foi replicado para o slave.
6) Monitorando logs de replicação
Para ver os logs binários de replicação você vai ter que se conectar ao servidor master e executar:
mysqlbinlog /var/lib/mysql/binlog/mysql_bin.log
Testa e quero saber c deu certo ... BLZ...
Antes de partir para a configuração temos que nos conectar no MySQL que será o servidor e executar:
mysql -p
Enter password: **********
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 285 to server version: 3.23.52-log
Type ´help;´ or ´h´ for help. Type ´c´ to clear the buffer.
mysql> GRANT FILE ON *.* TO USUARIO@HOST_SLAVE IDENTIFIED BY ´SENHA´;
Query OK, 0 rows affected (0.10 sec)
mysql> quit
Bye
/etc/rc.d/init.d/mysqld stop
cd /var/lib/mysql/minha_database
tar -czvf minha_database.tar.gz *
2) Passos no SLAVE
Vamos então copiar as tabelas compactadas no master (minha_database.tar.gz) para o diretório de dados do MySQL local, no meu caso /usr/local/mysql/data.
cd /usr/local/mysql/data/
./bin/mysql -p
Enter password: **********
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 285 to server version: 3.23.52-log
Type ´help;´ or ´h´ for help. Type ´c´ to clear the buffer.
mysql> create database minha_database;
Query OK, 1 row affected (0.00 sec)
mysql> quit
cd minha_database
killall -9 mysqld
tar -zxvf ../minha_database.tar.gz
3) Configurações do /etc/my.cnf
Configuração do /etc/my.conf do slave:
[mysqld]
master-host=192.168.1.1 # host do servidor
master-user=rafael usuário no servidor
master-password=1c3_m4n senha no servidor
master-connect-retry=60 tempo pra tentar reconectar
server-id=2 identificação
log-slave-updates registra em log as atualizações da replicação
log=/usr/local/mysql/data/mysql.log diretório de log de todas os comandos executados no mysql
[safe_mysqld]
err-log=/usr/local/mysql/data/mysql.err log de erros
Configuração do /etc/my.conf do slave:
[mysqld]
log-bin=/var/lib/mysql/binlog/mysql_bin.log # registra os logs binários as replicações
server-id=1 identificação
binlog-do-db = minha_database database a ser usada para replicação
caso deseje atualizar todas as tabelas menos uma deve-se
usar a variável binlog-ignore-db=TABELA no lugar da binlog-do-db
log=/var/log/mysqld.log local onde serão registrados os logs do mysql
[safe_mysqld]
err-log=/var/log/mysqld.err log erros do mysql
4) Iniciar e checar serviços
Inicie o mysql no servidor e depois no slave.
Vamos checar se o slave está funcionando corretamente. Digite:
cd /usr/local/mysql/data/
./bin/mysql -p
Enter password: **********
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 285 to server version: 3.23.52-log
Type ´help;´ or ´h´ for help. Type ´c´ to clear the buffer.
mysql> show slave status;
# Que te retornará uma tabela com os dados da formatada abaixo:
Master_Host Master_User Master_Port Connect_retry
192.168.1.1 rafael 3306 60
Slave_Running Replicate_do_db Log_File Pos
dexter-bin.001 562 Yes 0
Replicate_ignore_db Last_errno Last_error Skip_counter
0 - - -
Se aparecer Yes na coluna ´Slave_Running´ parabéns, você conseguiu!!! Caso contrário, de uma olhada nos logs de erro para ver a razão disso.
5) Verificando a replicação
Insira ou altere algum valor de registro no servidor master e veja se confira se foi replicado para o slave.
6) Monitorando logs de replicação
Para ver os logs binários de replicação você vai ter que se conectar ao servidor master e executar:
mysqlbinlog /var/lib/mysql/binlog/mysql_bin.log
Testa e quero saber c deu certo ... BLZ...
GOSTEI 0
Turbo Drive
02/08/2006
Grande Mysys. Obrigado pela resposta. Eu tentei da forma q vc descrreve, mas o mnáximo que consegui, foi gerar um log com os registros q estão sendo gravados no ´master´.
Quando eu verifiquei se a replicação estava ocorrendo direito no slave, este me retornou:
´Duplicate entry for key 1´.
A maioria das minhas tabelas possuem chave primária, unique, not null. Esse erro ocorre qdo eu tento gravar um registro cuja chave primária já existe.
Ex:
Se na tabela já existir um registro com chave = 10, e eu tentar gravar outro registro com a chave = 10, então teremos este erro.
Existe alguma forma de burlar isso, pois a replicação que pretendo virá de dois bds distintos, ou seja, eu gravarei em dois BDs e replicarei em um outro BD isolado.
Grato pela atenção.
Quando eu verifiquei se a replicação estava ocorrendo direito no slave, este me retornou:
´Duplicate entry for key 1´.
A maioria das minhas tabelas possuem chave primária, unique, not null. Esse erro ocorre qdo eu tento gravar um registro cuja chave primária já existe.
Ex:
Se na tabela já existir um registro com chave = 10, e eu tentar gravar outro registro com a chave = 10, então teremos este erro.
Existe alguma forma de burlar isso, pois a replicação que pretendo virá de dois bds distintos, ou seja, eu gravarei em dois BDs e replicarei em um outro BD isolado.
Grato pela atenção.
GOSTEI 0
Turbo Drive
02/08/2006
Outra coisa, no arquivo log do master, estão sendo gravados tudo que eu faço no master, mas no slave não acontece nada.
Quando eu dou um processlist nas máquinas estes me retornam isso:
No Master:
user state
root Has sent all binlog to slave; waiting for binlog to be updated
No Slave:
user state
system user Waiting for master to send event.
system user Has read all relay log; waiting for the slave I/O thread to update it
Já consultei http://dev.mysql.com/doc/refman/4.1/pt/replication-implementation-details.html, mas não me dá ssolução alguma.
O que pode estar errado aqui?
Quando eu dou um processlist nas máquinas estes me retornam isso:
No Master:
user state
root Has sent all binlog to slave; waiting for binlog to be updated
No Slave:
user state
system user Waiting for master to send event.
system user Has read all relay log; waiting for the slave I/O thread to update it
Já consultei http://dev.mysql.com/doc/refman/4.1/pt/replication-implementation-details.html, mas não me dá ssolução alguma.
O que pode estar errado aqui?
GOSTEI 0
Mysys
02/08/2006
cara ... essse exemplo é pra voce gravar informacoes no slave e ele replicar no master .... voce DEVE ter a base de dados IGUALZINHA nos dois servidores para dar inicio a replicacao de dados..
pra voce poder dar um balao no problema chave derevistros eu faco assim
vamos supor uma venda..
NUMVND : numero da venda
CODLJA : codigo da loja
eses sao os dois campos primarios e not null ai numca vai duplicar ....
saca..
cada loja com a sua sequencia..
testa ai .do SLAVE para o MASTER so que a base deve ser igual nos dois antes de voce startar o servico...
um abraço
pra voce poder dar um balao no problema chave derevistros eu faco assim
vamos supor uma venda..
NUMVND : numero da venda
CODLJA : codigo da loja
eses sao os dois campos primarios e not null ai numca vai duplicar ....
saca..
cada loja com a sua sequencia..
testa ai .do SLAVE para o MASTER so que a base deve ser igual nos dois antes de voce startar o servico...
um abraço
GOSTEI 0
Rpgufv
02/08/2006
Ola, estou pesquisando sobre essa replicacao de dados no MySQL e
me interessei muito nessa conversa, acho q podem me ajudar. A minha
duvida eh praticamente a mesma do Turbo Drive, so uma diferenca.
O sistema que estou planejando eh um sistema de controle comercial,
ou seja, uma base sera a base da loja (uma para cada filial, claro) e a
outra base eh da matriz, que ira consolidar toda informacao das filiais.
Com a replicacao eu consigo ter todo cadastro (vendas, compras, ...)
feito nas filiais para a matriz, PERFEITO, mas o problema sao as mudancas
feitas na matriz que devem ser atualizadas tb nas filiais, como cadastro
de usuarios, produtos, fabricantes, fornecedores, ...
A duvida eh, como eu faria para ter essa replicacao nos dois sentidos?
Seria estabelecer 2 bases de dados para a matriz, uma sendo a MASTER
das filiais e a outra sendo a SLAVE das filiais? (se eh q da pra entender)
Bom, valeu a ajuda!
rpg
me interessei muito nessa conversa, acho q podem me ajudar. A minha
duvida eh praticamente a mesma do Turbo Drive, so uma diferenca.
O sistema que estou planejando eh um sistema de controle comercial,
ou seja, uma base sera a base da loja (uma para cada filial, claro) e a
outra base eh da matriz, que ira consolidar toda informacao das filiais.
Com a replicacao eu consigo ter todo cadastro (vendas, compras, ...)
feito nas filiais para a matriz, PERFEITO, mas o problema sao as mudancas
feitas na matriz que devem ser atualizadas tb nas filiais, como cadastro
de usuarios, produtos, fabricantes, fornecedores, ...
A duvida eh, como eu faria para ter essa replicacao nos dois sentidos?
Seria estabelecer 2 bases de dados para a matriz, uma sendo a MASTER
das filiais e a outra sendo a SLAVE das filiais? (se eh q da pra entender)
Bom, valeu a ajuda!
rpg
GOSTEI 0
Maolbar
02/08/2006
Olá amigo!
Seguinte, vih que vc conseguiu fazer uma replicação master - master! Fiquei muito feliz por ter conseguido tb!
Mas tenho uma dúvida, gostaria muito de poder fazer uma replicação multi-master com mais de 3 servidores atuando como master/slave, todos com configuração comunicação bidirecional.
Seria possivel configurar no arquivo my.cnf mais de um host de replicação? ou ele só aceita um ??
Essa é a topologia que eu gostaria de fazer:
A > B > A
A> C > A
B > C > B
aff... seria possível isso?? Tenho minhas duvidas de como ficaria o arquivo my.cnf em cada servidor.
Se poder me ajudar ficarei muito agradecido!
Seguinte, vih que vc conseguiu fazer uma replicação master - master! Fiquei muito feliz por ter conseguido tb!
Mas tenho uma dúvida, gostaria muito de poder fazer uma replicação multi-master com mais de 3 servidores atuando como master/slave, todos com configuração comunicação bidirecional.
Seria possivel configurar no arquivo my.cnf mais de um host de replicação? ou ele só aceita um ??
Essa é a topologia que eu gostaria de fazer:
A > B > A
A> C > A
B > C > B
aff... seria possível isso?? Tenho minhas duvidas de como ficaria o arquivo my.cnf em cada servidor.
Se poder me ajudar ficarei muito agradecido!
GOSTEI 0