复制 - Amazon Aurora
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

复制

您可以在连接到 Aurora MySQL 集群中的主实例时,调用以下存储过程。这些过程控制事务如何从外部数据库复制到 Aurora MySQL,或从 Aurora MySQL 复制到外部数据库。要了解如何根据 Aurora MySQL 中的全局事务标识符 (GTID) 使用复制,请参阅 将基于 GTID 的复制用于 Amazon Aurora MySQL

mysql.rds_assign_gtids_to_anonymous_transactions(Aurora MySQL 版本 3)

配置 CHANGE REPLICATION SOURCE TO 语句的 ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS 选项。它使得复制通道将 GTID 分配给没有 GTID 的复制事务。这样,您就可以将二进制日志从不使用基于 GTID 的复制的源复制到使用该复制的副本。有关更多信息,请参阅 MySQL 参考手册中的 CHANGE REPLICATION SOURCE TO 语句从没有 GTID 的源复制到有 GTID 的副本

语法

CALL mysql.rds_assign_gtids_to_anonymous_transactions(gtid_option);

参数

gtid_option

字符串值。允许的值为 OFFLOCAL 或者指定的 UUID。

使用说明

此过程与在社群 MySQL 中发布语句 CHANGE REPLICATION SOURCE TO ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS = gtid_option 的效果相同。

GTID 必须转向 ON 才能使 gtid_option 设置为 LOCAL 或指定的 UUID。

原定设置值为 OFF,这意味着不使用该功能。

LOCAL 会分配一个 GTID,其中包括副本自己的 UUID(server_uuid 设置)。

传递一个作为 UUID 的参数会分配一个包含指定 UUID 的 GTID,例如复制源服务器的 server_uuid 设置。

示例

要关闭此功能:

mysql> call mysql.rds_assign_gtids_to_anonymous_transactions('OFF'); +-------------------------------------------------------------+ | Message | +-------------------------------------------------------------+ | ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS has been set to: OFF | +-------------------------------------------------------------+ 1 row in set (0.07 sec)

要使用副本自己的 UUID:

mysql> call mysql.rds_assign_gtids_to_anonymous_transactions('LOCAL'); +---------------------------------------------------------------+ | Message | +---------------------------------------------------------------+ | ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS has been set to: LOCAL | +---------------------------------------------------------------+ 1 row in set (0.07 sec)

要使用指定的 UUID:

mysql> call mysql.rds_assign_gtids_to_anonymous_transactions('317a4760-f3dd-3b74-8e45-0615ed29de0e'); +----------------------------------------------------------------------------------------------+ | Message | +----------------------------------------------------------------------------------------------+ | ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS has been set to: 317a4760-f3dd-3b74-8e45-0615ed29de0e | +----------------------------------------------------------------------------------------------+ 1 row in set (0.07 sec)

mysql.rds_disable_session_binlog(Aurora MySQL 版本 2)

通过将 sql_log_bin 变量设置为 OFF 来关闭当前会话的二进制日志记录。

语法

CALL mysql.rds_disable_session_binlog;

参数

使用说明

对于 Aurora MySQL 数据库集群,您将在连接到主实例时调用此存储过程。

对于 Aurora,Aurora MySQL 版本 2.12 及更高的与 MySQL 5.7 兼容的版本支持此过程。

注意

在 Aurora MySQL 版本 3 中,如果您具有 SESSION_VARIABLES_ADMIN 权限,则可以使用以下命令禁用当前会话的二进制日志记录:

SET SESSION sql_log_bin = OFF;

mysql.rds_enable_session_binlog(Aurora MySQL 版本 2)

通过将 sql_log_bin 变量设置为 ON 来开启当前会话的二进制日志记录。

语法

CALL mysql.rds_enable_session_binlog;

参数

使用说明

对于 Aurora MySQL 数据库集群,您将在连接到主实例时调用此存储过程。

对于 Aurora,Aurora MySQL 版本 2.12 及更高的与 MySQL 5.7 兼容的版本支持此过程。

注意

在 Aurora MySQL 版本 3 中,如果您具有 SESSION_VARIABLES_ADMIN 权限,则可以使用以下命令启用当前会话的二进制日志记录:

