目前,我正在为我的MySQL 5.6.21主机在CentOS 6.6上设置自动故障转移。我在我的实验室里设置了mysqlfailover,它运行得很好。我的问题不是这个问题,而是我在测试时注意到的一个特点。故障转移之后,我需要在我的主机上删除一个表,以恢复mysqlfailover的正常操作。这张桌子是mysql.failover_console。也许这不是最佳做法,但这不是问题所在。我在我的主人上运行以下命令:
DROP TABLE mysql.failover_console;我忽略了binlog和从服务器的中继日志中的mysql。令我惊讶的是,我的奴隶(MySQL 5.6.21在CentOS 6.6上)停止使用以下消息进行复制:
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 */'其独特之处在于,以下两个命令不会引起任何问题,并执行功能相同的任务。
USE mysql;
DROP TABLE mysql.failover_console;这是SHOW MASTER STATUS\G的输出
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在失败命令之后的输出。
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忽略?
谢谢。
发布于 2014-12-11 17:43:29
复制筛选规则只适用于您这样做的情况。
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会导致对销售数据库主副本中的表所做的所有更改都被忽略,以便进行二进制日志记录。
下次,你应该做两件事中的一件:
任一
USE mysql
DROP TABLE failover_console;或
DROP TABLE IF EXISTS mysql.failover_console;https://dba.stackexchange.com/questions/85942
复制相似问题