MySQL 预定事件和复制冲突

MySQL scheduled event and replication conflict

寻求一些建议,在 MySQL 的主从复制场景中安排事件的最佳设置是什么。

我有一个主数据库 (SQL1) 和 2 个从数据库(SQL2 和 SQL3),每个都在自己的服务器上。 SQL1 已启用计划事件,运行s 是一个夜间事件,用于清理一些数据并记录一些消息。 SQL2 已将计划事件一起禁用,因此不是问题。 SQL3 需要启用计划事件,因为有另一个数据库运行s 一些 ETL 任务。

当复制偶尔停止工作时,SQL1 的备份会在 SQ2 和 SQL3 上恢复,然后重新建立同步。然而,这意味着来自 SQL1 的计划事件也会在 SQL3 上 运行 并记录相同的消息,这些消息已经从 SQL1 复制,并且由于重复的键等,这再次打破了 link

我当然可以在恢复后手动 disable/delete 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 架构。在此模式中有一个 table event,它包含有关不同模式中所有事件的信息。

要解决您的问题,请不要转储 mysql 架构。在执行 mysqldump 时包含 --events 参数(阅读关于此参数的段落: https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html). When you need all your users on the slave as well (only necessary when you're accessing the slave directly), dump the users separately. I'd recommend pt-show-grants from the percona-toolkit for this: enter link description here

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

ALTER EVENT your_event_name DISABLE ON SLAVE;

(在此处阅读更多相关信息:https://dev.mysql.com/doc/refman/5.7/en/alter-event.html