

# 配置、启动和停止二进制日志（binlog）复制


以下存储过程控制事务如何从外部数据库复制到 RDS for MySQL，或从 RDS for MySQL 复制到外部数据库。

在使用这些存储过程管理复制时，如果其复制用户配置了 `caching_sha2_password`，则必须通过指定 `SOURCE_SSL=1` 来配置 TLS。`caching_sha2_password` 是 RDS for MySQL 8.4 的默认身份验证插件。有关更多信息，请参阅 [使用 SSL/TLS 进行加密](mysql-ssl-connections.md)。

有关配置、使用和管理只读副本的信息，请参阅 [使用 MySQL 只读副本](USER_MySQL.Replication.ReadReplicas.md)。

**Topics**
+ [

## mysql.rds\$1next\$1master\$1log（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）
](#mysql_rds_next_master_log)
+ [

## mysql.rds\$1next\$1source\$1log（RDS for MySQL 主要版本 8.4 及更高版本）
](#mysql_rds_next_source_log)
+ [

## mysql.rds\$1reset\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）
](#mysql_rds_reset_external_master)
+ [

## mysql.rds\$1reset\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）
](#mysql_rds_reset_external_source)
+ [

## mysql.rds\$1set\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）
](#mysql_rds_set_external_master)
+ [

## mysql.rds\$1set\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）
](#mysql_rds_set_external_source)
+ [

## mysql.rds\$1set\$1external\$1master\$1with\$1auto\$1position（RDS for MySQL 主要版本 8.0 及更低版本）
](#mysql_rds_set_external_master_with_auto_position)
+ [

## mysql.rds\$1set\$1external\$1source\$1with\$1auto\$1position（RDS for MySQL 主要版本 8.4 及更高版本）
](#mysql_rds_set_external_source_with_auto_position)
+ [

## mysql.rds\$1set\$1external\$1master\$1with\$1delay（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）
](#mysql_rds_set_external_master_with_delay)
+ [

## mysql.rds\$1set\$1external\$1source\$1with\$1delay（RDS for MySQL 主要版本 8.4 及更高版本）
](#mysql_rds_set_external_source_with_delay)
+ [

## mysql.rds\$1set\$1external\$1source\$1gtid\$1purged
](#mysql_rds_set_external_source_gtid_purged)
+ [

## mysql.rds\$1set\$1master\$1auto\$1position（RDS for MySQL 主要版本 8.0 及更低版本）
](#mysql_rds_set_master_auto_position)
+ [

## mysql.rds\$1set\$1source\$1auto\$1position（RDS for MySQL 主要版本 8.4 及更高版本）
](#mysql_rds_set_source_auto_position)
+ [

## mysql.rds\$1set\$1source\$1delay
](#mysql_rds_set_source_delay)
+ [

## mysql.rds\$1skip\$1repl\$1error
](#mysql_rds_skip_repl_error)
+ [

## mysql.rds\$1start\$1replication
](#mysql_rds_start_replication)
+ [

## mysql.rds\$1start\$1replication\$1until
](#mysql_rds_start_replication_until)
+ [

## mysql.rds\$1stop\$1replication
](#mysql_rds_stop_replication)

## mysql.rds\$1next\$1master\$1log（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）
mysql.rds\$1next\$1master\$1log

将源数据库实例日志位置更改为源数据库实例上的下一个二进制日志的开始位置。只有在只读副本上收到复制 I/O 错误 1236 时，才能使用该过程。

### 语法


 

```
CALL mysql.rds_next_master_log(
curr_master_log
);
```

### 参数


 *curr\$1master\$1log*   
当前主日志文件的索引。例如，如果当前文件名为 `mysql-bin-changelog.012345`，则索引为 12345。若要确定当前主日志文件名，请运行 `SHOW REPLICA STATUS` 命令并查看 `Master_Log_File` 字段。

### 使用说明


主用户必须运行 `mysql.rds_next_master_log` 过程。

**警告**  
仅在对作为复制源的多可用区数据库实例进行故障转移后复制失败，并且 `mysql.rds_next_master_log` 的 `Last_IO_Errno` 字段报告 I/O 错误 1236 时调用 `SHOW REPLICA STATUS`。  
如果在发生失效转移事件之前，源实例中的事务未写入到磁盘上的二进制日志，调用 `mysql.rds_next_master_log` 可能会导致只读副本丢失数据。可以通过将源实例参数 `sync_binlog` 和 `innodb_support_xa` 设置为 `1` 来减少发生这种情况的几率，尽管这可能会降低性能。有关更多信息，请参阅 [排查 MySQL 只读副本问题](USER_ReadRepl.Troubleshooting.md)。

### 示例


假设复制在 RDS for MySQL 只读副本上失败。对只读副本运行 `SHOW REPLICA STATUS\G` 会返回以下结果：

```
*************************** 1. row ***************************
             Replica_IO_State:
                  Source_Host: myhost.XXXXXXXXXXXXXXX.rr-rrrr-1.rds.amazonaws.com
                  Source_User: MasterUser
                  Source_Port: 3306
                Connect_Retry: 10
              Source_Log_File: mysql-bin-changelog.012345
          Read_Source_Log_Pos: 1219393
               Relay_Log_File: relaylog.012340
                Relay_Log_Pos: 30223388
        Relay_Source_Log_File: mysql-bin-changelog.012345
           Replica_IO_Running: No
          Replica_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Source_Log_Pos: 30223232
              Relay_Log_Space: 5248928866
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Source_SSL_Allowed: No
           Source_SSL_CA_File:
           Source_SSL_CA_Path:
              Source_SSL_Cert:
            Source_SSL_Cipher:
               Source_SSL_Key:
        Seconds_Behind_Master: NULL
Source_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 1236
                Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from impossible position; the first event 'mysql-bin-changelog.013406' at 1219393, the last event read from '/rdsdbdata/log/binlog/mysql-bin-changelog.012345' at 4, the last byte read from '/rdsdbdata/log/binlog/mysql-bin-changelog.012345' at 4.'
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Source_Server_Id: 67285976
```

`Last_IO_Errno` 字段显示该实例收到 I/O 错误 1236。`Master_Log_File` 字段显示文件名为 `mysql-bin-changelog.012345`，这意味着日志文件索引为 `12345`。要纠正该错误，您可以使用以下参数调用 `mysql.rds_next_master_log`：

```
CALL mysql.rds_next_master_log(12345);
```

## mysql.rds\$1next\$1source\$1log（RDS for MySQL 主要版本 8.4 及更高版本）
mysql.rds\$1next\$1source\$1log

将源数据库实例日志位置更改为源数据库实例上的下一个二进制日志的开始位置。只有在只读副本上收到复制 I/O 错误 1236 时，才能使用该过程。

### 语法


 

```
CALL mysql.rds_next_source_log(
curr_source_log
);
```

### 参数


 *curr\$1source\$1log*   
当前源日志文件的索引。例如，如果当前文件名为 `mysql-bin-changelog.012345`，则索引为 12345。要确定当前源日志文件名，请运行 `SHOW REPLICA STATUS` 命令并查看 `Source_Log_File` 字段。

### 使用说明


管理用户必须运行 `mysql.rds_next_source_log` 过程。

**警告**  
仅在对作为复制源的多可用区数据库实例进行故障转移后复制失败，并且 `mysql.rds_next_source_log` 的 `Last_IO_Errno` 字段报告 I/O 错误 1236 时调用 `SHOW REPLICA STATUS`。  
如果在发生失效转移事件之前，源实例中的事务未写入到磁盘上的二进制日志，调用 `mysql.rds_next_source_log` 可能会导致只读副本丢失数据。可以通过将源实例参数 `sync_binlog` 和 `innodb_support_xa` 设置为 `1` 来减少发生这种情况的几率，尽管这可能会降低性能。有关更多信息，请参阅[排查 MySQL 只读副本问题](USER_ReadRepl.Troubleshooting.md)。

### 示例


假设复制在 RDS for MySQL 只读副本上失败。对只读副本运行 `SHOW REPLICA STATUS\G` 会返回以下结果：

```
*************************** 1. row ***************************
             Replica_IO_State:
                  Source_Host: myhost.XXXXXXXXXXXXXXX.rr-rrrr-1.rds.amazonaws.com
                  Source_User: MasterUser
                  Source_Port: 3306
                Connect_Retry: 10
              Source_Log_File: mysql-bin-changelog.012345
          Read_Source_Log_Pos: 1219393
               Relay_Log_File: relaylog.012340
                Relay_Log_Pos: 30223388
        Relay_Source_Log_File: mysql-bin-changelog.012345
           Replica_IO_Running: No
          Replica_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Source_Log_Pos: 30223232
              Relay_Log_Space: 5248928866
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Source_SSL_Allowed: No
           Source_SSL_CA_File:
           Source_SSL_CA_Path:
              Source_SSL_Cert:
            Source_SSL_Cipher:
               Source_SSL_Key:
        Seconds_Behind_Source: NULL
Source_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 1236
                Last_IO_Error: Got fatal error 1236 from source when reading data from binary log: 'Client requested source to start replication from impossible position; the first event 'mysql-bin-changelog.013406' at 1219393, the last event read from '/rdsdbdata/log/binlog/mysql-bin-changelog.012345' at 4, the last byte read from '/rdsdbdata/log/binlog/mysql-bin-changelog.012345' at 4.'
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Source_Server_Id: 67285976
```

`Last_IO_Errno` 字段显示该实例收到 I/O 错误 1236。`Source_Log_File` 字段显示文件名为 `mysql-bin-changelog.012345`，这意味着日志文件索引为 `12345`。要纠正该错误，您可以使用以下参数调用 `mysql.rds_next_source_log`：

```
CALL mysql.rds_next_source_log(12345);
```

## mysql.rds\$1reset\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）
mysql.rds\$1reset\$1external\$1master

重新配置 RDS for MySQL 数据库实例，使其不再是在 Amazon RDS 之外运行的某个 MySQL 实例的只读副本。

**重要**  
要运行此过程，必须启用 `autocommit`。要启用它，请将 `autocommit` 参数设置为 `1`。有关修改参数的信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

### 语法


 

```
CALL mysql.rds_reset_external_master;
```

### 使用说明


主用户必须运行 `mysql.rds_reset_external_master` 过程。此过程必须运行于一个 MySQL 数据库实例上，后者要作为在 Amazon RDS 之外运行的 MySQL 实例的只读副本而被删除。

**注意**  
建议您尽可能使用只读副本管理两个 Amazon RDS 数据库实例之间的复制。在执行该操作时，建议您仅使用该存储过程以及其他与复制相关的存储过程。这些做法可以在 Amazon RDS 数据库实例之间实现更复杂的复制拓扑。我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。有关管理 Amazon RDS 数据库实例之间的复制的信息，请参阅[使用数据库实例只读副本](USER_ReadRepl.md)。

想要了解更多有关使用复制从在 Amazon RDS 之外运行的 MySQL 实例导入数据的信息，请参阅 [配置与外部源实例之间的二进制日志文件位置复制](MySQL.Procedural.Importing.External.Repl.md)。

## mysql.rds\$1reset\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）
mysql.rds\$1reset\$1external\$1source

重新配置 RDS for MySQL 数据库实例，使其不再是在 Amazon RDS 之外运行的某个 MySQL 实例的只读副本。

**重要**  
要运行此过程，必须启用 `autocommit`。要启用它，请将 `autocommit` 参数设置为 `1`。有关修改参数的信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

### 语法


 

```
CALL mysql.rds_reset_external_source;
```

### 使用说明


管理用户必须运行 `mysql.rds_reset_external_source` 过程。此过程必须运行于一个 MySQL 数据库实例上，后者要作为在 Amazon RDS 之外运行的 MySQL 实例的只读副本而被删除。

**注意**  
建议您尽可能使用只读副本管理两个 Amazon RDS 数据库实例之间的复制。在执行该操作时，建议您仅使用该存储过程以及其他与复制相关的存储过程。这些做法可以在 Amazon RDS 数据库实例之间实现更复杂的复制拓扑。我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。  
有关管理 Amazon RDS 数据库实例之间的复制的信息，请参阅[使用数据库实例只读副本](USER_ReadRepl.md)。想要了解更多有关使用复制从在 Amazon RDS 之外运行的 MySQL 实例导入数据的信息，请参阅 [配置与外部源实例之间的二进制日志文件位置复制](MySQL.Procedural.Importing.External.Repl.md)。

## mysql.rds\$1set\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）
mysql.rds\$1set\$1external\$1master

将 RDS for MySQL 数据库实例配置为在 Amazon RDS 之外运行的 MySQL 实例的只读副本。

**重要**  
要运行此过程，必须启用 `autocommit`。要启用它，请将 `autocommit` 参数设置为 `1`。有关修改参数的信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

**注意**  
您可以使用 [mysql.rds\$1set\$1external\$1master\$1with\$1delay（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](#mysql_rds_set_external_master_with_delay) 存储过程配置外部源数据库实例和延迟复制。

### 语法


 

```
CALL mysql.rds_set_external_master (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , mysql_binary_log_file_name
  , mysql_binary_log_file_location
  , ssl_encryption
);
```

### 参数


 *host\$1name*   
在 Amazon RDS 之外运行以变为源数据库实例的 MySQL 实例的主机名或 IP 地址。

 *host\$1port*   
在 Amazon RDS 之外运行的要配置为源数据库实例的 MySQL 实例使用的端口。如果网络配置包括转换端口号的安全 Shell (SSH) 端口复制，请指定由 SSH 公开的端口号。

 *replication\$1user\$1name*   
对在 Amazon RDS 外部运行的 MySQL 实例具有 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的用户的 ID。建议您向专用于复制的账户提供外部实例。

 *replication\$1user\$1password*   
在 `replication_user_name` 中指定的用户 ID 的密码。

 *mysql\$1binary\$1log\$1file\$1name*   
源数据库实例上包含复制信息的二进制日志的名称。

 *mysql\$1binary\$1log\$1file\$1location*   
`mysql_binary_log_file_name` 二进制日志中复制将开始读取复制信息的位置。  
您可以通过在源数据库实例上运行 `SHOW MASTER STATUS` 来确定二进制日志文件名和位置。

 *ssl\$1encryption*   
指定是否在复制连接中使用安全套接字层（SSL）加密的值。1 表示使用 SSL 加密，0 表示不使用加密。默认值为 0。  
不支持 `MASTER_SSL_VERIFY_SERVER_CERT` 选项。此选项设置为 0，这意味着连接已加密，但未验证证书。

### 使用说明


主用户必须运行 `mysql.rds_set_external_master` 过程。必须在要配置为在 Amazon RDS 外部运行的 MySQL 实例的只读副本的 MySQL 数据库实例上运行该过程。

运行 `mysql.rds_set_external_master` 之前，您必须先将在 Amazon RDS 之外运行的 MySQL 实例配置为源数据库实例。要连接到在 Amazon RDS 之外运行的 MySQL 实例，您必须指定 `replication_user_name` 和 `replication_user_password` 值，这些值指示对 MySQL 的外部实例具有 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的复制用户。

**将 MySQL 的外部实例配置为源数据库实例**

1. 通过使用所选的 MySQL 客户端，连接到 MySQL 的外部实例并创建要用于复制的用户账户。示例如下：

   **MySQL 5.7**

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';
   ```

   **MySQL 8.0**

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED WITH mysql_native_password BY 'password';
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

1. 对于 MySQL 的外部实例，向复制用户授予 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限。以下示例向您所在域的“repl\$1user”用户授予对所有数据库的 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限。

   **MySQL 5.7**

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';
   ```

   **MySQL 8.0**

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com';
   ```

要使用加密复制，请将源数据库实例配置为使用 SSL 连接。

**注意**  
建议您尽可能使用只读副本管理两个 Amazon RDS 数据库实例之间的复制。在执行该操作时，建议您仅使用该存储过程以及其他与复制相关的存储过程。这些做法可以在 Amazon RDS 数据库实例之间实现更复杂的复制拓扑。我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。有关管理 Amazon RDS 数据库实例之间的复制的信息，请参阅[使用数据库实例只读副本](USER_ReadRepl.md)。

在调用 `mysql.rds_set_external_master` 将 Amazon RDS 数据库实例配置为只读副本后，可对该只读副本调用 [mysql.rds\$1start\$1replication](#mysql_rds_start_replication) 开始复制过程。您可以调用 [mysql.rds\$1reset\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](#mysql_rds_reset_external_master) 删除只读副本配置。

调用 `mysql.rds_set_external_master` 时，Amazon RDS 将时间、用户和 `set master` 的操作记录在 `mysql.rds_history` 和 `mysql.rds_replication_status` 表中。

### 示例


在 MySQL 数据库实例上运行时，下例将该数据库实例配置为在 Amazon RDS 之外运行的某个 MySQL 实例的只读副本。

```
call mysql.rds_set_external_master(
  'Externaldb.some.com',
  3306,
  'repl_user',
  'password',
  'mysql-bin-changelog.0777',
  120,
  1);
```

## mysql.rds\$1set\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）
mysql.rds\$1set\$1external\$1source

将 RDS for MySQL 数据库实例配置为在 Amazon RDS 之外运行的 MySQL 实例的只读副本。

**重要**  
要运行此过程，必须启用 `autocommit`。要启用它，请将 `autocommit` 参数设置为 `1`。有关修改参数的信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

### 语法


 

```
CALL mysql.rds_set_external_source (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , mysql_binary_log_file_name
  , mysql_binary_log_file_location
  , ssl_encryption
);
```

### 参数


 *host\$1name*   
在 Amazon RDS 之外运行以变为源数据库实例的 MySQL 实例的主机名或 IP 地址。

 *host\$1port*   
在 Amazon RDS 之外运行的要配置为源数据库实例的 MySQL 实例使用的端口。如果网络配置包括转换端口号的安全 Shell (SSH) 端口复制，请指定由 SSH 公开的端口号。

 *replication\$1user\$1name*   
对在 Amazon RDS 外部运行的 MySQL 实例具有 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的用户的 ID。建议您向专用于复制的账户提供外部实例。

 *replication\$1user\$1password*   
在 `replication_user_name` 中指定的用户 ID 的密码。

 *mysql\$1binary\$1log\$1file\$1name*   
源数据库实例上包含复制信息的二进制日志的名称。

 *mysql\$1binary\$1log\$1file\$1location*   
`mysql_binary_log_file_name` 二进制日志中复制将开始读取复制信息的位置。  
您可以通过在源数据库实例上运行 `SHOW MASTER STATUS` 来确定二进制日志文件名和位置。

 *ssl\$1encryption*   
指定是否在复制连接中使用安全套接字层（SSL）加密的值。1 表示使用 SSL 加密，0 表示不使用加密。默认值是 0。  
不支持 `SOURCE_SSL_VERIFY_SERVER_CERT` 选项。此选项设置为 0，这意味着连接已加密，但未验证证书。

### 使用说明


管理用户必须运行 `mysql.rds_set_external_source` 过程。该过程必须在以下 RDS for MySQL 数据库实例上运行：也即，该实例将配置为在 Amazon RDS 外部运行的 MySQL 实例的只读副本。

 运行 `mysql.rds_set_external_source` 之前，必须先将在 Amazon RDS 之外运行的 MySQL 实例配置为源数据库实例。要连接到在 Amazon RDS 之外运行的 MySQL 实例，您必须指定 `replication_user_name` 和 `replication_user_password` 值，这些值指示对 MySQL 的外部实例具有 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的复制用户。

**将 MySQL 的外部实例配置为源数据库实例**

1. 通过使用所选的 MySQL 客户端，连接到 MySQL 的外部实例并创建要用于复制的用户账户。示例如下：

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的密码。

1. 对于 MySQL 的外部实例，向复制用户授予 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限。以下示例向您所在域的“repl\$1user”用户授予对所有数据库的 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com';
   ```

要使用加密复制，请将源数据库实例配置为使用 SSL 连接。此外，使用 [mysql.rds\$1import\$1binlog\$1ssl\$1material](url-rds-user;mysql_rds_import_binlog_ssl_material.html) 过程，将证书颁发机构证书、客户端证书和客户端密钥导入到数据库实例或数据库集群中。

**注意**  
建议您尽可能使用只读副本管理两个 Amazon RDS 数据库实例之间的复制。在执行该操作时，建议您仅使用该存储过程以及其他与复制相关的存储过程。这些做法可以在 Amazon RDS 数据库实例之间实现更复杂的复制拓扑。我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。有关管理 Amazon RDS 数据库实例之间的复制的信息，请参阅[使用数据库实例只读副本](USER_ReadRepl.md)。

在调用 `mysql.rds_set_external_source` 将 RDS for MySQL 数据库实例配置为只读副本后，可对该只读副本调用 [mysql.rds\$1start\$1replication](#mysql_rds_start_replication) 以开始复制过程。您可以调用 [mysql.rds\$1reset\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）](#mysql_rds_reset_external_source) 来删除只读副本配置。

调用 `mysql.rds_set_external_source` 时，Amazon RDS 将时间、用户和 `set master` 的操作记录在 `mysql.rds_history` 和 `mysql.rds_replication_status` 表中。

### 示例


在 RDS for MySQL 数据库实例上运行时，以下示例将该数据库实例配置为在 Amazon RDS 外部运行的某个 MySQL 实例的只读副本。

```
call mysql.rds_set_external_source(
  'Externaldb.some.com',
  3306,
  'repl_user',
  'password',
  'mysql-bin-changelog.0777',
  120,
  1);
```

## mysql.rds\$1set\$1external\$1master\$1with\$1auto\$1position（RDS for MySQL 主要版本 8.0 及更低版本）
mysql.rds\$1set\$1external\$1master\$1with\$1auto\$1position

将 RDS for MySQL 数据库实例配置为在 Amazon RDS 之外运行的 MySQL 实例的只读副本。该过程还会配置延迟复制和基于全局事务标识符 (GTID) 的复制。

**重要**  
要运行此过程，必须启用 `autocommit`。要启用它，请将 `autocommit` 参数设置为 `1`。有关修改参数的信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

### 语法


 

```
CALL mysql.rds_set_external_master_with_auto_position (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , ssl_encryption
  , delay
);
```

### 参数


 *host\$1name*   
在 Amazon RDS 之外运行以变为源数据库实例的 MySQL 实例的主机名或 IP 地址。

 *host\$1port*   
在 Amazon RDS 之外运行的要配置为源数据库实例的 MySQL 实例使用的端口。如果网络配置包括转换端口号的安全 Shell (SSH) 端口复制，请指定由 SSH 公开的端口号。

 *replication\$1user\$1name*   
对在 Amazon RDS 外部运行的 MySQL 实例具有 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的用户的 ID。建议您向专用于复制的账户提供外部实例。

 *replication\$1user\$1password*   
在 `replication_user_name` 中指定的用户 ID 的密码。

 *ssl\$1encryption*   
指定是否在复制连接中使用安全套接字层（SSL）加密的值。1 表示使用 SSL 加密，0 表示不使用加密。默认值为 0。  
不支持 `MASTER_SSL_VERIFY_SERVER_CERT` 选项。此选项设置为 0，这意味着连接已加密，但未验证证书。

 *delay*   
延迟从源数据库实例复制的最小秒数。  
该参数的限制为一天（86400 秒）。

### 使用说明


主用户必须运行 `mysql.rds_set_external_master_with_auto_position` 过程。必须在要配置为在 Amazon RDS 外部运行的 MySQL 实例的只读副本的 MySQL 数据库实例上运行该过程。

所有 RDS for MySQL 5.7 版本和 RDS for MySQL 8.0.26 及更高的 8.0 版本均支持此过程。

运行 `mysql.rds_set_external_master_with_auto_position` 之前，您必须先将在 Amazon RDS 之外运行的 MySQL 实例配置为源数据库实例。要连接到在 Amazon RDS 外部运行的 MySQL 实例，您必须指定 `replication_user_name` 和 `replication_user_password` 值。这些值必须指示具有外部 MySQL 实例的 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的复制用户。

**将 MySQL 的外部实例配置为源数据库实例**

1. 通过使用所选的 MySQL 客户端，连接到 MySQL 的外部实例并创建要用于复制的用户账户。以下是示例。

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
   ```

1. 对于 MySQL 的外部实例，向复制用户授予 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限。以下示例为您的域的 `REPLICATION CLIENT` 用户授予所有数据库的 `REPLICATION SLAVE` 和 `'repl_user'` 权限。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com'
   IDENTIFIED BY 'SomePassW0rd'
   ```

有关更多信息，请参阅“[配置与外部源实例之间的二进制日志文件位置复制](MySQL.Procedural.Importing.External.Repl.md)”。

**注意**  
建议您尽可能使用只读副本管理两个 Amazon RDS 数据库实例之间的复制。在执行该操作时，建议您仅使用该存储过程以及其他与复制相关的存储过程。这些做法可以在 Amazon RDS 数据库实例之间实现更复杂的复制拓扑。我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。有关管理 Amazon RDS 数据库实例之间的复制的信息，请参阅[使用数据库实例只读副本](USER_ReadRepl.md)。

在调用 `mysql.rds_set_external_master_with_auto_position` 之前，务必调用 [mysql.rds\$1set\$1external\$1source\$1gtid\$1purged](#mysql_rds_set_external_source_gtid_purged)，以便使用来自外部源的指定 GTID 范围设置 `gtid_purged` 系统变量。

在调用 `mysql.rds_set_external_master_with_auto_position` 将 Amazon RDS 数据库实例配置为只读副本后，可对该只读副本调用 [mysql.rds\$1start\$1replication](#mysql_rds_start_replication) 开始复制过程。您可以调用 [mysql.rds\$1reset\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](#mysql_rds_reset_external_master) 删除只读副本配置。

在调用 `mysql.rds_set_external_master_with_auto_position` 时，Amazon RDS 在 `set master` 和 `mysql.rds_history` 表中记录时间、用户和 `mysql.rds_replication_status` 操作。

对于灾难恢复，您可以将该过程与 [mysql.rds\$1start\$1replication\$1until](#mysql_rds_start_replication_until) 或 [mysql.rds\$1start\$1replication\$1until\$1gtid](mysql-stored-proc-gtid.md#mysql_rds_start_replication_until_gtid) 存储过程一起使用。要将延迟只读副本的更改向前滚动到发生灾难之前的时间，您可以运行 `mysql.rds_set_external_master_with_auto_position` 过程。在 `mysql.rds_start_replication_until_gtid` 过程停止复制后，您可以通过使用[将只读副本提升为独立的数据库实例](USER_ReadRepl.Promote.md)中的说明将只读副本提升为新的主数据库实例。

要使用 `mysql.rds_rds_start_replication_until_gtid` 过程，必须启用基于 GTID 的复制。要跳过已知会导致灾难的特定基于 GTID 的事务，您可以使用 [mysql.rds\$1skip\$1transaction\$1with\$1gtid](mysql-stored-proc-gtid.md#mysql_rds_skip_transaction_with_gtid) 存储过程。有关使用基于 GTID 的复制的更多信息，请参阅[使用基于 GTID 的复制](mysql-replication-gtid.md)。

### 示例


在 MySQL 数据库实例上运行时，下例将该数据库实例配置为在 Amazon RDS 之外运行的某个 MySQL 实例的只读副本。它在 MySQL 数据库实例上将最短复制延迟时间设置为一小时（3600 秒）。在 Amazon RDS 外部运行的 MySQL 源数据库实例的更改在至少一个小时内不会在 MySQL 数据库实例只读副本上应用。

```
call mysql.rds_set_external_master_with_auto_position(
  'Externaldb.some.com',
  3306,
  'repl_user',
  'SomePassW0rd',
  1,
  3600);
```

## mysql.rds\$1set\$1external\$1source\$1with\$1auto\$1position（RDS for MySQL 主要版本 8.4 及更高版本）
mysql.rds\$1set\$1external\$1source\$1with\$1auto\$1position

将 RDS for MySQL 数据库实例配置为在 Amazon RDS 之外运行的 MySQL 实例的只读副本。该过程还会配置延迟复制和基于全局事务标识符 (GTID) 的复制。

**重要**  
要运行此过程，必须启用 `autocommit`。要启用它，请将 `autocommit` 参数设置为 `1`。有关修改参数的信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

### 语法


 

```
CALL mysql.rds_set_external_source_with_auto_position (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , ssl_encryption
  , delay
);
```

### 参数


 *host\$1name*   
在 Amazon RDS 之外运行以变为源数据库实例的 MySQL 实例的主机名或 IP 地址。

 *host\$1port*   
在 Amazon RDS 之外运行的要配置为源数据库实例的 MySQL 实例使用的端口。如果网络配置包括转换端口号的安全 Shell (SSH) 端口复制，请指定由 SSH 公开的端口号。

 *replication\$1user\$1name*   
对在 Amazon RDS 外部运行的 MySQL 实例具有 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的用户的 ID。建议您向专用于复制的账户提供外部实例。

 *replication\$1user\$1password*   
在 `replication_user_name` 中指定的用户 ID 的密码。

 *ssl\$1encryption*   
指定是否在复制连接中使用安全套接字层（SSL）加密的值。1 表示使用 SSL 加密，0 表示不使用加密。默认值为 0。  
不支持 `SOURCE_SSL_VERIFY_SERVER_CERT` 选项。此选项设置为 0，这意味着连接已加密，但未验证证书。

 *delay*   
延迟从源数据库实例复制的最小秒数。  
该参数的限制为一天（86400 秒）。

### 使用说明


管理用户必须运行 `mysql.rds_set_external_source_with_auto_position` 过程。必须在要配置为在 Amazon RDS 外部运行的 MySQL 实例的只读副本的 MySQL 数据库实例上运行该过程。

运行 `mysql.rds_set_external_source_with_auto_position` 之前，您必须先将在 Amazon RDS 之外运行的 MySQL 实例配置为源数据库实例。要连接到在 Amazon RDS 外部运行的 MySQL 实例，您必须指定 `replication_user_name` 和 `replication_user_password` 值。这些值必须指示具有外部 MySQL 实例的 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的复制用户。

**将 MySQL 的外部实例配置为源数据库实例**

1. 通过使用所选的 MySQL 客户端，连接到 MySQL 的外部实例并创建要用于复制的用户账户。以下是示例。

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
   ```

1. 对于 MySQL 的外部实例，向复制用户授予 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限。以下示例为您的域的 `REPLICATION CLIENT` 用户授予所有数据库的 `REPLICATION SLAVE` 和 `'repl_user'` 权限。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com'
   IDENTIFIED BY 'SomePassW0rd'
   ```

有关更多信息，请参阅“[配置与外部源实例之间的二进制日志文件位置复制](MySQL.Procedural.Importing.External.Repl.md)”。

**注意**  
建议您尽可能使用只读副本管理两个 Amazon RDS 数据库实例之间的复制。在执行该操作时，建议您仅使用该存储过程以及其他与复制相关的存储过程。这些做法可以在 Amazon RDS 数据库实例之间实现更复杂的复制拓扑。我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。有关管理 Amazon RDS 数据库实例之间的复制的信息，请参阅[使用数据库实例只读副本](USER_ReadRepl.md)。

在调用 `mysql.rds_set_external_source_with_auto_position` 之前，务必调用 [mysql.rds\$1set\$1external\$1source\$1gtid\$1purged](#mysql_rds_set_external_source_gtid_purged)，以便使用来自外部源的指定 GTID 范围设置 `gtid_purged` 系统变量。

在调用 `mysql.rds_set_external_source_with_auto_position` 将 Amazon RDS 数据库实例配置为只读副本后，可对该只读副本调用 [mysql.rds\$1start\$1replication](#mysql_rds_start_replication) 开始复制过程。您可以调用 [mysql.rds\$1reset\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）](#mysql_rds_reset_external_source) 删除只读副本配置。

在调用 `mysql.rds_set_external_source_with_auto_position` 时，Amazon RDS 在 `set master` 和 `mysql.rds_history` 表中记录时间、用户和 `mysql.rds_replication_status` 操作。

对于灾难恢复，您可以将该过程与 [mysql.rds\$1start\$1replication\$1until](#mysql_rds_start_replication_until) 或 [mysql.rds\$1start\$1replication\$1until\$1gtid](mysql-stored-proc-gtid.md#mysql_rds_start_replication_until_gtid) 存储过程一起使用。要将延迟只读副本的更改向前滚动到发生灾难之前的时间，您可以运行 `mysql.rds_set_external_source_with_auto_position` 过程。在 `mysql.rds_start_replication_until_gtid` 过程停止复制后，您可以通过使用[将只读副本提升为独立的数据库实例](USER_ReadRepl.Promote.md)中的说明将只读副本提升为新的主数据库实例。

要使用 `mysql.rds_rds_start_replication_until_gtid` 过程，必须启用基于 GTID 的复制。要跳过已知会导致灾难的特定基于 GTID 的事务，您可以使用 [mysql.rds\$1skip\$1transaction\$1with\$1gtid](mysql-stored-proc-gtid.md#mysql_rds_skip_transaction_with_gtid) 存储过程。有关使用基于 GTID 的复制的更多信息，请参阅[使用基于 GTID 的复制](mysql-replication-gtid.md)。

### 示例


在 MySQL 数据库实例上运行时，下例将该数据库实例配置为在 Amazon RDS 之外运行的某个 MySQL 实例的只读副本。它在 MySQL 数据库实例上将最短复制延迟时间设置为一小时（3600 秒）。在 Amazon RDS 外部运行的 MySQL 源数据库实例的更改在至少一个小时内不会在 MySQL 数据库实例只读副本上应用。

```
call mysql.rds_set_external_source_with_auto_position(
  'Externaldb.some.com',
  3306,
  'repl_user',
  'SomePassW0rd',
  1,
  3600);
```

## mysql.rds\$1set\$1external\$1master\$1with\$1delay（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）
mysql.rds\$1set\$1external\$1master\$1with\$1delay

将 RDS for MySQL 数据库实例配置为在 Amazon RDS 外部运行的 MySQL 实例的只读副本并配置延迟复制。

**重要**  
要运行此过程，必须启用 `autocommit`。要启用它，请将 `autocommit` 参数设置为 `1`。有关修改参数的信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

### 语法


 

```
CALL mysql.rds_set_external_master_with_delay(
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , mysql_binary_log_file_name
  , mysql_binary_log_file_location
  , ssl_encryption
  , delay
);
```

### 参数


 *host\$1name*   
在 Amazon RDS 之外运行并将变为源数据库实例的 MySQL 实例的主机名或 IP 地址。

 *host\$1port*   
在 Amazon RDS 之外运行的要配置为源数据库实例的 MySQL 实例使用的端口。如果网络配置包括转换端口号的 SSH 端口复制，则指定由 SSH 公开的端口号。

 *replication\$1user\$1name*   
对在 Amazon RDS 外部运行的 MySQL 实例具有 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的用户的 ID。建议您向专用于复制的账户提供外部实例。

 *replication\$1user\$1password*   
在 `replication_user_name` 中指定的用户 ID 的密码。

 *mysql\$1binary\$1log\$1file\$1name*   
源数据库实例上包含复制信息的二进制日志的名称。

 *mysql\$1binary\$1log\$1file\$1location*   
`mysql_binary_log_file_name` 二进制日志中复制将开始读取复制信息的位置。  
您可以通过在源数据库实例上运行 `SHOW MASTER STATUS` 来确定二进制日志文件名和位置。

 *ssl\$1encryption*   
指定是否在复制连接中使用安全套接字层（SSL）加密的值。1 表示使用 SSL 加密，0 表示不使用加密。默认值为 0。  
不支持 `MASTER_SSL_VERIFY_SERVER_CERT` 选项。此选项设置为 0，这意味着连接已加密，但未验证证书。

 *delay*   
延迟从源数据库实例复制的最小秒数。  
该参数的限制为一天（86400 秒）。

### 使用说明


 主用户必须运行 `mysql.rds_set_external_master_with_delay` 过程。必须在要配置为在 Amazon RDS 外部运行的 MySQL 实例的只读副本的 MySQL 数据库实例上运行该过程。

 运行 `mysql.rds_set_external_master_with_delay` 之前，您必须先将在 Amazon RDS 之外运行的 MySQL 实例配置为源数据库实例。要连接到在 Amazon RDS 外部运行的 MySQL 实例，您必须指定 `replication_user_name` 和 `replication_user_password` 值。这些值必须指示具有外部 MySQL 实例的 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的复制用户。

**将 MySQL 的外部实例配置为源数据库实例**

1. 通过使用所选的 MySQL 客户端，连接到 MySQL 的外部实例并创建要用于复制的用户账户。以下是示例。

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
   ```

1. 对于 MySQL 的外部实例，向复制用户授予 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限。以下示例为您的域的 `REPLICATION CLIENT` 用户授予所有数据库的 `REPLICATION SLAVE` 和 `'repl_user'` 权限。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com'
   IDENTIFIED BY 'SomePassW0rd'
   ```

有关更多信息，请参阅“[配置与外部源实例之间的二进制日志文件位置复制](MySQL.Procedural.Importing.External.Repl.md)”。

**注意**  
建议您尽可能使用只读副本管理两个 Amazon RDS 数据库实例之间的复制。在执行该操作时，建议您仅使用该存储过程以及其他与复制相关的存储过程。这些做法可以在 Amazon RDS 数据库实例之间实现更复杂的复制拓扑。我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。有关管理 Amazon RDS 数据库实例之间的复制的信息，请参阅[使用数据库实例只读副本](USER_ReadRepl.md)。

在调用 `mysql.rds_set_external_master_with_delay` 将 Amazon RDS 数据库实例配置为只读副本后，可对该只读副本调用 [mysql.rds\$1start\$1replication](#mysql_rds_start_replication) 开始复制过程。您可以调用 [mysql.rds\$1reset\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](#mysql_rds_reset_external_master) 删除只读副本配置。

在调用 `mysql.rds_set_external_master_with_delay` 时，Amazon RDS 在 `set master` 和 `mysql.rds_history` 表中记录时间、用户和 `mysql.rds_replication_status` 操作。

对于灾难恢复，您可以将该过程与 [mysql.rds\$1start\$1replication\$1until](#mysql_rds_start_replication_until) 或 [mysql.rds\$1start\$1replication\$1until\$1gtid](mysql-stored-proc-gtid.md#mysql_rds_start_replication_until_gtid) 存储过程一起使用。要将延迟只读副本的更改向前滚动到发生灾难之前的时间，您可以运行 `mysql.rds_set_external_master_with_delay` 过程。在 `mysql.rds_start_replication_until` 过程停止复制后，您可以通过使用[将只读副本提升为独立的数据库实例](USER_ReadRepl.Promote.md)中的说明将只读副本提升为新的主数据库实例。

要使用 `mysql.rds_rds_start_replication_until_gtid` 过程，必须启用基于 GTID 的复制。要跳过已知会导致灾难的特定基于 GTID 的事务，您可以使用 [mysql.rds\$1skip\$1transaction\$1with\$1gtid](mysql-stored-proc-gtid.md#mysql_rds_skip_transaction_with_gtid) 存储过程。有关使用基于 GTID 的复制的更多信息，请参阅[使用基于 GTID 的复制](mysql-replication-gtid.md)。

`mysql.rds_set_external_master_with_delay` 过程在以下版本的 RDS for MySQL 中可用：
+ MySQL 8.0.26 和更高的 8.0.x 版本
+ 所有 5.7 版本

### 示例


在 MySQL 数据库实例上运行时，下例将该数据库实例配置为在 Amazon RDS 之外运行的某个 MySQL 实例的只读副本。它在 MySQL 数据库实例上将最短复制延迟时间设置为一小时（3600 秒）。在 Amazon RDS 外部运行的 MySQL 源数据库实例的更改在至少一个小时内不会在 MySQL 数据库实例只读副本上应用。

```
call mysql.rds_set_external_master_with_delay(
  'Externaldb.some.com',
  3306,
  'repl_user',
  'SomePassW0rd',
  'mysql-bin-changelog.000777',
  120,
  1,
  3600);
```

## mysql.rds\$1set\$1external\$1source\$1with\$1delay（RDS for MySQL 主要版本 8.4 及更高版本）
mysql.rds\$1set\$1external\$1source\$1with\$1delay

将 RDS for MySQL 数据库实例配置为在 Amazon RDS 外部运行的 MySQL 实例的只读副本并配置延迟复制。

**重要**  
要运行此过程，必须启用 `autocommit`。要启用它，请将 `autocommit` 参数设置为 `1`。有关修改参数的信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

### 语法


```
CALL mysql.rds_set_external_source_with_delay (
  host_name
  , host_port
  , replication_user_name
  , replication_user_password
  , mysql_binary_log_file_name
  , mysql_binary_log_file_location
  , ssl_encryption
  , delay
);
```

### 参数


 *host\$1name*   
在 Amazon RDS 之外运行并将变为源数据库实例的 MySQL 实例的主机名或 IP 地址。

 *host\$1port*   
在 Amazon RDS 之外运行的要配置为源数据库实例的 MySQL 实例使用的端口。如果网络配置包括转换端口号的 SSH 端口复制，则指定由 SSH 公开的端口号。

 *replication\$1user\$1name*   
对在 Amazon RDS 外部运行的 MySQL 实例具有 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的用户的 ID。建议您向专用于复制的账户提供外部实例。

 *replication\$1user\$1password*   
在 `replication_user_name` 中指定的用户 ID 的密码。

 *mysql\$1binary\$1log\$1file\$1name*   
源数据库实例上包含复制信息的二进制日志的名称。

 *mysql\$1binary\$1log\$1file\$1location*   
`mysql_binary_log_file_name` 二进制日志中复制将开始读取复制信息的位置。  
您可以通过在源数据库实例上运行 `SHOW MASTER STATUS` 来确定二进制日志文件名和位置。

 *ssl\$1encryption*   
指定是否在复制连接中使用安全套接字层（SSL）加密的值。1 表示使用 SSL 加密，0 表示不使用加密。默认值为 0。  
不支持 `SOURCE_SSL_VERIFY_SERVER_CERT` 选项。此选项设置为 0，这意味着连接已加密，但未验证证书。

 *delay*   
延迟从源数据库实例复制的最小秒数。  
该参数的限制为一天（86400 秒）。

### 使用说明


管理用户必须运行 `mysql.rds_set_external_source_with_delay` 过程。必须在要配置为在 Amazon RDS 外部运行的 MySQL 实例的只读副本的 MySQL 数据库实例上运行该过程。

 运行 `mysql.rds_set_external_source_with_delay` 之前，您必须先将在 Amazon RDS 之外运行的 MySQL 实例配置为源数据库实例。要连接到在 Amazon RDS 外部运行的 MySQL 实例，您必须指定 `replication_user_name` 和 `replication_user_password` 值。这些值必须指示具有外部 MySQL 实例的 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限的复制用户。

**将 MySQL 的外部实例配置为源数据库实例**

1. 通过使用所选的 MySQL 客户端，连接到 MySQL 的外部实例并创建要用于复制的用户账户。以下是示例。

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
   ```

1. 对于 MySQL 的外部实例，向复制用户授予 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限。以下示例为您的域的 `REPLICATION CLIENT` 用户授予所有数据库的 `REPLICATION SLAVE` 和 `'repl_user'` 权限。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com'
   IDENTIFIED BY 'SomePassW0rd'
   ```

有关更多信息，请参阅“[配置与外部源实例之间的二进制日志文件位置复制](MySQL.Procedural.Importing.External.Repl.md)”。

**注意**  
建议您尽可能使用只读副本管理两个 Amazon RDS 数据库实例之间的复制。在执行该操作时，建议您仅使用该存储过程以及其他与复制相关的存储过程。这些做法可以在 Amazon RDS 数据库实例之间实现更复杂的复制拓扑。我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。有关管理 Amazon RDS 数据库实例之间的复制的信息，请参阅[使用数据库实例只读副本](USER_ReadRepl.md)。

在调用 `mysql.rds_set_external_source_with_delay` 将 Amazon RDS 数据库实例配置为只读副本后，可对该只读副本调用 [mysql.rds\$1start\$1replication](#mysql_rds_start_replication) 开始复制过程。您可以调用 [mysql.rds\$1reset\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）](#mysql_rds_reset_external_source) 删除只读副本配置。

在调用 `mysql.rds_set_external_source_with_delay` 时，Amazon RDS 在 `set master` 和 `mysql.rds_history` 表中记录时间、用户和 `mysql.rds_replication_status` 操作。

对于灾难恢复，您可以将该过程与 [mysql.rds\$1start\$1replication\$1until](#mysql_rds_start_replication_until) 或 [mysql.rds\$1start\$1replication\$1until\$1gtid](mysql-stored-proc-gtid.md#mysql_rds_start_replication_until_gtid) 存储过程一起使用。要将延迟只读副本的更改向前滚动到发生灾难之前的时间，您可以运行 `mysql.rds_set_external_source_with_delay` 过程。在 `mysql.rds_start_replication_until` 过程停止复制后，您可以通过使用[将只读副本提升为独立的数据库实例](USER_ReadRepl.Promote.md)中的说明将只读副本提升为新的主数据库实例。

要使用 `mysql.rds_rds_start_replication_until_gtid` 过程，必须启用基于 GTID 的复制。要跳过已知会导致灾难的特定基于 GTID 的事务，您可以使用 [mysql.rds\$1skip\$1transaction\$1with\$1gtid](mysql-stored-proc-gtid.md#mysql_rds_skip_transaction_with_gtid) 存储过程。有关使用基于 GTID 的复制的更多信息，请参阅[使用基于 GTID 的复制](mysql-replication-gtid.md)。

### 示例


在 MySQL 数据库实例上运行时，下例将该数据库实例配置为在 Amazon RDS 之外运行的某个 MySQL 实例的只读副本。它在 MySQL 数据库实例上将最短复制延迟时间设置为一小时（3600 秒）。在 Amazon RDS 外部运行的 MySQL 源数据库实例的更改在至少一个小时内不会在 MySQL 数据库实例只读副本上应用。

```
call mysql.rds_set_external_source_with_delay(
  'Externaldb.some.com',
  3306,
  'repl_user',
  'SomePassW0rd',
  'mysql-bin-changelog.000777',
  120,
  1,
  3600);
```

## mysql.rds\$1set\$1external\$1source\$1gtid\$1purged


使用来自外部源的指定 GTID 范围设置 [gtid\$1purged](https://dev.mysql.com/doc/refman/8.0/en/replication-options-gtids.html#sysvar_gtid_purged) 系统变量。配置基于 GTID 的复制以使用自动定位来恢复复制时，需要 `gtid_purged` 值。

**重要**  
要运行此过程，必须启用 `autocommit`。要启用它，请将 `autocommit` 参数设置为 `1`。有关修改参数的信息，请参阅 [在 Amazon RDS 中修改数据库参数组中的参数](USER_WorkingWithParamGroups.Modifying.md)。

### 语法


 

```
CALL mysql.rds_set_external_source_gtid_purged(
  server_uuid
  , start_pos
  , end_pos
);
```

### 参数


 *server\$1uuid*   
从中导入 GTID 范围的外部服务器的通用唯一标识符（UUID）。

 *start\$1pos*   
要设置的 GTID 范围的起始位置。

 *end\$1pos*   
要设置的 GTID 范围的结束位置。

### 使用说明


`mysql.rds_set_external_source_gtid_purged` 过程仅适用于 MySQL 8.0.37 及更高的 8.0 版本。

先调用 `mysql.rds_set_external_source_gtid_purged`，然后再调用 [mysql.rds\$1set\$1external\$1master\$1with\$1auto\$1position（RDS for MySQL 主要版本 8.0 及更低版本）](#mysql_rds_set_external_master_with_auto_position)、[mysql.rds\$1set\$1external\$1source\$1with\$1auto\$1position（RDS for MySQL 主要版本 8.4 及更高版本）](#mysql_rds_set_external_source_with_auto_position) 或 [mysql.rds\$1set\$1external\$1source\$1with\$1auto\$1position\$1for\$1channel](mysql-stored-proc-multi-source-replication.md#mysql_rds_set_external_source_with_auto_position_for_channel)。

在调用 `mysql.rds_set_external_source_gtid_purged` 之前，请务必停止数据库的所有活动的复制通道。要检查通道的状态，请使用 `SHOW REPLICA STATUS` MySQL 语句。要停止通道上的复制，请调用 [mysql.rds\$1stop\$1replication\$1for\$1channel](mysql-stored-proc-multi-source-replication.md#mysql_rds_stop_replication_for_channel)。

您指定的 GTID 范围必须是现有 `GTID_PURGED` 值的超集。此存储过程在设置 `GTID_PURGED` 值之前会检查以下各值：
+ `server_uuid` 有效。
+ `start_pos` 的值大于 `0` 并小于 `end_pos` 的值。
+ `end_pos` 的值大于或等于 `start_pos` 的值。

如果在外部服务器上设置的 GTID 包含多个值范围，请考虑使用不同的 GTID 设置值多次调用该过程。

在调用 `mysql.rds_set_external_source_gtid_purged` 时，Amazon RDS 会在 `mysql.rds_history` 表中记录 `set gtid_purged` 的时间、用户和操作。

如果您没有为用于复制的备份适当地设置 `gtid_purged` 值，这可能导致复制过程中事务丢失或重复。执行以下步骤来设置正确的 `gtid_purged` 值。

**对副本设置 gtid\$1purged 值**

1. 确定要用作复制起点的时间点或特定的备份文件。这可能是逻辑备份（mysqldump 文件）或物理备份（Amazon RDS 快照）。

1. 确定 `gtid_executed` 值。此值表示在服务器上提交的所有 GTID 的集合。要检索此值，请在源实例上执行下列操作之一：
   + 在执行备份时运行 SQL 语句 `SELECT @@GLOBAL.GTID_EXECUTED;`。
   + 如果相应的备份实用程序中包含任何相关选项，请从备份文件中提取值。有关更多信息，请参阅 MySQL 文档中的 [set-gtid-purged](https://dev.mysql.com/doc/refman/8.4/en/mysqldump.html#option_mysqldump_set-gtid-purged) 选项。

1. 确定用于调用 `mysql.rds_set_external_source_gtid_purged` 的 `gtid_purged` 值。`gtid_purged` 值应包括已在源实例上执行但不再需要用于复制的所有 GTID。因此，`gtid_purged` 值应是您在上一步中检索到的 `gtid_executed` 值的子集。

   要确定 `gtid_purged` 值，请确定备份中未包含的且不再需要用于复制的 GTID。为此，可以通过分析二进制日志或使用 mysqlbinlog 等工具，来查找从二进制日志中清除的 GTID。

   或者，如果您有一个一致的备份，其中包括截至备份点的所有二进制日志，则可以将 `gtid_purged` 值设置为与备份点处的 `gtid_executed` 值相同。

1. 确定与备份一致的适当 `gtid_purged` 值后，在 RDS for MySQL 数据库实例上调用 `mysql.rds_set_external_source_gtid_purged` 存储过程来设置该值。

### 示例


在 MySQL 数据库实例上运行时，以下示例将从 UUID 为 `12345678-abcd-1234-efgh-123456789abc` 的外部 MySQL 服务器设置 GTID 范围，起始位置为 `1`，结束位置为 `100`。生成的 GTID 值设置为 `+12345678-abcd-1234-efgh-123456789abc:1-100`。

```
CALL mysql.rds_set_external_source_gtid_purged('12345678-abcd-1234-efgh-123456789abc', 1, 100);
```

## mysql.rds\$1set\$1master\$1auto\$1position（RDS for MySQL 主要版本 8.0 及更低版本）
mysql.rds\$1set\$1master\$1auto\$1position

将复制模式设置为基于二进制日志文件位置或全局事务标识符 (GTID)。

### 语法


 

```
CALL mysql.rds_set_master_auto_position (
auto_position_mode
);
```

### 参数


 *auto\$1position\$1mode*   
该值指示是使用日志文件位置复制还是基于 GTID 的复制：  
+ `0` – 使用基于二进制日志文件位置的复制方法。默认为 `0`。
+ `1` – 使用基于 GTID 的复制方法。

### 使用说明


主用户必须运行 `mysql.rds_set_master_auto_position` 过程。

所有 RDS for MySQL 5.7 版本和 RDS for MySQL 8.0.26 及更高的 8.0 版本均支持此过程。

## mysql.rds\$1set\$1source\$1auto\$1position（RDS for MySQL 主要版本 8.4 及更高版本）
mysql.rds\$1set\$1source\$1auto\$1position

将复制模式设置为基于二进制日志文件位置或全局事务标识符 (GTID)。

### 语法


```
CALL mysql.rds_set_source_auto_position (auto_position_mode);
```

### 参数


*auto\$1position\$1mode*  
该值指示是使用日志文件位置复制还是基于 GTID 的复制：  
+  `0` – 使用基于二进制日志文件位置的复制方法。默认为 `0`。
+  `1` – 使用基于 GTID 的复制方法。

### 使用说明


管理用户必须运行 `mysql.rds_set_source_auto_position` 过程。

## mysql.rds\$1set\$1source\$1delay


设置延迟从源数据库实例复制到当前只读副本的最小秒数。在您连接到只读副本时使用该过程来从其源数据库实例延迟复制。

### 语法


```
CALL mysql.rds_set_source_delay(
delay
);
```

### 参数


 *delay*   
延迟从源数据库实例复制的最小秒数。  
该参数的限制为一天（86400 秒）。

### 使用说明


主用户必须运行 `mysql.rds_set_source_delay` 过程。

对于灾难恢复，您可以将该过程与 [mysql.rds\$1start\$1replication\$1until](#mysql_rds_start_replication_until) 或 [mysql.rds\$1start\$1replication\$1until\$1gtid](mysql-stored-proc-gtid.md#mysql_rds_start_replication_until_gtid) 存储过程一起使用。要将延迟只读副本的更改向前滚动到发生灾难之前的时间，您可以运行 `mysql.rds_set_source_delay` 过程。在 `mysql.rds_start_replication_until` 或 `mysql.rds_start_replication_until_gtid` 过程停止复制后，您可以使用[将只读副本提升为独立的数据库实例](USER_ReadRepl.Promote.md)中的说明将只读副本提升为新的主数据库实例。

要使用 `mysql.rds_rds_start_replication_until_gtid` 过程，必须启用基于 GTID 的复制。要跳过已知会导致灾难的特定基于 GTID 的事务，您可以使用 [mysql.rds\$1skip\$1transaction\$1with\$1gtid](mysql-stored-proc-gtid.md#mysql_rds_skip_transaction_with_gtid) 存储过程。有关基于 GTID 的复制的更多信息，请参阅 [使用基于 GTID 的复制](mysql-replication-gtid.md)。

`mysql.rds_set_source_delay` 过程在以下版本的 RDS for MySQL 中可用：
+ 所有 RDS for MySQL 8.4 版本
+ MySQL 8.0.26 和更高的 8.0.x 版本
+ 所有 5.7 版本

### 示例


要将从源数据库实例向当前只读副本的复制延迟至少一个小时（3600 秒），您可以使用以下参数调用 `mysql.rds_set_source_delay`：

```
CALL mysql.rds_set_source_delay(3600);
```

## mysql.rds\$1skip\$1repl\$1error


跳过并删除 MySQL 数据库只读副本上的复制错误。

### 语法


 

```
CALL mysql.rds_skip_repl_error;
```

### 使用说明


主用户必须对只读副本运行 `mysql.rds_skip_repl_error` 过程。有关此过程的更多信息，请参阅[调用 mysql.rds\$1skip\$1repl\$1error 过程](Appendix.MySQL.CommonDBATasks.SkipError.md#Appendix.MySQL.CommonDBATasks.SkipError.procedure)。

要确定是否存在错误，请运行 MySQL `SHOW REPLICA STATUS\G` 命令。如果复制错误不太严重，您可以运行 `mysql.rds_skip_repl_error` 以跳过该错误。如果有多个错误，`mysql.rds_skip_repl_error` 会删除第一个错误，并警告存在其他错误。然后，您可以使用 `SHOW REPLICA STATUS\G` 确定要对下一个错误采取的适当操作。有关返回的值的信息，请参阅 MySQL 文档中的 [SHOW REPLICA STATUS 语法](https://dev.mysql.com/doc/refman/8.0/en/show-replica-status.html)。

想要了解更多有关解决 Amazon RDS 的复制错误的信息，请参阅 [排查 MySQL 只读副本问题](USER_ReadRepl.Troubleshooting.md)。

#### 复制已停止错误


调用 `mysql.rds_skip_repl_error` 过程时，您可能会收到一条错误消息，指出副本已关闭或禁用。

如果您对于主实例而不是只读副本运行该过程，则会出现此错误消息。您必须对只读副本运行此过程，该过程才能正常运行。

如果您对只读副本运行该过程，但无法成功重新启动复制，也可能会出现此错误消息。

如果您需要跳过大量错误，复制滞后时间可能会超出二进制日志 (binlog) 文件的默认保留期。在这种情况下，您可能会遇到一个因二进制日志文件在只读副本上进行重放之前被清除而引发的严重错误。此清除会导致复制停止，而您将无法再调用 `mysql.rds_skip_repl_error` 命令以跳过复制错误。

您可以增加在源数据库实例上保留 binlog 文件的小时数以缓解该问题。在增加二进制日志保留时间后，您可以重新启动复制进程，并根据需要调用 `mysql.rds_skip_repl_error` 命令。

要设置 binlog 保留时间，请使用 [mysql.rds\$1set\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_set_configuration) 过程，并指定 `'binlog retention hours'` 配置参数以及在数据库集群上保留 binlog 文件的小时数。以下示例将 binlog 文件的保留期设置为 48 个小时。

```
CALL mysql.rds_set_configuration('binlog retention hours', 48);
```

## mysql.rds\$1start\$1replication


从 RDS for MySQL 数据库实例发起复制。

**注意**  
您可以使用 [mysql.rds\$1start\$1replication\$1until](#mysql_rds_start_replication_until) 或 [mysql.rds\$1start\$1replication\$1until\$1gtid](mysql-stored-proc-gtid.md#mysql_rds_start_replication_until_gtid) 存储过程从 RDS for MySQL 数据库实例中启动复制，并在指定的二进制日志文件位置停止复制。

### 语法


 

```
CALL mysql.rds_start_replication;
```

### 使用说明


主用户必须运行 `mysql.rds_start_replication` 过程。

要从 Amazon RDS 外部的 MySQL 实例导入数据，请在调用 [mysql.rds\$1set\$1external\$1master（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](#mysql_rds_set_external_master) 或 [mysql.rds\$1set\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）](#mysql_rds_set_external_source) 以构建复制配置后，再对只读副本调用 `mysql.rds_start_replication` 以开始复制过程。有关更多信息，请参阅 [将备份还原到 Amazon RDS for MySQL 数据库实例](MySQL.Procedural.Importing.md)。

要将数据导出到 Amazon RDS 外部的 MySQL 实例，请对只读副本调用 `mysql.rds_start_replication` 和 `mysql.rds_stop_replication` 以控制某些复制操作，如清除二进制日志。有关更多信息，请参阅 [使用复制从 MySQL 数据库实例中导出数据](MySQL.Procedural.Exporting.NonRDSRepl.md)。

您还可以对只读副本调用 `mysql.rds_start_replication`，以便重新启动您先前通过调用 `mysql.rds_stop_replication` 停止的任何复制过程。有关更多信息，请参阅 [使用数据库实例只读副本](USER_ReadRepl.md)。

## mysql.rds\$1start\$1replication\$1until
mysql.rds\$1start\$1replication\$1until

从 RDS for MySQL 数据库实例发起复制，并在指定的二进制日志文件位置停止复制。

### 语法


 

```
CALL mysql.rds_start_replication_until (
replication_log_file
  , replication_stop_point
);
```

### 参数


 *replication\$1log\$1file*   
源数据库实例上包含复制信息的二进制日志的名称。

 *replication\$1stop\$1point *   
`replication_log_file` 二进制日志中复制将停止的位置。

### 使用说明


主用户必须运行 `mysql.rds_start_replication_until` 过程。

`mysql.rds_start_replication_until` 过程在以下版本的 RDS for MySQL 中可用：
+ 所有 RDS for MySQL 8.4 版本
+ MySQL 8.0.26 和更高的 8.0.x 版本
+ 所有 5.7 版本

您可以对延迟复制使用该过程以进行灾难恢复。如果您已配置延迟复制，则可以使用该过程来将延迟只读副本的更改向前滚动到灾难之前的时间。在该过程停止复制后，您可以通过使用[将只读副本提升为独立的数据库实例](USER_ReadRepl.Promote.md)中的说明，将只读副本提升为新的主数据库实例。

您可以使用以下存储过程配置延迟复制：
+ [mysql.rds\$1set\$1configuration](mysql-stored-proc-configuring.md#mysql_rds_set_configuration)
+ [mysql.rds\$1set\$1external\$1master\$1with\$1delay（RDS for MariaDB 和 RDS for MySQL 主要版本 8.0 及更低版本）](#mysql_rds_set_external_master_with_delay)
+ [mysql.rds\$1set\$1external\$1source\$1with\$1delay（RDS for MySQL 主要版本 8.4 及更高版本）](#mysql_rds_set_external_source_with_delay)
+ [mysql.rds\$1set\$1source\$1delay](#mysql_rds_set_source_delay)

为 `replication_log_file` 参数指定的文件名必须与源数据库实例二进制日志文件名匹配。

当 `replication_stop_point` 参数指定位于过去的某个停止位置时，即会立即停止复制。

### 示例


以下示例将启动复制并复制更改，直到它到达 `120` 二进制日志文件中的 `mysql-bin-changelog.000777` 位置。

```
call mysql.rds_start_replication_until(
  'mysql-bin-changelog.000777',
  120);
```

## mysql.rds\$1stop\$1replication


停止从 MySQL 数据库实例中进行复制。

### 语法


 

```
CALL mysql.rds_stop_replication;
```

### 使用说明


主用户必须运行 `mysql.rds_stop_replication` 过程。

如果要配置复制，使其从在 Amazon RDS 外部运行的 MySQL 实例导入数据，则要在导入完成后，再对只读副本调用 `mysql.rds_stop_replication` 以停止复制过程。有关更多信息，请参阅 [将备份还原到 Amazon RDS for MySQL 数据库实例](MySQL.Procedural.Importing.md)。

如果要配置复制，使其将数据导出到在 Amazon RDS 外部运行的 MySQL 实例，则要对只读副本调用 `mysql.rds_start_replication` 和 `mysql.rds_stop_replication` 以控制某些复制操作，如清除二进制日志。有关更多信息，请参阅 [使用复制从 MySQL 数据库实例中导出数据](MySQL.Procedural.Exporting.NonRDSRepl.md)。

您还可以使用 `mysql.rds_stop_replication` 停止两个 Amazon RDS 数据库实例之间的复制。停止复制通常是为了对只读副本执行长时间运行的操作，如在只读副本上创建大型索引。您可以重新启动您通过对只读副本调用 [mysql.rds\$1start\$1replication](#mysql_rds_start_replication) 停止的任何复制过程。有关更多信息，请参阅 [使用数据库实例只读副本](USER_ReadRepl.md)。