Eu tenho meu escravo configurado para não replicar o banco de dados 'mysql' conforme descrito nesteSHOW SLAVE STATUS\G;
Slave_IO_State: Waiting for master to send event
Master_Host: 127.0.0.1
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 1660
Relay_Log_File: mysql-relay-bin.000004
Relay_Log_Pos: 478
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
**Replicate_Ignore_DB: mysql**
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: 1660
Relay_Log_Space: 633
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Agora, se eu for para o servidor MASTERGRANT
e emitir um e FLUSH PRIVILEGES
:
GRANT SELECT ON *.* TO `foo`@`localhost` IDENTIFIED BY 'bar';
FLUSH PRIVILEGES;
Eu então volto para o servidor SLAVE e emito:
SHOW GRANTS FOR `foo`@`localhost`;
e receba a resposta:
+-------------------------------------------------------------------------------------------------------------+
| Grants for foo@localhost |
+-------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'foo'@'localhost' IDENTIFIED BY PASSWORD '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB' |
+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Como posso impedir que o escravo replique as alterações no banco de dados mysql? Achei que 'replicate_ignore_db' seria suficiente.
Tudo bem, depois de mais algumas horas de investigação, acho que descobri. Adicionando minha resposta caso isso seja útil para outras pessoas.
De acordo com os documentos em repeat-ignore-db :
Obviamente, a replicação baseada em instrução é o padrão e o que eu estava usando. Então tentei mudar o formato reiniciando o master com
binlog_format=row
para ver o que aconteceria. Sem dados. GRANTS e REVOKES ainda foram replicados.Uma investigação mais aprofundada nos documentos sobre alterações de replicação na tabela mysql revelou
Gah! Ok, verifiquei o binlog usando
mysqlbinlog
e minhaGRANT
declaração não estava emitindo umaUSE mysql
chamada de banco de dados (por que deveria?). Portantoreplicate-ignore-db
, não poderia, em sã consciência, ignorar a declaração.Minha solução foi cortar completamente as alterações na tabela mysql
binlog-ignore-db=mysql
do log binário, adicionando -as a my.cnf e reiniciando o servidor. Funcionou como um encanto.O problema com a resposta de Derek Downey neste post é que sempre funcionará da mesma maneira (ligado ou desligado).
Se você estiver em uma situação em que gostaria que a maioria das concessões fosse replicada, mas não esta - ou não deseja devolver o mysql (necessário para carregar o arquivo my.conf modificado), você pode fazer desta maneira:
Lembre-se - a configuração da última linha
sql_log_bin = 1
é muito importante porque sem ela você não replicará nada.