16.4.1.16 调用功能的复制

用户定义函数(UDF)和存储程序(存储过程和函数,触发器和事件)之类的调用功能的复制具有以下 Feature:

但是,使用这些语句创建,修改或删除的功能的“效果”是使用基于行的复制来复制的。

Note

尝试使用基于语句的复制来复制调用的功能会产生警告,“以语句格式登录是不安全的”。例如,尝试使用基于语句的复制来复制 UDF 会产生此警告,因为 MySQL 服务器目前无法确定 UDF 是否是确定性的。如果您完全确定所调用功能的影响是确定性的,则可以放心地忽略此类警告。

要确定在 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;