SET SESSION sql_log_bin = ON;

mysql.rds_gtid_purged(Aurora MySQL 版本 3)

将系统变量 gtid_purged 的全局值设置为给定的全局事务标识符(GTID)集。gtid_purged 系统变量是一个 GTID 集,由服务器上已提交但不存在于服务器上任何二进制日志文件中的所有事务的 GTID 组成。

为了与 MySQL 8.0 兼容,有两种方法可以设置 gtid_purged 的值:

  • gtid_purged 的值替换为指定的 GTID 集。

  • 将您指定的 GTID 集附加到 gtid_purged 已经包含的 GTID 集。

语法

要将 gtid_purged 的值替换为您指定的 GTID 集,请执行以下操作:

CALL mysql.rds_gtid_purged (gtid_set);

要将 gtid_purged 的值附加到您指定的 GTID 集,请执行以下操作:

CALL mysql.rds_gtid_purged (+gtid_set);

参数

gtid_set

gtid_set 的值必须是 gtid_purged 的当前值的超集,并且不能与 gtid_subtract(gtid_executed,gtid_purged) 相交。也就是说,新的 GTID 集必须包括 gtid_purged 中已经存在的任何 GTID,并且不能包括 gtid_executed 中尚未清除的任何 GTID。gtid_set 参数也不能包括全局 gtid_owned 集中的任何 GTID,即当前服务器上正在处理的事务的 GTID。

使用说明

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

Aurora MySQL 版本 3.04 及更高版本支持该过程。

示例

以下示例将 GTID 3E11FA47-71CA-11E1-9E33-C80AA9429562:23 分配给 gtid_purged 全局变量。

CALL mysql.rds_gtid_purged('3E11FA47-71CA-11E1-9E33-C80AA9429562:23');

mysql.rds_import_binlog_ssl_material

将证书颁发机构证书、客户端证书和客户端密钥导入到 Aurora MySQL 数据库集群中。SSL 通信和加密复制需要此类信息。

注意

目前,Aurora MySQL 版本 2(2.09.2、2.10.0、2.10.1 和 2.11.0)以及版本 3(3.01.1 及更高版本)支持此过程。

语法

CALL mysql.rds_import_binlog_ssl_material ( ssl_material );

参数

ssl_material

包含 MySQL 客户端的以下 .pem 格式文件内容的 JSON 负载:

  • "ssl_ca":"证书颁发机构证书"

  • "ssl_cert":"客户端证书"

  • "ssl_key":"客户端密钥"

使用说明

在运行该过程之前,为加密复制做好以下准备:

  • 如果您没有在外部 MySQL 源数据库实例上启用 SSL,并且没有准备客户端密钥和客户端证书,请在 MySQL 数据库服务器上启用 SSL 并生成所需的客户端密钥和客户端证书。

  • 如果在外部源数据库实例上启用了 SSL,请提供 Aurora MySQL 数据库集群的客户端密钥和证书。如果未提供,请为 Aurora MySQL 数据库集群生成新密钥和证书。要对客户端证书进行签名,您必须拥有您用来在外部 MySQL 源数据库实例上配置 SSL 的证书颁发机构密钥。

有关更多信息,请参阅 MySQL 文档中的使用 openssl 创建 SSL 证书和密钥

重要

为加密复制做好准备后,使用 SSL 连接来运行该过程。不得通过不安全的连接传输客户端密钥。

该过程会将 SSL 信息从外部 MySQL 数据库导入到 Aurora MySQL 数据库集群中。SSL 信息是 .pem 格式文件,其中包含 Aurora MySQL 数据库集群的 SSL 信息。在加密复制期间,Aurora MySQL 数据库集群充当 MySQL 数据库服务器的客户端。Aurora MySQL 客户端的证书和密钥必须是 .pem 格式的文件。

您可以将这些文件中的信息复制到正确 JSON 负载的 ssl_material 参数中。要支持加密复制,请将此类 SSL 信息导入到 Aurora MySQL 数据库集群中。

JSON 负载必须为以下格式。

