16.4.1.16 调用功能的复制
用户定义函数(UDF)和存储程序(存储过程和函数,触发器和事件)之类的调用功能的复制具有以下 Feature:
-
该功能的效果始终被复制。
-
使用基于语句的复制来复制以下语句:
但是,使用这些语句创建,修改或删除的功能的“效果”是使用基于行的复制来复制的。
Note
尝试使用基于语句的复制来复制调用的功能会产生警告,“以语句格式登录是不安全的”。例如,尝试使用基于语句的复制来复制 UDF 会产生此警告,因为 MySQL 服务器目前无法确定 UDF 是否是确定性的。如果您完全确定所调用功能的影响是确定性的,则可以放心地忽略此类警告。
-
在CREATE EVENT和ALTER EVENT的情况下:
-
无论指定状态如何,副本上事件的状态都设置为
SLAVESIDE_DISABLED
(不适用于DROP EVENT)。- 通过副本的服务器 ID 在副本上标识创建事件的源。 INFORMATION_SCHEMA.EVENTS中的
ORIGINATOR
列和mysql.event
中的originator
列存储此信息。有关更多信息,请参见第 24.8 节““ INFORMATION_SCHEMA 事件”table”和第 13.7.5.18 节“ SHOW EVENTS 语句”。
- 通过副本的服务器 ID 在副本上标识创建事件的源。 INFORMATION_SCHEMA.EVENTS中的
-
功能部件实现以可更新状态驻留在副本上,因此,如果源失败,则副本可以用作源,而不会丢失事件处理。
要确定在 MySQL 服务器上是否存在在其他服务器(充当复制源服务器)上创建的任何计划事件,请以类似于以下所示的方式查询INFORMATION_SCHEMA.EVENTStable:
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 启用启用每个事件,其中* event_name
*是事件的名称。
如果在此副本上创建事件涉及多个源,并且您希望标识仅在具有服务器 ID * source_id
*的给定源上创建的事件,请修改EVENTStable 上的上一个查询以包括ORIGINATOR
列,如下所示:
SELECT EVENT_SCHEMA, EVENT_NAME, ORIGINATOR
FROM INFORMATION_SCHEMA.EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED'
AND ORIGINATOR = 'source_id'
您可以采用类似的方式在SHOW EVENTS语句中使用ORIGINATOR
:
SHOW EVENTS
WHERE STATUS = 'SLAVESIDE_DISABLED'
AND ORIGINATOR = 'source_id'
在启用从源复制的事件之前,您应该在副本上禁用 MySQL Event Scheduler(使用诸如SET GLOBAL event_scheduler = OFF;
的语句),运行任何必要的ALTER EVENT语句,重新启动服务器,然后在副本上重新启用 Event Scheduler (使用SET GLOBAL event_scheduler = ON;
之类的语句)-
如果以后将新源降级为副本,则必须手动禁用ALTER EVENT语句启用的所有事件。您可以通过将先前显示的SELECT语句中的事件名称存储在单独的 table 中,或使用ALTER EVENT语句来重命名具有通用前缀(例如replicated_
的事件)来标识事件,来做到这一点。
如果重命名事件,则将该服务器降级为副本时,可以通过查询EVENTStable 来标识事件,如下所示:
SELECT CONCAT(EVENT_SCHEMA, '.', EVENT_NAME) AS 'Db.Event'
FROM INFORMATION_SCHEMA.EVENTS
WHERE INSTR(EVENT_NAME, 'replicated_') = 1;