调用功能(如可加载函数和存储程序(存储过程和函数、触发器和事件))的复制提供以下特性
功能的影响始终被复制。
以下语句使用基于语句的复制进行复制
但是,使用这些语句创建、修改或删除的功能的影响使用基于行的复制进行复制。
注意尝试使用基于语句的复制复制调用功能会产生警告语句在语句格式中不安全以进行日志记录。例如,尝试使用基于语句的复制复制可加载函数会生成此警告,因为目前无法由 MySQL 服务器确定该函数是否确定性。如果您绝对确定调用功能的影响是确定性的,则可以安全地忽略此类警告。
在
CREATE EVENT
和ALTER EVENT
的情况下无论指定的状态如何,事件的状态在副本上都设置为
REPLICA_SIDE_DISABLED
(这并不适用于DROP EVENT
)。在副本上,创建事件的源通过其服务器 ID 进行识别。
INFORMATION_SCHEMA.EVENTS
中的ORIGINATOR
列存储此信息。有关更多信息,请参见第 15.7.7.19 节,“SHOW EVENTS 语句”。
功能实现驻留在副本的可更新状态,以便如果源发生故障,副本可以用作源,而不会丢失事件处理。
要确定 MySQL 服务器上是否存在任何在其他服务器(充当源)上创建的已调度事件,请以类似于此处显示的方式查询 Information Schema EVENTS
表
SELECT EVENT_SCHEMA, EVENT_NAME
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED';
或者,您可以使用SHOW EVENTS
语句,如下所示
SHOW EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED';
将具有此类事件的副本提升为源时,您必须使用ALTER EVENT
启用每个事件,其中 event_name
ENABLEevent_name
是事件的名称。
如果在创建此副本上的事件时涉及多个源,并且您希望识别仅在具有服务器 ID source_id
的给定源上创建的事件,请修改之前在 EVENTS
表上的查询,以包含 ORIGINATOR
列,如下所示
SELECT EVENT_SCHEMA, EVENT_NAME, ORIGINATOR
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED'
AND ORIGINATOR = 'source_id'
您可以以类似的方式使用 ORIGINATOR
与 SHOW EVENTS
语句
SHOW EVENTS
WHERE STATUS = 'REPLICA_SIDE_DISABLED'
AND ORIGINATOR = 'source_id'
REPLICA_SIDE_DISABLED
替换 SLAVESIDE_DISABLED
,后者已弃用。
在启用从源复制的事件之前,您应该在副本上禁用 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;