'{"ssl_ca":"-----BEGIN CERTIFICATE----- ssl_ca_pem_body_code -----END CERTIFICATE-----\n","ssl_cert":"-----BEGIN CERTIFICATE----- ssl_cert_pem_body_code -----END CERTIFICATE-----\n","ssl_key":"-----BEGIN RSA PRIVATE KEY----- ssl_key_pem_body_code -----END RSA PRIVATE KEY-----\n"}'

示例

以下示例将 SSL 信息导入到 Aurora MySQL。在 .pem 格式文件中,主体代码通常比示例中显示的主体代码长。

call mysql.rds_import_binlog_ssl_material( '{"ssl_ca":"-----BEGIN CERTIFICATE----- AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE -----END CERTIFICATE-----\n","ssl_cert":"-----BEGIN CERTIFICATE----- AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE -----END CERTIFICATE-----\n","ssl_key":"-----BEGIN RSA PRIVATE KEY----- AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE -----END RSA PRIVATE KEY-----\n"}');

mysql.rds_next_master_log(Aurora MySQL 版本 2)

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

语法

CALL mysql.rds_next_master_log( curr_master_log );

参数

curr_master_log

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

注意

以前的 MySQL 版本使用的是 SHOW SLAVE STATUS,而不是 SHOW REPLICA STATUS。如果您使用的 MySQL 版本低于 8.0.23,那么请使用 SHOW SLAVE STATUS

使用说明

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

警告

仅在对作为复制源的多可用区数据库实例进行故障转移后复制失败,并且 mysql.rds_next_master_logLast_IO_Errno 字段报告 I/O 错误 1236 时调用 SHOW REPLICA STATUS

如果在发生失效转移事件之前,源实例中的事务未写入到磁盘上的二进制日志,调用 mysql.rds_next_master_log 可能会导致只读副本丢失数据。

示例

假设复制在 Aurora 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 版本使用的是 SHOW SLAVE STATUS,而不是 SHOW REPLICA STATUS。如果您使用的 MySQL 版本低于 8.0.23,那么请使用 SHOW SLAVE STATUS

mysql.rds_next_source_log(Aurora MySQL 版本 3)

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

语法

CALL mysql.rds_next_source_log( curr_source_log );

参数

curr_source_log

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

使用说明

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

警告

仅在对作为复制源的多可用区数据库实例进行故障转移后复制失败,并且 mysql.rds_next_source_logLast_IO_Errno 字段报告 I/O 错误 1236 时调用 SHOW REPLICA STATUS

如果在发生失效转移事件之前,源实例中的事务未写入到磁盘上的二进制日志,调用 mysql.rds_next_source_log 可能会导致只读副本丢失数据。

示例

假设复制在 Aurora 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_remove_binlog_ssl_material

删除用于 SSL 通信和加密复制的证书颁发机构证书、客户端证书与客户端密钥。此类信息可通过使用 mysql.rds_import_binlog_ssl_material 来导入。

语法

CALL mysql.rds_remove_binlog_ssl_material;

mysql.rds_reset_external_master(Aurora MySQL 版本 2)

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

重要

要运行此过程,必须启用 autocommit。要启用它,请将 autocommit 参数设置为 1。有关修改参数的信息,请参阅 修改数据库参数组中的参数

语法

CALL mysql.rds_reset_external_master;

使用说明

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

注意

我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。我们建议您尽可能使用 Aurora 副本来管理 Aurora MySQL 数据库集群中的复制。有关在 Aurora MySQL 数据库集群中管理复制的信息,请参阅 使用 Aurora 副本

想要了解更多有关使用复制从在 Aurora MySQL 之外运行的 MySQL 实例导入数据的信息,请参阅Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制(二进制日志复制)

mysql.rds_reset_external_source(Aurora MySQL 版本 3)

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

重要

要运行此过程,必须启用 autocommit。要启用它,请将 autocommit 参数设置为 1。有关修改参数的信息,请参阅 修改数据库参数组中的参数

语法

CALL mysql.rds_reset_external_source;

使用说明

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

注意

我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。我们建议您尽可能使用 Aurora 副本来管理 Aurora MySQL 数据库集群中的复制。有关在 Aurora MySQL 数据库集群中管理复制的信息,请参阅 使用 Aurora 副本

