在 MySQL 主从复制架构中,你如何检测是否有(错误的,因为这永远不应该发生!)从属服务器上的直接写入?
现在,我在从机上运行这个命令:
tcpdump tcp port 3306 and not host my_master_IP -A | grep -i -e INSERT -e UPDATE -e DELETE
其输出(如果有的话)意味着写入从机,这是不好的。
有更好的方法吗?
在 MySQL 主从复制架构中,你如何检测是否有(错误的,因为这永远不应该发生!)从属服务器上的直接写入?
现在,我在从机上运行这个命令:
tcpdump tcp port 3306 and not host my_master_IP -A | grep -i -e INSERT -e UPDATE -e DELETE
其输出(如果有的话)意味着写入从机,这是不好的。
有更好的方法吗?
最好的方法是在从站上启用二进制日志记录。为什么 ?
在 Slave 上启用二进制日志
INSERT, UPDATE, DELETE
记录后,二进制日志中的每个记录都带有SQL 语句起源的server_id 。如果启用了 log-slave-updates怎么办?
如果您在 Slave 上启用了log-slave-updates
INSERT, UPDATE, DELETE
,则每个来自 Master 的更新都带有 Master 的server_id。如果直接在 Slave 上执行任何写操作,则必须将命令分开。示例:假设 Master 的server_id是 10,Slave 的server_id是 20。现在,假设您在 Slave 上有这些二进制日志:
您可以像这样将 Master 的命令与 Slave 的命令分开:
然后,您检查
Slave_Commands.sql
以查看运行了哪些命令以及何时运行。如果log-slave-updates被禁用怎么办?
这会更好,因为从站上的二进制日志永远不会增加从站上的大小,除非有人或某事在
INSERTs, UPDATEs, DELETEs
本地运行。示例:假设您
RESET MASTER; SHOW BINARY LOGS;
在 Slave 上运行。对于 MySQL 5.6,您应该看到:从这一点开始,如果二进制日志的大小发生变化,这很快就会告诉您某人或某事在
INSERTs, UPDATEs, DELETEs
本地运行。接下来,你跑然后,您检查
Local_Commands.sql
以查看运行了哪些命令以及何时运行。