#### 17.5.1.16 调用功能的复制

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

可加载函数和存储程序（存储过程和函数、触发器和事件）等调用特性的复制提供了以下特性：

-   该功能的效果总是被复制的。

-   使用基于语句的复制来复制以下语句：

    -   [`创建事件`](create-event.html)

    -   [`改变事件`](alter-event.html)

    -   [`掉落事件`](drop-event.html)

    -   [`创建过程`](create-procedure.html)

    -   [`丢弃程序`](drop-procedure.html)

    -   [`创建函数`](create-function.html)

    -   [`拖放功能`](drop-function.html)

    -   [`创建触发器`](create-trigger.html)

    -   [`下降触发器`](drop-trigger.html)

        然而*效果*使用这些语句创建、修改或删除的功能使用基于行的复制进行复制。

    笔记

    尝试使用基于语句的复制来复制调用的功能会产生警告 Statement is not safe to log in statement 格式。例如，尝试使用基于语句的复制来复制可加载函数会生成此警告，因为 MySQL 服务器当前无法确定该函数是否是确定性的。如果您绝对确定所调用功能的效果是确定性的，则可以放心地忽略此类警告。

-   [](<>) [](<>) [](<>) [](<>)如果是[`创建事件`](create-event.html)和[`改变事件`](alter-event.html)：

    -   事件状态设置为`SLAVESIDE_DISABLED`无论指定的状态如何，都在副本上（这不适用于[`掉落事件`](drop-event.html)）。

    -   创建事件的源在副本上由其服务器 ID 标识。这`鼻祖`列在[`INFORMATION_SCHEMA.EVENTS`](information-schema-events-table.html)存储此信息。看[第 26.3.14 节，“信息\_SCHEMA 事件表”](information-schema-events-table.html)， 和[第 13.7.7.18 节，“SHOW EVENTS 语句”](show-events.html)， 了解更多信息。

-   功能实现驻留在可更新状态的副本上，因此如果源发生故障，副本可以用作源而不会丢失事件处理。

    要确定 MySQL 服务器上是否有任何在不同服务器（充当源）上创建的计划事件，请查询[`INFORMATION_SCHEMA.EVENTS`](information-schema-events-table.html)表格的方式类似于此处显示的内容：


```
SELECT EVENT_SCHEMA, EVENT_NAME
    FROM INFORMATION_SCHEMA.EVENTS
    WHERE STATUS = 'SLAVESIDE_DISABLED';
```

或者，您可以使用[`展会活动`](show-events.html)声明，像这样：

```
SHOW EVENTS
    WHERE STATUS = 'SLAVESIDE_DISABLED';
```

将具有此类事件的副本提升到源时，您必须使用启用每个事件[`改变事件 *`事件名称`* 使能够`](alter-event.html)， 在哪里*`事件名称`*是事件的名称。

如果在此副本上创建事件涉及多个源，并且您希望识别仅在具有服务器 ID 的给定源上创建的事件*`source_id`*，修改前面的查询就[`活动`](information-schema-events-table.html)表包括`鼻祖`列，如下所示：

```
SELECT EVENT_SCHEMA, EVENT_NAME, ORIGINATOR
    FROM INFORMATION_SCHEMA.EVENTS
    WHERE STATUS = 'SLAVESIDE_DISABLED'
    AND   ORIGINATOR = 'source_id'
```

你可以雇佣`鼻祖`与[`展会活动`](show-events.html)以类似方式声明：

```
SHOW EVENTS
    WHERE STATUS = 'SLAVESIDE_DISABLED'
    AND   ORIGINATOR = 'source_id'
```

在启用从源复制的事件之前，您应该禁用副本上的 MySQL 事件调度程序（使用诸如`设置全球 event_scheduler = OFF;`)，运行任何必要的[`改变事件`](alter-event.html)语句，重新启动服务器，然后重新启用副本上的事件调度程序（使用语句，例如`设置全球 event_scheduler = ON;`)-

如果您稍后将新源降级为副本，则必须手动禁用由[`改变事件`](alter-event.html)陈述。您可以通过将事件名称存储在单独的表中来做到这一点[`选择`](select.html)前面显示的语句，或使用[`改变事件`](alter-event.html)使用公共前缀重命名事件的语句，例如`复制_`来识别它们。

如果重命名事件，则在将此服务器降级为副本时，您可以通过查询[`活动`](information-schema-events-table.html)表，如下所示：

```
SELECT CONCAT(EVENT_SCHEMA, '.', EVENT_NAME) AS 'Db.Event'
      FROM INFORMATION_SCHEMA.EVENTS
      WHERE INSTR(EVENT_NAME, 'replicated_') = 1;
```