mysql.rds_set_binlog_source_ssl(Aurora MySQL 版本 3)

为二进制日志复制启用 SOURCE_SSL 加密。有关更多信息,请参阅 MySQL 文档中的 CHANGE REPLICATION SOURCE TO 语句

语法

CALL mysql.rds_set_binlog_source_ssl(mode);

参数

mode

指示是否启用 SOURCE_SSL 加密的值:

  • 0SOURCE_SSL 加密已禁用。默认为 0

  • 1SOURCE_SSL 加密已启用。您可以使用 SSL 或 TLS 配置加密。

使用说明

Aurora MySQL 版本 3.06 及更高版本支持该过程。

mysql.rds_set_external_master(Aurora MySQL 版本 2)

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

mysql.rds_set_external_master 过程已弃用,并会在将来的版本中删除。请改用 mysql.rds_set_external_source

重要

要运行此过程,必须启用 autocommit。要启用它,请将 autocommit 参数设置为 1。有关修改参数的信息,请参阅 修改数据库参数组中的参数

语法

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_name

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

host_port

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

replication_user_name

对在 Amazon RDS 外部运行的 MySQL 实例具有 REPLICATION CLIENTREPLICATION SLAVE 权限的用户的 ID。建议您向专用于复制的账户提供外部实例。

replication_user_password

replication_user_name 中指定的用户 ID 的密码。

mysql_binary_log_file_name

源数据库实例上包含复制信息的二进制日志的名称。

mysql_binary_log_file_location

mysql_binary_log_file_name 二进制日志中复制将开始读取复制信息的位置。

您可以通过在源数据库实例上运行 SHOW MASTER STATUS 来确定二进制日志文件名和位置。

ssl_encryption

指定是否在复制连接中使用安全套接字层(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_namereplication_user_password 值,这些值指示对 MySQL 的外部实例具有 REPLICATION CLIENTREPLICATION 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';
    注意

    作为安全最佳实践,请指定除此处所示提示以外的密码。

  2. 对于 MySQL 的外部实例,向复制用户授予 REPLICATION CLIENTREPLICATION SLAVE 权限。以下示例向您所在域的“repl_user”用户授予对所有数据库的 REPLICATION CLIENTREPLICATION 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 连接。此外,使用 mysql.rds_import_binlog_ssl_material 过程,将证书颁发机构证书、客户端证书和客户端密钥导入到数据库实例或数据库集群中。

注意

我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。我们建议您尽可能使用 Aurora 副本来管理 Aurora MySQL 数据库集群中的复制。有关在 Aurora MySQL 数据库集群中管理复制的信息,请参阅 使用 Aurora 副本

在调用 mysql.rds_set_external_master 将 Amazon RDS 数据库实例配置为只读副本后,可对该只读副本调用 mysql.rds_start_replication 开始复制过程。您可以调用 mysql.rds_reset_external_master(Aurora MySQL 版本 2) 删除只读副本配置。

调用 mysql.rds_set_external_master 时,Amazon RDS 将时间、用户和 set master 的操作记录在 mysql.rds_historymysql.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, 0);

mysql.rds_set_external_master_with_auto_position(Aurora MySQL 版本 2)

将 Aurora MySQL 主实例配置为接受来自外部 MySQL 实例的传入复制。此过程还会根据全局事务标识符 (GTID) 配置复制。

此过程不会配置延迟复制,因为 Aurora MySQL 不支持延迟复制。

语法

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

参数

host_name

在 Aurora 之外运行以变为复制主实例的 MySQL 实例的主机名或 IP 地址。

host_port

在 Aurora 之外运行的要配置为复制主实例的 MySQL 实例使用的端口。如果网络配置包括转换端口号的安全 Shell (SSH) 端口复制,请指定由 SSH 公开的端口号。

replication_user_name

在对 Aurora 外部运行的 MySQL 实例上具有 REPLICATION CLIENTREPLICATION SLAVE 权限的用户的 ID。建议您向专用于复制的账户提供外部实例。

replication_user_password

replication_user_name 中指定的用户 ID 的密码。

ssl_encryption

目前未实施该选项。默认值是 0。

使用说明

