我已将我的从属设置为不复制“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
Run Code Online (Sandbox Code Playgroud)
现在,如果我去主服务器和问题上GRANT
和FLUSH PRIVILEGES
:
GRANT SELECT ON *.* TO `foo`@`localhost` IDENTIFIED BY 'bar';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)
然后我回到从服务器并发出:
SHOW GRANTS FOR `foo`@`localhost`;
Run Code Online (Sandbox Code Playgroud)
并收到回复:
+-------------------------------------------------------------------------------------------------------------+
| Grants for foo@localhost |
+-------------------------------------------------------------------------------------------------------------+
| GRANT SELECT ON *.* TO 'foo'@'localhost' IDENTIFIED BY PASSWORD '*E8D46CE25265E545D225A8A6F1BAF642FEBEE5CB' |
+-------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
如何阻止从服务器复制 mysql 数据库的更改?我认为 'replicate_ignore_db' 就足够了。
好吧,经过几个小时的调查,我想我明白了。如果这对其他人有用,请添加我的答案。
基于语句的复制。 告诉从属 SQL 线程不要复制任何默认数据库(即 USE 选择的数据库)为 db_name 的语句。
当然,基于语句的复制是默认的,也是我使用的。因此,我尝试通过重新启动 master 来更改格式,binlog_format=row
以查看会发生什么。没有骰子。GRANTS和REVOKES仍然被复制。
对 mysql 表上的复制更改文档的进一步调查显示
无论 binlog_format 的值如何,间接更改 mysql 数据库的语句都被记录为语句。这与诸如 GRANT、REVOKE、SET PASSWORD、RENAME USER、CREATE(除 CREATE TABLE ... SELECT 之外的所有形式)、ALTER(所有形式)和 DROP(所有形式)等语句有关。
嘎!好的,所以我使用检查了 binlogmysqlbinlog
并且我的GRANT
语句没有发出USE mysql
数据库调用(为什么要这样做?)。所以replicate-ignore-db
不能凭良心无视这句话。
我的解决方案是通过添加到my.cnf并重新启动服务器来完全从二进制日志中删除对mysql表的更改。像魅力一样工作。binlog-ignore-db=mysql
小智 5
德里克唐尼在这篇文章中的回答的问题是它总是以相同的方式工作(打开或关闭)。
如果您希望复制大多数授权而不是这个授权,或者您不想退回 mysql(加载修改后的 my.conf 文件所必需),您可以这样做:
SET session sql_log_bin = 0;
GRANT SELECT ON *.* TO `foo`@`localhost` IDENTIFIED BY 'bar';
SET session sql_log_bin = 1;
Run Code Online (Sandbox Code Playgroud)
请记住 - 最后一行设置sql_log_bin = 1
非常重要,因为没有它您将无法复制任何内容。
归档时间: |
|
查看次数: |
8357 次 |
最近记录: |