Depois de testar muitas sugestões, consegui montar uma solução. Essa configuração serve para replicar informações de databases masters em vários computadores para um servidor slave. Nesse exemplo temos:
- No master 1 um database com nome "replicacao" e uma tabela "tabela_master1";
- No master 2 um database com nome "replicacao" e uma tabela "tabela_master2";
- No servidor slave um database com nome "replicacao" e as tabelas "tabela_master1" que trará informações do master1 e outra tabela "tabela_master2"
Configuração deve começar pelos masters. Em cada MASTER, faça:
- Altere o arquivo "C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" com as seguintes informações na última linha:
# Server Id. Cada servidor deve ter um único id.
server-id=30
# Binary Logging-Localização do arquivo de log binário
log-bin="C:/ProgramData/MySQL/MySQL Server 5.7/Data/bin-log"
# Databases que serão replicadas. Para múltiplos database, adicione mais linhas.
binlog-do-db=replicacao
# bin_address - acesso externo. Endereço 0.0.0.0 indica que qualquer computador terá acesso.
bind-address=0.0.0.0
# GTID para masters - essas são as configurações GTID necessárias para multi-source funcionar.
gtid-mode=on
enforce-gtid-consistency=on
master-info-repository=TABLE
relay-log-info-repository=TABLE>
Importante: procure no arquivo linhas server-id, log-bin e demais alterações. É possível que elas já existam no arquivo. Nesse caso, coloque "#" na frente da linha existente para transformar em comentário ou apague-as.
Crie um usuário com acesso SUPER:
mysql>GRANT REPLICATION SLAVE ON . TO 'nome_usuario'@'%' IDENTIFIED BY 'senha_usuario';
Reinicie o servidor MySQL (clique botão da direita do mouse sobre o icone na barra de tarefas e selecione "restart").
Execute o comando no command line do MySQL - show master status \G;
Esse comando traz as informações do master. Principal é observar os itens:
File: nome do arquivo binário;
Position: posição do último evento no arquivo. Importante para sincronismo entre as tabelas do master e slave;
Binlog_Do_DB: database que será usado na replicação.
No SLAVE faça o seguinte:
- Altere o arquivo "C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" com as seguintes informações na última linha:
# Server Id.
server-id=50
# Binary Logging-Localização do arquivo de log binário
log-bin="C:/ProgramData/MySQL/MySQL Server 5.7/Data/bin-log"
# Databases que serão replicadas
binlog-do-db=replicacao
# bin_address - acesso externo
bind-address=0.0.0.0
#multi-source replication
master-info-repository=TABLE
relay-log-info-repository=TABLE
gtid-mode=on
enforce-gtid-consistency=on
Reinicie o servidor MySQL (clique botão da direita do mouse sobre o icone na barra de tarefas e selecione "restart").
Na linha de comando do SQL, digite o seguinte:
mysql>STOP SLAVE;
mysql>FLUSH LOGS;
mysql>CREATE DATABASE 'replicacao';
mysql>USE replicacao;
mysql>CREATE TABLE 'tabela_master1' ('id' INT(11), NOT NULL AUTO_INCREMENT PRIMARY KEY, 'coluna1' VARCHAR(255) DEFAULT NULL);
mysql>CREATE TABLE 'tabela_master2' ('id' INT(11), NOT NULL AUTO_INCREMENT PRIMARY KEY, 'coluna1' VARCHAR(255) DEFAULT NULL);
mysql>CHANGE MASTER TO MASTER_HOST="IP_do_master1", MASTER_PORT=3306, MASTER_USER="nome_usuario_do_master1",
MASTER_PASSWORD='senha_do_usuario_master1", MASTER_LOG_FILE='nome_do_aquivo_binario_do_master1_item_file', MASTER_LOG_POS=numero_posicao_master1 FOR
CHANNEL 'master1';
mysql>CHANGE MASTER TO MASTER_HOST="IP_do_master2", MASTER_PORT=3306, MASTER_USER="nome_usuario_do_master2",
MASTER_PASSWORD='senha_do_usuario_master2", MASTER_LOG_FILE='nome_do_aquivo_binario_do_master2_item_file', MASTER_LOG_POS=numero_posicao_master2 FOR
CHANNEL 'master2';
mysql>START SLAVE;
mysql> SHOW SLAVE STATUS \G;
Nesse ponto, as informações importante que deverão ser notadas são:
Slave_IO_State: Waiting for master to send event
Master_Host: ip_do_master1
Master_User: replicador
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: bin-log.000002
Read_Master_Log_Pos: 1306
Relay_Log_File: wserver2016-relay-bin-master2.000003
Relay_Log_Pos: 934
Relay_Master_Log_File: bin-log.000002
Slave_IO_Running: Yes (indica que está rodando)
Slave_SQL_Running: Yes (indica que está rodando)
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Agora insira dados nas tabelas master 1 e master 2 e faça um select na tabela slave para checar.