você está aqui: Home  → Arquivo de Mensagens

Replicação de Mysql

Colaboração: Renato Rudnicki

Data de Publicação: 11 de Maio de 2009

Para quem precisa implementar replicação de mysql, segue o tutorial abaixo. O mesmo foi testado em sistema centos 5.1, como mysql 5.x

Configurando o master

  IP MASTER: 192.168.0.199
  IP SLAVE: 192.168.0.200
  NOME DO DB: teste
  • criar senha para mysql
      mysqladmin --user=root password dicas-l
      mysqladmin --user=root --password reload
    

  • criar banco de dados
      mysql -u root -p
      
      mysql> CREATE DATABASE teste;
      mysql> use teste;
      mysql> CREATE TABLE senhas (
      usuario text,
      senha text,
      uid text,
      gid text,
      gecos text,
      home text,
      shell text );
      
      mysql -u root -p
      GRANT REPLICATION SLAVE ON *.* TO 'dicas-l'@'%' IDENTIFIED BY 'dicas-l';
      FLUSH PRIVILEGES;
    
  • edite o /etc/my.cnf
      log-bin = /home/mysql/logs/mysql-bin.log
      binlog-do-db=teste
      server-id=1
    
  • crie o diretorio /home/mysql/logs
  • crie o arquivo mysql-bin.log e mude para dono e grupo do mysql
      chown -R mysql.mysql /home/mysql
      chmod -R 775 /home/mysql
      
      /etc/init.d/mysql restart
    

Configurando o slave

  • edite o /etc/my.cnf
      server-id=2
      master-host=192.168.0.199
      master-connect-retry=60
      master-user=dicas-l
      master-password=dicas-l
      replicate-do-db=teste
      relay-log = /var/lib/mysql/slave-relay.log
      relay-log-index = /var/lib/mysql/slave-relay-log.index
    
  • crie os arquivos slave-relay.log e slave-relay-log.index
  • mude para dono e grupo do mysql
      chown -R mysql.mysql /home/mysql
      chmod -R 775 /home/mysql
      /etc/init.d/mysql restart
    

Configurando o master

  mysql -u root -p
  flush tables with read lock;
  mysqldump teste -u root -p > /home/database.sql;gzip /home/database.sql;
  scp /home/database.sql root@192.168.0.200:/home

Configurando o slave

  mysql -u root -p
  create database teste;
  gunzip /home/database.sql.gz
  mysql -u root -p teste </home/database.sql

Configurando o master

  show master status;
  +---------------------+----------+--------------+---------------------+
  | File                | Position | Binlog_Do_DB |    Binlog_Ignore_DB |
  +---------------------+----------+--------------+---------------------+
  | mysql-bin.000001    | 21197930 | teste,teste  |                     |
  +---------------------+----------+--------------+---------------------+

Configurando o slave

  mysql -u root -p
  slave stop;
  CHANGE MASTER TO MASTER_HOST='192.168.0.199', MASTER_USER='dicas-l', MASTER_PASSWORD='dicas-l', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=21197930;
  slave start;

Configurando o master

  unlock tables;

Configurando o slave

  show slave status\G;

Configurando o master e testando

  use teste;
  LOAD DATA INFILE '/etc/passwd' INTO TABLE senhas FIELDS TERMINATED BY ':' ;
  select * from senhas;

Testando o slave

  select * from senhas;
  MYSQL MASTER
  [root@master ~]# cat /etc/my.cnf
  [mysqld]
  datadir=/var/lib/mysql
  socket=/var/lib/mysql/mysql.sock
  # Default to using old password format for compatibility with mysql 3.x
  # clients (those using the mysqlclient10 compatibility package).
  old_passwords=1
  log-bin=/home/mysql/logs/mysql-bin.log
  binlog-do-db=teste
  server-id=1
  
  [mysql.server]
  user=mysql
  basedir=/var/lib
  
  [mysqld_safe]
  log-error=/var/log/mysqld.log
  pid-file=/var/run/mysqld/mysqld.pid

