如何阻止MySQL从站将更改复制到“ mysql”数据库?


9

我将我的从属设备设置为不复制“ 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服务器并发出GRANTFLUSH 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'就足够了。

Answers:


8

好了,经过几个小时的调查,我想我已经解决了。添加我的答案,以防其他人使用。

根据有关copy-ignore-db文档

基于语句的复制。 指示从属SQL线程不要在默认数据库(即USE选择的数据库)为db_name的位置复制任何语句。

当然,基于语句的复制是默认设置,也是我所使用的。因此,我尝试通过重新启动master来更改格式,binlog_format=row以查看会发生什么情况。没有骰子。赠款撤销仍然被复制。

有关对mysql表上的复制更改的文档的进一步调查显示

不管binlog_format的值如何,都将间接更改mysql数据库的语句记录为语句。这涉及诸如GRANT,REVOKE,SET PASSWORD,RENAME USER,CREATE(除CREATE TABLE ... SELECT之外的所有形式),ALTER(所有形式)和DROP(所有形式)之类的语句。

加!好的,所以我使用检查了binlog,mysqlbinlog并且我的GRANT语句没有发出USE mysql数据库调用(为什么要这样做?)。因此replicate-ignore-db,凭良心不能忽视这一说法。

我的解决方案是通过添加到my.cnf来完全从二进制日志中删除对mysql表的更改,然后重新启动服务器。像魅力一样工作。binlog-ignore-db=mysql


如果同时具有_do__ignore_子句,请仔细研究算法。它变得棘手。
瑞克·詹姆斯

4

德里克·唐尼(Derek Downey)在这篇文章上回答的问题是,它将始终以相同的方式(打开或关闭)工作。

如果您想复制大多数授权但不希望复制这一项的情况-或者您不想退回mysql(必须加载修改的my.conf文件),则可以这样进行:

SET session sql_log_bin = 0;

GRANT SELECT ON *.* TO `foo`@`localhost` IDENTIFIED BY 'bar';

SET session sql_log_bin = 1;

请记住-最后一行设置sql_log_bin = 1非常重要,因为没有它,您将不会复制任何内容。


2
当引用其他答案时,您应该使用添加答案的用户名来引用,而不是“上面的答案”。答案的顺序变化答案投票向上和向下,等等
最大弗农
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.