对于 Aurora MySQL 数据库集群,您将在连接到主实例时调用此存储过程。

主用户必须运行 mysql.rds_set_external_master_with_auto_position 过程。主用户在充当复制目标的 Aurora MySQL 数据库集群的主实例上运行此过程。这可能是外部 MySQL 数据库实例或 Aurora MySQL 数据库集群的复制目标。

Aurora MySQL 版本 2 支持该过程。对于 Aurora MySQL 版本 3,请改为使用程序 mysql.rds_set_external_source_with_auto_position(Aurora MySQL 版本 3)

在运行 mysql.rds_set_external_master_with_auto_position 前,请将外部 MySQL 数据库实例配置为复制主实例。要连接到外部 MySQL 实例,应指定 replication_user_namereplication_user_password 值。这些值必须指示具有外部 MySQL 实例上的 REPLICATION CLIENTREPLICATION SLAVE 权限的复制用户。

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

    CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
  2. 在外部 MySQL 实例上,向复制用户授予 REPLICATION CLIENTREPLICATION SLAVE 权限。以下示例为您的域的 REPLICATION CLIENT 用户授予所有数据库的 REPLICATION SLAVE'repl_user' 权限。

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

在调用 mysql.rds_set_external_master_with_auto_position 时,Amazon RDS 将记录某些信息。这些信息包括 "set master"mysql.rds_history 表中的时间、用户和 mysql.rds_replication_status 操作。

要跳过已知会导致问题的基于 GTID 的特定事务,您可以使用 mysql.rds_skip_transaction_with_gtid 存储过程。有关使用基于 GTID 的复制的更多信息,请参阅将基于 GTID 的复制用于 Amazon Aurora MySQL

示例

在 Aurora 主实例上运行时,以下示例将 Aurora 集群配置为充当在 Aurora 之外运行的某个 MySQL 实例的只读副本。

call mysql.rds_set_external_master_with_auto_position( 'Externaldb.some.com', 3306, 'repl_user'@'mydomain.com', 'SomePassW0rd');

mysql.rds_set_external_source(Aurora MySQL 版本 3)

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

重要

要运行此过程,必须启用 autocommit。要启用它,请将 autocommit 参数设置为 1。有关修改参数的信息,请参阅 修改数据库参数组中的参数

语法

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_name

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

host_port

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

replication_user_name

对在 Amazon RDS 外部运行的 MySQL 实例具有 REPLICATION CLIENTREPLICATION SLAVE 权限的用户的 ID。建议您向专用于复制的账户提供外部实例。

replication_user_password

replication_user_name 中指定的用户 ID 的密码。

mysql_binary_log_file_name

源数据库实例上包含复制信息的二进制日志的名称。

mysql_binary_log_file_location

mysql_binary_log_file_name 二进制日志中复制将开始读取复制信息的位置。

您可以通过在源数据库实例上运行 SHOW MASTER STATUS 来确定二进制日志文件名和位置。

ssl_encryption

指定是否在复制连接中使用安全套接字层(SSL)加密的值。1 表示使用 SSL 加密,0 表示不使用加密。默认值是 0。

注意

要启用此选项,您必须已使用 mysql.rds_import_binlog_ssl_material 导入自定义 SSL 证书。如果您尚未导入自定义 SSL 证书,请将此参数设置为 0,然后使用 mysql.rds_set_binlog_source_ssl(Aurora MySQL 版本 3)启用 SSL 以进行二进制日志复制。

不支持 MASTER_SSL_VERIFY_SERVER_CERT 选项。此选项设置为 0,这意味着连接已加密,但未验证证书。

使用说明

主用户必须运行 mysql.rds_set_external_source 过程。该过程必须在以下 Aurora MySQL 数据库实例上运行:也即,该实例将配置为在 Amazon RDS 外部运行的 MySQL 实例的只读副本。