MYSQL SLAVE

  [root@slave home]# cat /etc/my.cnf
  [mysqld]
  datadir=/var/lib/mysql
  socket=/var/lib/mysql/mysql.sock
  # Default to using old password format for compatibility with mysql 3.x
  # clients (those using the mysqlclient10 compatibility package).
  old_passwords=1
  server-id=2
  master-host=192.168.0.199
  master-user=dicas-l
  master-password=dicas-l
  replicate-do-db=teste
  
  relay-log=/var/lib/mysql/slave-relay.log
  relay-log-index=/var/lib/mysql/slave-relay-log.index
  
  [mysql.server]
  user=mysql
  basedir=/var/lib
  
  [mysqld_safe]
  log-error=/var/log/mysqld.log
  pid-file=/var/run/mysqld/mysqld.pid

Observaçoes

  • é importante usar a linha

      GRANT REPLICATION SLAVE ON *.* TO 'dicas-l'@'%' IDENTIFIED BY 'dicas-l';
    
    e não a linha

      GRANT REPLICATION SLAVE ON tabela.* TO 'dicas-l'@'%' IDENTIFIED BY 'dicas-l';
    

  • é importante seguir a ordem:
      slave stop;
      CHANGE MASTER TO MASTER_HOST='192.168.0.199',
      MASTER_USER='dicas-l', MASTER_PASSWORD='dicas-l',
      MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=21197930;
      slave start;
    
  • não se deve apagar dados diretamente no mysql slave, se não, ira quebrar a replicação.

  • se quebrar a replicação, deve-se utilizar novamente os comandos abaixo no server slave:

      slave stop;
      CHANGE MASTER TO MASTER_HOST='192.168.0.199',
      MASTER_USER='dicas-l', MASTER_PASSWORD='dicas-l',
      MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=21197930;
      slave start;
    
  • para adicionar mais bancos, configure o my.cnf do slave com este parametro: replicate-do-db=teste, novo feito isso, refaça os passos desde o inicio.

Observacoes adicionais

Este tutorial assume que você está montando uma estrutura do inicio, ou seja, os bancos ainda não possuem dados. Caso você precise adicionar um slave de um master que já está em funcionamento, é necessário parar as transações no master ou travar as tabelas, fazer um dump do servidor, e rodar "show master status" para saber qual é a posição e o arquivo de logs corrente do master. Pode-se neste ponto liberar as transações do banco. Após isso carregue o dump no slave, e inicie o slave da seguinte maneira:

  mysql> CHANGE MASTER TO
  -> MASTER_HOST='IP do master',
  -> MASTER_USER='replica',
  -> MASTER_PASSWORD='senha',
  -> MASTER_LOG_FILE='slackware-bin-000002',
  -> MASTER_LOG_POS=450;
  
  mysql> START SLAVE;

MASTER_LOG_FILE: deve ser configurado com o mesmo nome do arquivo de log obtido com "show master status". MASTER_LOG_POS: Posição obtida com "show master status".

Desta forma o slave será iniciado e irá transferir apenas os logs/transações a partir de determinada posição. Ou seja, o que está faltando desde o momento do dump até o momento corrente.

Uma forma muito interessante se sincronizar os slaves com o master é utilizando LOAD DATA FROM MASTER para copiar os dados do master para o slave. Este comando copia todos os dados do master, restaura no slave e ainda ajusta a posição nos logs. Ou seja, depois da cópia seu slave estará sincronizado com o master e ainda estará com o offset de log sincronizado.

Muito bom para quem quer evitar o trabalho de um dump ou uma cópia binária. Para evitar inconsistência LOAD DATA FROM MASTER também faz uso de FLUSH TABLES WITH READ LOCK em todas as tabelas. Dessa forma não há perda de dados.

Para utilização desse comando o usuário de replicação deve possui privilégios SUPER e RELOAD no master. E também precisa privilégio SELECT na tabela que será copiada.

