问题描述
寻求一些建议,以了解MysqL主从复制方案中计划事件的最佳设置。
我有一个主数据库(sql1),每个数据库都有2个从属数据库(sql2和sql3)。 sql1已启用计划的事件,并每夜运行一次事件,以清除一些数据并记录一些消息。 sql2已将计划事件全部禁用,因此不是问题。 sql3需要启用计划的事件,因为还有另一个数据库运行某些ETL任务。
当复制偶尔停止工作时,将在SQ2和sql3上还原sql1的备份,然后重新建立同步。但是,这意味着来自sql1的计划事件也将在sql3上运行并记录相同的消息,这些消息已经从sql1复制,并且由于重复的密钥等而再次断开了链接。
我当然可以在还原后手动在sql3上禁用/删除该事件,但想知道是否有更好的方法来实现此目的?
解决方法
您所描述的通常不是问题。创建事件时,事件存储在创建事件的服务器上。当您在另一台服务器上还原备份时,将创建该事件,但是该事件的状态为slaveside_disabled
(这意味着它当然不会在从属服务器上执行),因为server_id与server_id在事件。您可以使用
mysql> show events\G
示例输出:
Db: some_db_name
Name: some_event_name
Definer: root@localhost
Time zone: SYSTEM
Type: ONE TIME
Execute at: 2016-01-01 00:00:01
Interval value: NULL
Interval field: NULL
Starts: NULL
Ends: NULL
Status: SLAVESIDE_DISABLED
Originator: 101
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
originator
是在其上创建事件的server_id。您可以使用以下命令检查从服务器上的server_id:
mysql> select @@global.server_id;
+--------------------+
| @@global.server_id |
+--------------------+
| 105 |
+--------------------+
不用担心,server_id与主机名肯定不同。否则,您的复制将无法正常工作。
编辑:添加源:manual
编辑2:如果仍然存在此问题,则可能也正在转储和还原mysql
模式。该模式中有一个表event
,其中包含有关不同模式中所有事件的信息。
要解决您的问题,请不要转储mysql
模式。在执行--events
时包括mysqldump
参数(请阅读有关此参数的段落:https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html)。当您还需要在从站上拥有所有用户时(仅在直接访问从站时才需要),请分别转储用户。为此,我建议从pt-show-grants
中选择percona-toolkit
:enter link description here
或者像现在一样保持一切正常运行,并在还原备份后执行此操作:
ALTER EVENT your_event_name DISABLE ON SLAVE;
(在此处了解更多信息:https://dev.mysql.com/doc/refman/5.7/en/alter-event.html)