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

Der*_*ney 9 mysql replication

我已将我的从属设置为不复制“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)

现在,如果我去服务器和问题上GRANTFLUSH 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' 就足够了。

Der*_*ney 8

好吧,经过几个小时的调查,我想我明白了。如果这对其他人有用,请添加我的答案。

根据replicate-ignore-db 上文档

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

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

对 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非常重要,因为没有它您将无法复制任何内容。

  • 在引用其他答案时,您应该引用添加答案的用户的姓名,而不是“上面的答案”。答案的顺序会随着答案的投票而改变,等等。 (2认同)