运行 mysql.rds_set_external_source 之前,您必须先将在 Amazon RDS 之外运行的 MySQL 实例配置为源数据库实例。要连接到在 Amazon RDS 之外运行的 MySQL 实例,您必须指定 replication_user_namereplication_user_password 值,这些值指示对 MySQL 的外部实例具有 REPLICATION CLIENTREPLICATION 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';
    注意

    作为安全最佳实践,请指定除此处所示提示以外的密码。

  2. 对于 MySQL 的外部实例,向复制用户授予 REPLICATION CLIENTREPLICATION SLAVE 权限。以下示例向您所在域的“repl_user”用户授予对所有数据库的 REPLICATION CLIENTREPLICATION 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 连接。此外,使用 mysql.rds_import_binlog_ssl_material 过程,将证书颁发机构证书、客户端证书和客户端密钥导入到数据库实例或数据库集群中。

注意

我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。我们建议您尽可能使用 Aurora 副本来管理 Aurora MySQL 数据库集群中的复制。有关在 Aurora MySQL 数据库集群中管理复制的信息,请参阅 使用 Aurora 副本

在调用 mysql.rds_set_external_source 将 Aurora MySQL 数据库实例配置为只读副本后,可对该只读副本调用 mysql.rds_start_replication 以开始复制过程。您可以调用 mysql.rds_reset_external_source 以删除只读副本配置。

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

示例

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

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

mysql.rds_set_external_source_with_auto_position(Aurora MySQL 版本 3)

将 Aurora MySQL 主实例配置为接受来自外部 MySQL 实例的传入复制。此过程还会根据全局事务标识符 (GTID) 配置复制。

语法

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

参数

host_name

在 Aurora 之外运行以变为复制源的 MySQL 实例的主机名或 IP 地址。

host_port

在 Aurora 之外运行的要配置为复制源的 MySQL 实例使用的端口。如果网络配置包括转换端口号的安全 Shell (SSH) 端口复制,请指定由 SSH 公开的端口号。

replication_user_name

在对 Aurora 外部运行的 MySQL 实例上具有 REPLICATION CLIENTREPLICATION SLAVE 权限的用户的 ID。建议您向专用于复制的账户提供外部实例。

replication_user_password

replication_user_name 中指定的用户 ID 的密码。

ssl_encryption

目前未实施该选项。默认值是 0。

注意

使用 mysql.rds_set_binlog_source_ssl(Aurora MySQL 版本 3)启用 SSL 以进行二进制日志复制。

使用说明

对于 Aurora MySQL 数据库集群,您将在连接到主实例时调用此存储过程。

管理用户必须运行 mysql.rds_set_external_source_with_auto_position 过程。管理用户在充当复制目标的 Aurora MySQL 数据库集群的主实例上运行此过程。这可能是外部 MySQL 数据库实例或 Aurora MySQL 数据库集群的复制目标。

仅 Aurora MySQL 版本 3 支持该过程。此过程不会配置延迟复制,因为 Aurora MySQL 不支持延迟复制。

在运行 mysql.rds_set_external_source_with_auto_position 前,请将外部 MySQL 数据库实例配置为复制源。要连接到外部 MySQL 实例,应指定 replication_user_namereplication_user_password 值。这些值必须指示具有外部 MySQL 实例上的 REPLICATION CLIENTREPLICATION SLAVE 权限的复制用户。

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

    CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
  2. 在外部 MySQL 实例上,向复制用户授予 REPLICATION CLIENTREPLICATION SLAVE 权限。以下示例为您的域的 REPLICATION CLIENT 用户授予所有数据库的 REPLICATION SLAVE'repl_user' 权限。

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

在调用 mysql.rds_set_external_source_with_auto_position 时,Amazon RDS 将记录某些信息。这些信息包括 "set master"mysql.rds_history 表中的时间、用户和 mysql.rds_replication_status 操作。

要跳过已知会导致问题的基于 GTID 的特定事务,您可以使用 mysql.rds_skip_transaction_with_gtid/> 存储过程。有关使用基于 GTID 的复制的更多信息,请参阅将基于 GTID 的复制用于 Amazon Aurora MySQL

示例

在 Aurora 主实例上运行时,以下示例将 Aurora 集群配置为充当在 Aurora 之外运行的某个 MySQL 实例的只读副本。

call mysql.rds_set_external_source_with_auto_position( 'Externaldb.some.com', 3306, 'repl_user'@'mydomain.com', 'SomePassW0rd');

mysql.rds_set_master_auto_position(Aurora MySQL 版本 2)

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

语法

CALL mysql.rds_set_master_auto_position ( auto_position_mode );

参数

auto_position_mode

该值指示是使用日志文件位置复制还是基于 GTID 的复制:

  • 0 – 使用基于二进制日志文件位置的复制方法。默认为 0

  • 1 – 使用基于 GTID 的复制方法。

使用说明

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

Aurora MySQL 版本 2 支持该过程。

mysql.rds_set_read_only(Aurora MySQL 版本 3)

为数据库实例全局开启或关闭 read_only 模式。

语法

CALL mysql.rds_set_read_only(mode);

参数

mode

指示是否为数据库实例全局启用 read_only 模式的值:

  • 0OFF。默认值为 0

  • 1ON

使用说明

mysql.rds_set_read_only 存储过程仅修改 read_only 参数。无法在读取器数据库实例上更改 innodb_read_only 参数。

read_only 参数更改在重启时不会保留。要对 read_only 进行永久更改,必须使用 read_only 数据库集群参数。

Aurora MySQL 版本 3.06 及更高版本支持该过程。

mysql.rds_set_session_binlog_format(Aurora MySQL 版本 2)

设置当前会话的二进制日志格式。

语法

CALL mysql.rds_set_session_binlog_format(format);

参数

format

一个表示当前会话的二进制日志格式的值:

  • STATEMENT – 复制源基于 SQL 语句将事件写入二进制日志。

  • ROW – 复制源将事件写入二进制日志,指示各个表行发生更改。

  • MIXED – 日志记录通常基于 SQL 语句,但在某些条件下切换到行。有关更多信息,请参阅 MySQL 文档中的混合二进制日志记录格式

使用说明

对于 Aurora MySQL 数据库集群,您将在连接到主实例时调用此存储过程。

要使用此存储过程,必须为当前会话配置二进制日志记录。

对于 Aurora,Aurora MySQL 版本 2.12 及更高的与 MySQL 5.7 兼容的版本支持此过程。

mysql.rds_set_source_auto_position(Aurora MySQL 版本 3)

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

语法

CALL mysql.rds_set_source_auto_position (auto_position_mode);

参数

auto_position_mode

该值指示是使用日志文件位置复制还是基于 GTID 的复制:

  • 0 – 使用基于二进制日志文件位置的复制方法。默认为 0

  • 1 – 使用基于 GTID 的复制方法。

使用说明

对于 Aurora MySQL 数据库集群,您将在连接到主实例时调用此存储过程。

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

mysql.rds_skip_transaction_with_gtid(Aurora MySQL 版本 2 和 3)

在 Aurora 主实例上跳过复制具有指定全局事务标识符 (GTID) 的事务。

在已知特定 GTID 事务导致问题时,您可以使用该过程进行灾难恢复。请使用该存储过程跳过有问题的事务。有问题的事务示例包括禁用复制、删除重要数据或导致数据库实例变得不可用的事务。

语法

CALL mysql.rds_skip_transaction_with_gtid ( gtid_to_skip );

参数

gtid_to_skip

要跳过的复制事务的 GTID。

使用说明

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

Aurora MySQL 版本 2 和 3 支持该过程。

示例

以下示例将跳过复制具有 GTID 3E11FA47-71CA-11E1-9E33-C80AA9429562:23 的事务。

CALL mysql.rds_skip_transaction_with_gtid('3E11FA47-71CA-11E1-9E33-C80AA9429562:23');

mysql.rds_skip_repl_error

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

语法

CALL mysql.rds_skip_repl_error;

使用说明

主用户必须对只读副本运行 mysql.rds_skip_repl_error 过程。有关此过程的更多信息,请参阅跳过当前的复制错误

要确定是否存在错误,请运行 MySQL SHOW REPLICA STATUS\G 命令。如果复制错误不太严重,您可以运行 mysql.rds_skip_repl_error 以跳过该错误。如果有多个错误,mysql.rds_skip_repl_error 会删除第一个错误,并警告存在其他错误。然后,您可以使用 SHOW REPLICA STATUS\G 确定要对下一个错误采取的适当操作。有关返回的值的信息,请参阅 MySQL 文档中的 SHOW REPLICA STATUS 语法