Alguns comandos úteis

  # Mostra status do master e informações sobre os arquivos de logs
  mysql> show master status;
  # Mostra status do slave
  mysql> show slave status \G
  # Para slave
  mysql> stop slave;
  # starta slave
  mysql> start slave;
  # reseta slave. zera seqüência dos logs binários.
  mysql> reset slave
  # Mostra as threads em execucão no servidor.
  mysql> SHOW PROCESSLIST\G
  
  [mysqld]
  log-bin              # Ativa log binário, necessário para cada master
  binlog-do-db=teste   # Especifica para quais bancos devem ser gerados logs binários.
                       # Omita esta opção para gerar logs de todos os bancos.
  server-id=1          # Id que identifica o servidor. Deve ser único para cada server
  log-slave-updates    # Ativa log-slave-updates . Obrigatório para replicação em cadeia
  max_allowed_packet = 10M  # Aumente max_allowed_packet se vc possui um banco muito grande
  # Ou ajuste o tamanho dos arquivos de log para não ultrapassar max_allowed_packet
  
  master-host     =  192.168.0.3   # Ip do server debian/master
  master-user     =  replica       # usuário para replicação
  master-password =   senha        # senha
  master-port     =  3306          # porta utilizada para replicação, padrão=3306

Treinamento on-line gratuito de Introdução ao Slackware Linux

Colaboração: Bruno T. Russo

Gostaria de comunicar à toda comunidade o treinamento de Introdução ao Slackware Linux.

O treinamento é gratuito e será realizado on-line.

Sobre o treinamento

Este é um treinamento introdutório ao Slackware Linux, onde são apresentados os conceitos do Software Livre e a utilização básica do Slackware Linux. São abordados os seguinte tópicos:

  • Instalação
  • Inicialização do sistema
  • Gerenciador de boot
  • Usuários e Grupos de Usuários
  • Introdução ao SHELL
  • Sistemas de Arquivos
  • Comandos para manipulação de diretórios
  • Comandos para manipulação de arquivos
  • Redirecionadores e coringas
  • Permissões de arquivos
  • Gerenciamento de processos
  • Introdução ao VI
  • Compactadores
  • Instalando e removendo pacotes
  • Agendamento de tarefas
  • Fundamentos de rede
  • Kernel e Módulos

A quem se destina

Iniciantes no universo do GNU/Linux e/ou Software Livre.

Por que fazer este treinamento

  1. Você irá aprender os conceitos básicos de um Sistema Slackware Linux.
  2. Você faz o treinamento a hora que quiser e quando puder.
  3. O treinamento é 100% gratuito.

Saiba mais

Endereço eletrônico:

<contato (a) solucaolivre com br>

Bruno Tadeu Russo, é Bacharel em sistemas de Informação, pela Universidade Presbiteriana Mackenzie, e atualmente cursa MBA em gestão de Projetos. Utiliza Linux desde 1999. Atualmente trabalha e uma Consultoria, onde é coordenador de infra-estrutura. Desde 2002 utiliza a distribuição Slackware.


 

 

Veja a relação completa dos artigos de Renato Rudnicki

Opinião dos Leitores

Wasley Almeida
24 Set 2015, 17:20
Estou com uma situação pra resolver e não sei como fazer, veja se pode me ajudar.
Tenho uma replicação master - master, o no qual parou de funcionar. minha duvidas são:

1 - Como descobro quando a replicação parou de funcionar?
2 - Como reativa-la de forma que os dados voltem a ser replicado do ponto onde parou?
3 - Você indica alguma ferramenta grafica pra monitorar a replicação?

Desde já agradeço. - See more at: http://www.devin.com.br/replicacao-mysql/#sthash.frtxpUbX.dpuf
Alberto
31 Mar 2015, 19:11
De muitos tutoriais que encontrei na internet, nenhum foi tão bem explicado como esse! E o único que funcionou de primeira, parabéns!

Aproveitando, como faço pra ignorar a replicação de algumas tabelas?
Cesar
28 Jul 2011, 15:47
Muito bom, seguindo os passos não tem erro.

Valeu!
humberto mascarello
10 Jul 2011, 10:47
muito bem explicado
vou utilizar para instalar o mysql no suse pois estou apanhando para faze-lo.
Hugo Prudente
19 Mai 2011, 09:49
Repliquei de um CENTOS para um DEBIAN em redes externas ficou perfeito!!!
cristiano
24 Set 2010, 17:07
Muito Bom!

Estava com problemas ao tentar configurar o SLAVE para replicação, mas graças ao seu manual(que ficou bem explicativo) o slave funcionou corretamente.
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script