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)
寻求一些建议,在 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。您可以使用
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)