REPLICAÇÃO DE DADOS 
Wagner Bianchi 
Certified MySQL 5.0 Developer 
Certified MySQL 5.0 Database Administrator 
Certified MySQL 5.1 Cluster Database Administrator
Para iniciarmos... 
! Nesta parte vamos falar de replicação de dados MySQL; 
! Não vamos falar de backup, replicação é diferente; 
! Atualmente, há três modelo de replicação no MySQL: 
– Replicação Clássica, assíncrona; 
– Replicação Clássica, semisíncrona; 
– Replicação GTID, assíncrona; 
! MySQL e replicação síncrona somente com MySQL Cluster; 
! MySQL e replicação com base em certificados, Galera Cluster; 
! O nosso foco aqui: 
– Replicação Clássica e GTID (novidade do MySQL 5.6!!!)
Como funciona a replicação? 
! Características principais do serviço: 
– Servidores MASTER e servidores SLAVE; 
– Um MASTER pode ter vários SLAVE; 
– Um SLAVE pode ter somente um MASTER;
Ainda mais características... 
! No MASTER, o SLAVE possui um usuário que é utilizado 
para conexão e leitura dos logs binários; 
! O SLAVE possui duas threads utilizadas para: 
– IO_THREAD: conexão direta com o MASTER para ler os logs 
binários e trazer tudo que foi alterado no MASTER e depositar 
em logs denominados relay log; 
– SQL_THREAD: lê o relay log e executa os comandos que 
alteraram os dados dos bancos de dados no MASTER; 
! Com essa sequência de execuções, o servidor ou, os 
servidores SLAVE conseguem se manter em sincronia com o 
MASTER;
Setup: replicação clássica 
! Tarefas básicas antes do setup: 
– Qual dos servidores será o MASTER e qual será o SLAVE? 
– Configurar os Ips das máquinas como fixo/estático; 
– Criar um usuário para replicação no MASTER; 
– Fazer um backup no MASTER; 
– Transferir o backup para o SLAVE; 
– Fazer o restore do backup no SLAVE; 
– Configurar a variável server_id com valores únicos; 
– Obter as coordenadas do log binário do MASTER; 
– Configurar a replicação no SLAVE;
Setup: replicação clássica 
MASTER: 192.168.0.100 <= SLAVE: 192.168.0.101! 
! Criando um usuário para replicação no MASTER: 
mysql> grant replication slave on *.* to rpl@'%' identified by '123456';! 
! Fazendo o backup completo do MASTER: 
# mysql -u root -p -e "flush tables with read lock;”! 
# mysqldump -u root -p --all-databases > mybackup.dmp ! 
# mysql -u root -p -e "unlock tables;”! 
! Transferindo o arquivo de backup para o SLAVE: 
# scp mybackup.dmp root@192.168.0.101:/root!
Setup: replicação clássica 
! Fazendo o restore do backup no MySQL SLAVE: 
# mysql -u root -p < mybackup.dmp 
! Habilitando o log binário e configurando o server_id: 
#: master! 
# vim /etc/my.cnf! 
[mysqld]! 
server_id = 1! 
log_bin=mysql01-bin! 
! 
#: slave! 
[mysqld]! 
server_id = 2! 
! Reinicie o MySQL MASTER e SLAVE: 
[ root@mysql01 ~]# service mysqld restart! 
[ root@mysql02 ~]# service mysqld restart
Setup: replicação clássica 
! Obtendo no MASTER as coordenadas de replicação: 
mysql> show master statusG 
! Configuramos o SLAVE como READ_ONLY: 
mysql> set global read_only=1;! 
! Configurando a replicação no servidor SLAVE com o 
comando CHANGE MASTER TO: 
mysql> change master to master_host=‘192.168.0.100’, ! 
master_log_pos=120,master_log_file=‘mysql01-bin.000001’; 
! Iniciando a replicação, no SLAVE: 
mysql> start slave user=‘rpl’ password=‘123456’;
Setup: replicação clássica 
! Verifique o status da replicação com SHOW SLAVE STATUS: 
# mysql –u root –p –e “show slave statusG”! 
Slave_IO_State: Waiting for master to send event! 
Slave_IO_Running: Yes! 
Slave_SQL_Running: Yes! 
Seconds_Behind_Master: 0! 
Master_SSL_Verify_Server_Cert: No! 
Last_IO_Errno: 0! 
Last_IO_Error:! 
Last_SQL_Errno: 0! 
Last_SQL_Error:! 
Master_Server_Id: 1! 
Master_UUID: f8a2570c-3237-11e4-8fa9-0800274fb806! 
Master_Info_File: /var/lib/mysql/master.info! 
SQL_Delay: 0! 
SQL_Remaining_Delay: NULL! 
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O 
thread to update it! 
Master_Retry_Count: 86400 […]! 
!
Testando a replicação clássica 
! No servidor MASTER, criamos um banco de dados com o 
nome `meudb`: 
mysql> create database meudb;! 
! No servidor SLAVE verificamos se os dados foram replicados: 
mysql> show databases;! 
! Se o banco de dados criado no MASTER é exibido na lista de 
bancos de dados do comando SHOW DATABASES, a 
replicação foi configurada com sucesso!
Replicação GTID 
MASTER: 192.168.0.100 <= SLAVE: 192.168.0.101! 
! Novo modelo de replicação disponível no MySQL 5.6 ++; 
! GTID significa Global Transaction Identifier; 
! Cada servidor em uma topologia GTID tem um UUID; 
! Cada transação executada receba um ID; 
@@server_uuid! 
3E11FA47-71CA-11E1-9E33-C80AA9429562:23! 
trx_id!
Replicação GTID 
! O log binário é gravado de forma diferente; 
Replicação GTID: 
Não necessita indicar posição do log; 
Fácil recuperação em caso de falha; 
Fácil visualização em caso de lagging; 
Fácil configuração, AUTO_POSTION
Replicação GTID 
! Variáveis de ambiente mandatórias em todos os servidores 
de bancos de dados MySQL envolvidos na replicação: 
[mysqld]! 
gtid_mode=on # habilita o tipo de replicação! 
log_bin=name-bin # habilita o log binário! 
log_slave_updates # sem replicação em loop! 
enforce_gtid_consistency # força consistência (safe mode)! 
!– 
enforce_gtid_consistency executará somente consultas que 
possam ser executadas em modo seguro e que possam ser 
envolvidas em meio à transações. Instruções problemáticas: ! 
• CREATE TABLE ... SELECT;! 
• CREATE TENPORARY TABLE em transações;! 
!
Replicação GTID 
! Consultando o valor atual das variáveis requeridas para o 
funcionamento da replicação GTID: 
mysql> select @@server_id,! 
-> @@gtid_mode as gtid,! 
-> @@log_bin as binlog,! 
-> @@log_slave_updates as logslaveupdates,! 
-> @@enforce_gtid_consistency safe_trxs;! 
+-------------+------+--------+-----------------+-----------+! 
| @@server_id | gtid | binlog | logslaveupdates | safe_trxs |! 
+-------------+------+--------+-----------------+-----------+! 
| 1 | OFF | 0 | 0 | 0 |! 
+-------------+------+--------+-----------------+-----------+! 
1 row in set (0.00 sec)!
Setup: replicação GTID 
! Edite o arquivo de configuração do MySQL (my.cnf) nos 
servidores MASTER e SLAVE e inclua as variáveis 
mandatórias abaixo da seção [mysqld]: 
[mysqld]! 
server_id=1 # configure 1 master, 2 slave! 
gtid_mode=on # habilita o tipo de replicação! 
log_bin=name-bin # habilita o log binário! 
log_slave_updates # sem replicação em loop! 
enforce_gtid_consistency=true # força consistência (safe mode)! 
! Fazemos o restart após a edição do arquivo de configuração: 
# service mysqld restart!
Setup: replicação GTID 
! Certificamos se as variáveis configuradas foram realmente 
reconfiguradas a partir do arquivo de configuração: 
#: servidor master! 
mysql> select @@server_id, ! 
@@gtid_mode as gtid, ! 
@@log_bin as binlog, ! 
@@log_slave_updates as logslaveupdates, ! 
@@enforce_gtid_consistency safe_trxs;! 
+-------------+------+--------+-----------------+-----------+! 
| @@server_id | gtid | binlog | logslaveupdates | safe_trxs |! 
+-------------+------+--------+-----------------+-----------+! 
| 1 | ON | 1 | 1 | 1 |! 
+-------------+------+--------+-----------------+-----------+! 
1 row in set (0.00 sec)!
Setup: replicação GTID 
! Certificamos se as variáveis configuradas foram realmente 
reconfiguradas a partir do arquivo de configuração: 
#: servidor slave! 
mysql> select @@server_id, ! 
@@gtid_mode as gtid, ! 
@@log_bin as binlog, ! 
@@log_slave_updates as logslaveupdates, ! 
@@enforce_gtid_consistency safe_trxs;! 
+-------------+------+--------+-----------------+-----------+! 
| @@server_id | gtid | binlog | logslaveupdates | safe_trxs |! 
+-------------+------+--------+-----------------+-----------+! 
| 2 | ON | 1 | 1 | 1 |! 
+-------------+------+--------+-----------------+-----------+! 
1 row in set (0.00 sec)!
Setup: replicação GTID 
! Depois de confirmarmos as configurações, no SLAVE, 
precisamos parar e dar um reset na replicação clássica: 
mysql> stop slave; -- para as duas threads de replicação! 
Query OK, 0 rows affected (0.05 sec)! 
! 
mysql> reset slave; -- reinicia as configurações de replicação! 
Query OK, 0 rows affected (0.38 sec)! 
! Como já temos um usuário para replicação no MASTER, 
basta enviarmos o comando CHANGE MASTER TO: 
mysql> change master to master_host=‘192.168.0.100’, ! 
master_auto_position=1;
Setup: replicação GTID 
! Damos um start na replicação GTID: 
mysql> start slave user=‘rpl’ password=‘123456’;! 
! Verificamos o status da replicação: 
mysql> show slave statusG! 
Slave_IO_State: Waiting for master to send event! 
Master_Host: 192.168.0.101! 
Master_User: rpl! 
Master_Port: 3306! 
Connect_Retry: 60! 
Master_Log_File: mysql02-bin.000004! 
Read_Master_Log_Pos: 407! 
Relay_Log_File: mysqld-relay-bin.000002! 
Relay_Log_Pos: 621! 
Relay_Master_Log_File: mysql02-bin.000004! 
Slave_IO_Running: Yes! 
Slave_SQL_Running: Yes! 
Retrieved_Gtid_Set: b80666fd-32da-11e4-93ce-0800274fb806:1-2! 
Executed_Gtid_Set: b80666fd-32da-11e4-93ce-0800274fb806:1-2! 
Auto_Position: 1!
Yes!!!! We’re done & happy now!!!

