AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 584
Accepted
Derek Downey
Derek Downey
Asked: 2011-01-13 13:07:58 +0800 CST2011-01-13 13:07:58 +0800 CST 2011-01-13 13:07:58 +0800 CST

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

  • 772

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

mysql replication
  • 2 2 个回答
  • 8825 Views

2 个回答

  • Voted
  1. Best Answer
    Derek Downey
    2011-01-13T17:35:20+08:002011-01-13T17:35:20+08:00

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

    根据replicate-ignore-db 上的文档:

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

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

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

    无论 binlog_format 的值如何,间接更改 mysql 数据库的语句都被记录为语句。这适用于诸如 GRANT、REVOKE、SET PASSWORD、RENAME USER、CREATE(除 CREATE TABLE ... SELECT 之外的所有形式)、ALTER(所有形式)和 DROP(所有形式)等语句。

    呸!好的,所以我检查了 binlog usingmysqlbinlog并且我的GRANT语句没有发出USE mysql数据库调用(为什么要这样做?)。所以replicate-ignore-db不能凭良心忽略该声明。

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

    • 9
  2. Frank
    2012-10-05T11:27:11+08:002012-10-05T11:27:11+08:00

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

    • 5

相关问题

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve