首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“DROP mysql.failover_console;”复制到奴隶,但“使用mysql;DROP failover_console;”不会

“DROP mysql.failover_console;”复制到奴隶,但“使用mysql;DROP failover_console;”不会
EN

Database Administration用户
提问于 2014-12-11 17:01:03
回答 1查看 1.6K关注 0票数 1

目前,我正在为我的MySQL 5.6.21主机在CentOS 6.6上设置自动故障转移。我在我的实验室里设置了mysqlfailover,它运行得很好。我的问题不是这个问题,而是我在测试时注意到的一个特点。故障转移之后,我需要在我的主机上删除一个表,以恢复mysqlfailover的正常操作。这张桌子是mysql.failover_console。也许这不是最佳做法,但这不是问题所在。我在我的主人上运行以下命令:

代码语言:javascript
复制
DROP TABLE mysql.failover_console;

我忽略了binlog和从服务器的中继日志中的mysql。令我惊讶的是,我的奴隶(MySQL 5.6.21在CentOS 6.6上)停止使用以下消息进行复制:

代码语言:javascript
复制
Last_SQL_Errno: 1051
Last_SQL_Error: Error 'Unknown table 'mysql.failover_console'' on query. Default database: ''. Query: 'DROP TABLE `mysql`.`failover_console` /* generated by server */'

其独特之处在于,以下两个命令不会引起任何问题,并执行功能相同的任务。

代码语言:javascript
复制
USE mysql;
DROP TABLE mysql.failover_console;

这是SHOW MASTER STATUS\G的输出

代码语言:javascript
复制
mysql> SHOW MASTER STATUS\G
*************************** 1. row ***************************
             File: mysqld-bin.000002
         Position: 373
     Binlog_Do_DB:
 Binlog_Ignore_DB: mysql
Executed_Gtid_Set: f9b71d72-70f9-11e4-a8e4-00155d022404:1-9
1 row in set (0.00 sec)

下面是SHOW SLAVE STATUS\G在失败命令之后的输出。

代码语言:javascript
复制
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.3.2
                  Master_User: replicant
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysqld-bin.000002
          Read_Master_Log_Pos: 373
               Relay_Log_File: mysqld-relay-bin.000003
                Relay_Log_Pos: 403
        Relay_Master_Log_File: mysqld-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 1051
                   Last_Error: Error 'Unknown table 'mysql.failover_console'' on query. Default database: ''. Query: 'DROP TABLE `mysql`.`failover_console` /* generated by server */'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 191
              Relay_Log_Space: 2656
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 1051
               Last_SQL_Error: Error 'Unknown table 'mysql.failover_console'' on query. Default database: ''. Query: 'DROP TABLE `mysql`.`failover_console` /* generated by server */'
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: f9b71d72-70f9-11e4-a8e4-00155d022404
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State:
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp: 141211 11:54:53
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set: f9b71d72-70f9-11e4-a8e4-00155d022404:1-9
            Executed_Gtid_Set: d5794f6a-7fd6-11e4-89cf-00155d022408:1,
f9b71d72-70f9-11e4-a8e4-00155d022404:1-8
                Auto_Position: 1
1 row in set (0.00 sec)

那么,为什么USE命令似乎阻止按设计的复制,但运行单个命令却不允许MySQL忽略?

谢谢。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2014-12-11 17:43:29

复制筛选规则只适用于您这样做的情况。

代码语言:javascript
复制
USE mysql;
DROP TABLE failover_console;

当你做DROP TABLE mysql.failover_console;的时候,它会从裂缝中滑出来。为什么?

问题源于您使用Binlog_Ignore_DB: mysql。这将查找默认数据库的mysql。但是,您仍然在表名mysql.的前面显式使用failover_console。请注意正如MySQL文档中所解释的那样是如何:

当使用基于语句的日志记录时,下面的示例不像您所期望的那样工作。假设服务器是以--binlog-忽略-db=sales启动的,并且您发出以下语句: UPDATE;UPDATE sales.january SET amount=amount+1000;在这种情况下,UPDATE语句会被记录,因为--binlog-忽略-db只适用于默认数据库(由USE语句确定)。因为sales数据库是在语句中显式指定的,所以没有对语句进行筛选。但是,当使用基于行的日志时,UPDATE语句的效果不会写入二进制日志,这意味着不会记录对sales.january表的任何更改;在这种情况下,-binlog-忽略-db= sales会导致对销售数据库主副本中的表所做的所有更改都被忽略,以便进行二进制日志记录。

下次,你应该做两件事中的一件:

任一

代码语言:javascript
复制
USE mysql
DROP TABLE failover_console;

代码语言:javascript
复制
DROP TABLE IF EXISTS mysql.failover_console;

试试看!

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/85942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档