UNIFAL - MySQL 5.6 - Replicação

  • 1.
    REPLICAÇÃO DE DADOS Wagner Bianchi Certified MySQL 5.0 Developer Certified MySQL 5.0 Database Administrator Certified MySQL 5.1 Cluster Database Administrator
  • 2.
    Para iniciarmos... !Nesta parte vamos falar de replicação de dados MySQL; ! Não vamos falar de backup, replicação é diferente; ! Atualmente, há três modelo de replicação no MySQL: – Replicação Clássica, assíncrona; – Replicação Clássica, semisíncrona; – Replicação GTID, assíncrona; ! MySQL e replicação síncrona somente com MySQL Cluster; ! MySQL e replicação com base em certificados, Galera Cluster; ! O nosso foco aqui: – Replicação Clássica e GTID (novidade do MySQL 5.6!!!)
  • 3.
    Como funciona areplicação? ! Características principais do serviço: – Servidores MASTER e servidores SLAVE; – Um MASTER pode ter vários SLAVE; – Um SLAVE pode ter somente um MASTER;
  • 4.
    Ainda mais características... ! No MASTER, o SLAVE possui um usuário que é utilizado para conexão e leitura dos logs binários; ! O SLAVE possui duas threads utilizadas para: – IO_THREAD: conexão direta com o MASTER para ler os logs binários e trazer tudo que foi alterado no MASTER e depositar em logs denominados relay log; – SQL_THREAD: lê o relay log e executa os comandos que alteraram os dados dos bancos de dados no MASTER; ! Com essa sequência de execuções, o servidor ou, os servidores SLAVE conseguem se manter em sincronia com o MASTER;
  • 5.
    Setup: replicação clássica ! Tarefas básicas antes do setup: – Qual dos servidores será o MASTER e qual será o SLAVE? – Configurar os Ips das máquinas como fixo/estático; – Criar um usuário para replicação no MASTER; – Fazer um backup no MASTER; – Transferir o backup para o SLAVE; – Fazer o restore do backup no SLAVE; – Configurar a variável server_id com valores únicos; – Obter as coordenadas do log binário do MASTER; – Configurar a replicação no SLAVE;
  • 6.
    Setup: replicação clássica MASTER: 192.168.0.100 <= SLAVE: 192.168.0.101! ! Criando um usuário para replicação no MASTER: mysql> grant replication slave on *.* to rpl@'%' identified by '123456';! ! Fazendo o backup completo do MASTER: # mysql -u root -p -e "flush tables with read lock;”! # mysqldump -u root -p --all-databases > mybackup.dmp ! # mysql -u root -p -e "unlock tables;”! ! Transferindo o arquivo de backup para o SLAVE: # scp mybackup.dmp root@192.168.0.101:/root!
  • 7.
    Setup: replicação clássica ! Fazendo o restore do backup no MySQL SLAVE: # mysql -u root -p < mybackup.dmp ! Habilitando o log binário e configurando o server_id: #: master! # vim /etc/my.cnf! [mysqld]! server_id = 1! log_bin=mysql01-bin! ! #: slave! [mysqld]! server_id = 2! ! Reinicie o MySQL MASTER e SLAVE: [ root@mysql01 ~]# service mysqld restart! [ root@mysql02 ~]# service mysqld restart
  • 8.
    Setup: replicação clássica ! Obtendo no MASTER as coordenadas de replicação: mysql> show master statusG ! Configuramos o SLAVE como READ_ONLY: mysql> set global read_only=1;! ! Configurando a replicação no servidor SLAVE com o comando CHANGE MASTER TO: mysql> change master to master_host=‘192.168.0.100’, ! master_log_pos=120,master_log_file=‘mysql01-bin.000001’; ! Iniciando a replicação, no SLAVE: mysql> start slave user=‘rpl’ password=‘123456’;
  • 9.
    Setup: replicação clássica ! Verifique o status da replicação com SHOW SLAVE STATUS: # mysql –u root –p –e “show slave statusG”! Slave_IO_State: Waiting for master to send event! Slave_IO_Running: Yes! Slave_SQL_Running: Yes! Seconds_Behind_Master: 0! Master_SSL_Verify_Server_Cert: No! Last_IO_Errno: 0! Last_IO_Error:! Last_SQL_Errno: 0! Last_SQL_Error:! Master_Server_Id: 1! Master_UUID: f8a2570c-3237-11e4-8fa9-0800274fb806! Master_Info_File: /var/lib/mysql/master.info! SQL_Delay: 0! SQL_Remaining_Delay: NULL! Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it! Master_Retry_Count: 86400 […]! !
  • 10.
    Testando a replicaçãoclássica ! No servidor MASTER, criamos um banco de dados com o nome `meudb`: mysql> create database meudb;! ! No servidor SLAVE verificamos se os dados foram replicados: mysql> show databases;! ! Se o banco de dados criado no MASTER é exibido na lista de bancos de dados do comando SHOW DATABASES, a replicação foi configurada com sucesso!
  • 11.
    Replicação GTID MASTER:192.168.0.100 <= SLAVE: 192.168.0.101! ! Novo modelo de replicação disponível no MySQL 5.6 ++; ! GTID significa Global Transaction Identifier; ! Cada servidor em uma topologia GTID tem um UUID; ! Cada transação executada receba um ID; @@server_uuid! 3E11FA47-71CA-11E1-9E33-C80AA9429562:23! trx_id!
  • 12.
    Replicação GTID !O log binário é gravado de forma diferente; Replicação GTID: Não necessita indicar posição do log; Fácil recuperação em caso de falha; Fácil visualização em caso de lagging; Fácil configuração, AUTO_POSTION
  • 13.
    Replicação GTID !Variáveis de ambiente mandatórias em todos os servidores de bancos de dados MySQL envolvidos na replicação: [mysqld]! gtid_mode=on # habilita o tipo de replicação! log_bin=name-bin # habilita o log binário! log_slave_updates # sem replicação em loop! enforce_gtid_consistency # força consistência (safe mode)! !– enforce_gtid_consistency executará somente consultas que possam ser executadas em modo seguro e que possam ser envolvidas em meio à transações. Instruções problemáticas: ! • CREATE TABLE ... SELECT;! • CREATE TENPORARY TABLE em transações;! !
  • 14.
    Replicação GTID !Consultando o valor atual das variáveis requeridas para o funcionamento da replicação GTID: mysql> select @@server_id,! -> @@gtid_mode as gtid,! -> @@log_bin as binlog,! -> @@log_slave_updates as logslaveupdates,! -> @@enforce_gtid_consistency safe_trxs;! +-------------+------+--------+-----------------+-----------+! | @@server_id | gtid | binlog | logslaveupdates | safe_trxs |! +-------------+------+--------+-----------------+-----------+! | 1 | OFF | 0 | 0 | 0 |! +-------------+------+--------+-----------------+-----------+! 1 row in set (0.00 sec)!
  • 15.
    Setup: replicação GTID ! Edite o arquivo de configuração do MySQL (my.cnf) nos servidores MASTER e SLAVE e inclua as variáveis mandatórias abaixo da seção [mysqld]: [mysqld]! server_id=1 # configure 1 master, 2 slave! gtid_mode=on # habilita o tipo de replicação! log_bin=name-bin # habilita o log binário! log_slave_updates # sem replicação em loop! enforce_gtid_consistency=true # força consistência (safe mode)! ! Fazemos o restart após a edição do arquivo de configuração: # service mysqld restart!
  • 16.
    Setup: replicação GTID ! Certificamos se as variáveis configuradas foram realmente reconfiguradas a partir do arquivo de configuração: #: servidor master! mysql> select @@server_id, ! @@gtid_mode as gtid, ! @@log_bin as binlog, ! @@log_slave_updates as logslaveupdates, ! @@enforce_gtid_consistency safe_trxs;! +-------------+------+--------+-----------------+-----------+! | @@server_id | gtid | binlog | logslaveupdates | safe_trxs |! +-------------+------+--------+-----------------+-----------+! | 1 | ON | 1 | 1 | 1 |! +-------------+------+--------+-----------------+-----------+! 1 row in set (0.00 sec)!
  • 17.
    Setup: replicação GTID ! Certificamos se as variáveis configuradas foram realmente reconfiguradas a partir do arquivo de configuração: #: servidor slave! mysql> select @@server_id, ! @@gtid_mode as gtid, ! @@log_bin as binlog, ! @@log_slave_updates as logslaveupdates, ! @@enforce_gtid_consistency safe_trxs;! +-------------+------+--------+-----------------+-----------+! | @@server_id | gtid | binlog | logslaveupdates | safe_trxs |! +-------------+------+--------+-----------------+-----------+! | 2 | ON | 1 | 1 | 1 |! +-------------+------+--------+-----------------+-----------+! 1 row in set (0.00 sec)!
  • 18.
    Setup: replicação GTID ! Depois de confirmarmos as configurações, no SLAVE, precisamos parar e dar um reset na replicação clássica: mysql> stop slave; -- para as duas threads de replicação! Query OK, 0 rows affected (0.05 sec)! ! mysql> reset slave; -- reinicia as configurações de replicação! Query OK, 0 rows affected (0.38 sec)! ! Como já temos um usuário para replicação no MASTER, basta enviarmos o comando CHANGE MASTER TO: mysql> change master to master_host=‘192.168.0.100’, ! master_auto_position=1;
  • 19.
    Setup: replicação GTID ! Damos um start na replicação GTID: mysql> start slave user=‘rpl’ password=‘123456’;! ! Verificamos o status da replicação: mysql> show slave statusG! Slave_IO_State: Waiting for master to send event! Master_Host: 192.168.0.101! Master_User: rpl! Master_Port: 3306! Connect_Retry: 60! Master_Log_File: mysql02-bin.000004! Read_Master_Log_Pos: 407! Relay_Log_File: mysqld-relay-bin.000002! Relay_Log_Pos: 621! Relay_Master_Log_File: mysql02-bin.000004! Slave_IO_Running: Yes! Slave_SQL_Running: Yes! Retrieved_Gtid_Set: b80666fd-32da-11e4-93ce-0800274fb806:1-2! Executed_Gtid_Set: b80666fd-32da-11e4-93ce-0800274fb806:1-2! Auto_Position: 1!
  • 20.
    Yes!!!! We’re done& happy now!!!