注意

以前的 MySQL 版本使用的是 SHOW SLAVE STATUS,而不是 SHOW REPLICA STATUS。如果您使用的 MySQL 版本低于 8.0.23,那么请使用 SHOW SLAVE STATUS

有关解决 Aurora MySQL 的复制错误的信息,请参阅诊断并解决 MySQL 读取复制故障

复制已停止错误

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

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

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

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

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

要设置 binlog 保留时间,请使用 mysql.rds_set_configuration 过程,并指定 'binlog retention hours' 配置参数以及在数据库集群上保留 binlog 文件的小时数。以下示例将 binlog 文件的保留期设置为 48 个小时。

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

mysql.rds_start_replication

Aurora MySQL 数据库集群发起复制。

注意

您可以使用 mysql.rds_start_replication_until(Aurora MySQL 版本 3)mysql.rds_start_replication_until_gtid(Aurora MySQL 版本 3) 存储过程从 Aurora MySQL 数据库实例中启动复制,并在指定的二进制日志文件位置停止复制。

语法

CALL mysql.rds_start_replication;

使用说明

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

要从 Amazon RDS 外部的 MySQL 实例导入数据,请在调用 mysql.rds_set_external_master mysql.rds_set_external_source 以构建复制配置后,再对只读副本调用 mysql.rds_start_replication 以开始复制过程。有关更多信息,请参阅 Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制(二进制日志复制)

要将数据导出到 Amazon RDS 外部的 MySQL 实例,请对只读副本调用 mysql.rds_start_replicationmysql.rds_stop_replication 以控制某些复制操作,如清除二进制日志。有关更多信息,请参阅 Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制(二进制日志复制)

您还可以对只读副本调用 mysql.rds_start_replication,以便重新启动您先前通过调用 mysql.rds_stop_replication 停止的任何复制过程。有关更多信息,请参阅 复制已停止错误

mysql.rds_start_replication_until(Aurora MySQL 版本 3)

Aurora MySQL 数据库集群发起复制,并在指定的二进制日志文件位置停止复制。

语法

CALL mysql.rds_start_replication_until ( replication_log_file , replication_stop_point );

参数

replication_log_file

源数据库实例上包含复制信息的二进制日志的名称。

replication_stop_point

replication_log_file 二进制日志中复制将停止的位置。

使用说明

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

Aurora MySQL 版本 3.04 及更高版本支持该过程。

托管式复制不支持 mysql.rds_start_replication_until 存储过程,其中包括以下内容:

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

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

示例

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

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

mysql.rds_start_replication_until_gtid(Aurora MySQL 版本 3)

Aurora MySQL 数据库集群中启动复制,并在指定的全局事务标识符(GTID)后面立即停止复制。

语法

CALL mysql.rds_start_replication_until_gtid(gtid);

参数

gtid

停止复制前的 GTID。

使用说明

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

Aurora MySQL 版本 3.04 及更高版本支持该过程。

托管式复制不支持 mysql.rds_start_replication_until_gtid 存储过程,其中包括以下内容:

gtid 参数指定副本已运行的事务时,将会立即停止复制。

示例

以下示例启动复制并复制更改,直至到达 GTID 3E11FA47-71CA-11E1-9E33-C80AA9429562:23

call mysql.rds_start_replication_until_gtid('3E11FA47-71CA-11E1-9E33-C80AA9429562:23');

mysql.rds_stop_replication

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

语法

CALL mysql.rds_stop_replication;

使用说明

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

如果要配置复制,使其从在 Amazon RDS 外部运行的 MySQL 实例导入数据,则要在导入完成后,再对只读副本调用 mysql.rds_stop_replication 以停止复制过程。有关更多信息,请参阅 Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制(二进制日志复制)

如果要配置复制,使其将数据导出到在 Amazon RDS 外部运行的 MySQL 实例,则要对只读副本调用 mysql.rds_start_replicationmysql.rds_stop_replication 以控制某些复制操作,如清除二进制日志。有关更多信息,请参阅 Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制(二进制日志复制)

托管式复制不支持 mysql.rds_stop_replication 存储过程,其中包括以下内容: