我将我的从属设置为不复制“mysql”数据库,如此处所述SHOW 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
现在,如果我去MASTER服务器并发出一个GRANT
and FLUSH PRIVILEGES
:
GRANT SELECT ON *.* TO `foo`@`localhost` IDENTIFIED BY 'bar';
FLUSH PRIVILEGES;
然后我回到SLAVE服务器并发出:
SHOW GRANTS FOR `foo`@`localhost`;
并收到回复:
+-------------------------------------------------------------------------------------------------------------+
| Grants for foo@localhost |
+-------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'foo'@'localhost' IDENTIFIED BY PASSWORD '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB' |
+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
如何阻止从属服务器复制 mysql 数据库的更改?我认为“replicate_ignore_db”就足够了。
好吧,经过几个小时的调查,我想我明白了。如果这对其他人有用,请添加我的答案。
根据replicate-ignore-db 上的文档:
当然,基于语句的复制是默认的,也是我使用的。所以我尝试通过重新启动master来改变格式,
binlog_format=row
看看会发生什么。没有骰子。GRANTS和REVOKE仍然被复制。对 mysql 表上复制更改的文档的进一步调查显示
呸!好的,所以我检查了 binlog using
mysqlbinlog
并且我的GRANT
语句没有发出USE mysql
数据库调用(为什么要这样做?)。所以replicate-ignore-db
不能凭良心忽略该声明。我的解决方案是通过添加到my.cnf并重新启动服务器来完全从二进制日志中删除对mysql表的更改。像魅力一样工作。
binlog-ignore-db=mysql
Derek Downey 在这篇文章中的回答的问题是它总是以相同的方式工作(打开或关闭)。
如果您处于希望复制大多数授权但不希望复制此授权的情况 - 或者您不想退回 mysql(需要加载修改后的 my.conf 文件),您可以这样做:
请记住 - 最后一行设置
sql_log_bin = 1
非常重要,因为没有它您将无法复制任何内容。