可加载函数和存储程序(存储过程和函数、触发器和事件)等调用特性的复制提供了以下特性:
-
该功能的效果总是被复制的。
-
使用基于语句的复制来复制以下语句:
CREATE EVENTALTER EVENTDROP EVENTCREATE PROCEDUREDROP PROCEDURECREATE FUNCTIONDROP FUNCTIONCREATE TRIGGERDROP TRIGGER
但是,使用这些语句创建、修改或删除的功能的效果是使用基于行的复制来复制的。
笔记
尝试使用基于语句的复制来复制调用的功能会产生警告 Statement is not safe to log in statement format。例如,尝试使用基于语句的复制来复制可加载函数会生成此警告,因为 MySQL 服务器当前无法确定该函数是否是确定性的。如果您绝对确定所调用功能的效果是确定性的,则可以放心地忽略此类警告。
-
在 和 的情况
CREATE EVENT下ALTER EVENT:- 无论指定的状态如何,事件的状态都设置为
SLAVESIDE_DISABLED副本(这不适用于DROP EVENT)。 - 创建事件的源在副本上由其服务器 ID 标识。中的
ORIGINATOR列INFORMATION_SCHEMA.EVENTS存储此信息。有关更多信息,请参阅 第 26.3.14 节,“INFORMATION_SCHEMA EVENTS 表”和 第 13.7.7.18 节,“SHOW EVENTS 语句”。
- 无论指定的状态如何,事件的状态都设置为
-
功能实现驻留在可更新状态的副本上,因此如果源发生故障,副本可以用作源而不会丢失事件处理。
要确定 MySQL 服务器上是否有任何已在不同服务器(充当源)上创建的计划事件,请 INFORMATION_SCHEMA.EVENTS以类似于此处显示的方式查询表:
SELECT EVENT_SCHEMA, EVENT_NAME
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED';
或者,您可以使用该SHOW EVENTS语句,如下所示:
SHOW EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED';
将具有此类事件的副本提升到源时,您必须使用 启用每个事件 ,其中 是事件的名称。 ALTER EVENT *event_name* ENABLEevent_name
如果在此副本上创建事件涉及多个源,并且您希望识别仅在具有服务器 ID 的给定源上创建的事件 source_id,请修改EVENTS表上的上一个查询以包含该 ORIGINATOR列,如下所示:
SELECT EVENT_SCHEMA, EVENT_NAME, ORIGINATOR
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED'
AND ORIGINATOR = 'source_id'
您可以以类似的方式 使用ORIGINATOR该 语句:SHOW EVENTS
SHOW EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED'
AND ORIGINATOR = 'source_id'
在启用从源复制的事件之前,您应该禁用副本上的 MySQL 事件调度程序(使用语句,例如SET GLOBAL event_scheduler = OFF;),运行任何必要ALTER EVENT的语句,重新启动服务器,然后重新启用副本上的事件调度程序(使用声明,例如SET GLOBAL event_scheduler = ON;)-
如果您稍后将新源降级为副本,则必须手动禁用 ALTER EVENT语句启用的所有事件。您可以通过将前面显示的语句中的事件名称存储在单独的表中来做到这一点 SELECT,或者使用ALTER EVENT 语句用公共前缀重命名事件,例如 replicated_标识它们。
如果重命名事件,则在将此服务器降级为副本时,您可以通过查询 EVENTS表来识别事件,如下所示:
SELECT CONCAT(EVENT_SCHEMA, '.', EVENT_NAME) AS 'Db.Event'
FROM INFORMATION_SCHEMA.EVENTS
WHERE INSTR(EVENT_NAME, 'replicated_') = 1;




