MySQL调度事件和复制冲突

问题描述

寻求一些建议,以了解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-toolkitenter link description here

或者像现在一样保持一切正常运行,并在还原备份后执行此操作:

ALTER EVENT your_event_name DISABLE ON SLAVE;

(在此处了解更多信息:https://dev.mysql.com/doc/refman/5.7/en/alter-event.html