配置、启动和停止二进制日志(binlog)复制
以下存储过程控制事务如何从外部数据库复制到 RDS for MySQL,或从 RDS for MySQL 复制到外部数据库。
主题
- mysql.rds_next_master_log
- mysql.rds_reset_external_master
- mysql.rds_set_external_master
- mysql.rds_set_external_master_with_auto_position
- mysql.rds_set_external_master_with_delay
- mysql.rds_set_external_source_gtid_purged
- mysql.rds_set_master_auto_position
- mysql.rds_set_source_delay
- mysql.rds_skip_repl_error
- mysql.rds_start_replication
- mysql.rds_start_replication_until
- mysql.rds_stop_replication
mysql.rds_next_master_log
将源数据库实例日志位置更改为源数据库实例上的下一个二进制日志的开始位置。只有在只读副本上收到复制 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_log
的 Last_IO_Errno
字段报告 I/O 错误 1236 时调用 SHOW REPLICA STATUS
。
如果在发生失效转移事件之前,源实例中的事务未写入到磁盘上的二进制日志,调用 mysql.rds_next_master_log
可能会导致只读副本丢失数据。
您可以通过将源实例参数 sync_binlog
和 innodb_support_xa
设置为 1
来减少发生这种情况的几率,尽管这可能会降低性能。有关更多信息,请参阅 排查 MySQL 只读副本问题。
示例
假设复制在 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 版本使用的是 SHOW SLAVE STATUS
,而不是 SHOW REPLICA STATUS
。如果您使用的 MySQL 版本低于 8.0.23,那么请使用 SHOW SLAVE STATUS
。
mysql.rds_reset_external_master
重新配置 RDS for MySQL 数据库实例,使其不再是在 Amazon RDS 之外运行的某个 MySQL 实例的只读副本。
重要
要运行此过程,必须启用 autocommit
。要启用它,请将 autocommit
参数设置为 1
。有关修改参数的信息,请参阅 在 Amazon RDS 中修改数据库参数组中的参数。
语法
CALL mysql.rds_reset_external_master;
使用说明
主用户必须运行 mysql.rds_reset_external_master
过程。此过程必须运行于一个 MySQL 数据库实例上,后者要作为在 Amazon RDS 之外运行的 MySQL 实例的只读副本而被删除。
注意
我们建议您尽可能使用只读副本管理两个 Amazon RDS 数据库实例之间的复制。在执行该操作时,我们建议您仅使用该存储过程以及其他与复制相关的存储过程。这些做法可以在 Amazon RDS 数据库实例之间实现更复杂的复制拓扑。我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。有关管理 Amazon RDS 数据库实例之间的复制的信息,请参阅使用数据库实例只读副本。
想要了解更多有关使用复制从在 Amazon RDS 之外运行的 MySQL 实例导入数据的信息,请参阅 配置与外部源实例之间的二进制日志文件位置复制。
mysql.rds_set_external_master
将 RDS for MySQL 数据库实例配置为在 Amazon RDS 之外运行的 MySQL 实例的只读副本。
重要
要运行此过程,必须启用 autocommit
。要启用它,请将 autocommit
参数设置为 1
。有关修改参数的信息,请参阅 在 Amazon RDS 中修改数据库参数组中的参数。
注意
您可以使用 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_name
-
在 Amazon RDS 之外运行以变为源数据库实例的 MySQL 实例的主机名或 IP 地址。
-
host_port
-
在 Amazon RDS 之外运行的要配置为源数据库实例的 MySQL 实例使用的端口。如果网络配置包括转换端口号的安全 Shell (SSH) 端口复制,请指定由 SSH 公开的端口号。
-
replication_user_name
-
对在 Amazon RDS 外部运行的 MySQL 实例具有
REPLICATION CLIENT
和REPLICATION 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_name
和 replication_user_password
值,这些值指示对 MySQL 的外部实例具有 REPLICATION CLIENT
和 REPLICATION SLAVE
权限的复制用户。
将 MySQL 的外部实例配置为源数据库实例
通过使用所选的 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
';注意
作为安全最佳实践,请指定除此处所示提示以外的密码。
-
对于 MySQL 的外部实例,向复制用户授予
REPLICATION CLIENT
和REPLICATION SLAVE
权限。以下示例向您所在域的“repl_user”用户授予对所有数据库的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 数据库实例之间的复制的信息,请参阅使用数据库实例只读副本。
在调用 mysql.rds_set_external_master
将 Amazon RDS 数据库实例配置为只读副本后,可对该只读副本调用 mysql.rds_start_replication 开始复制过程。您可以调用 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, 0);
mysql.rds_set_external_master_with_auto_position
将 RDS for MySQL 数据库实例配置为在 Amazon RDS 之外运行的 MySQL 实例的只读副本。该过程还会配置延迟复制和基于全局事务标识符 (GTID) 的复制。
重要
要运行此过程,必须启用 autocommit
。要启用它,请将 autocommit
参数设置为 1
。有关修改参数的信息,请参阅 在 Amazon RDS 中修改数据库参数组中的参数。
语法
CALL mysql.rds_set_external_master_with_auto_position (
host_name
,host_port
,replication_user_name
,replication_user_password
,ssl_encryption
,delay
);
参数
-
host_name
-
在 Amazon RDS 之外运行以变为源数据库实例的 MySQL 实例的主机名或 IP 地址。
-
host_port
-
在 Amazon RDS 之外运行的要配置为源数据库实例的 MySQL 实例使用的端口。如果网络配置包括转换端口号的安全 Shell (SSH) 端口复制,请指定由 SSH 公开的端口号。
-
replication_user_name
-
对在 Amazon RDS 外部运行的 MySQL 实例具有
REPLICATION CLIENT
和REPLICATION SLAVE
权限的用户的 ID。建议您向专用于复制的账户提供外部实例。 -
replication_user_password
-
在
replication_user_name
中指定的用户 ID 的密码。 -
ssl_encryption
-
指定是否在复制连接中使用安全套接字层(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.x 版本均支持此过程。
运行 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 的外部实例配置为源数据库实例
通过使用所选的 MySQL 客户端,连接到 MySQL 的外部实例并创建要用于复制的用户账户。以下是示例。
CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
-
对于 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'
有关更多信息,请参阅“配置与外部源实例之间的二进制日志文件位置复制”。
注意
我们建议您尽可能使用只读副本管理两个 Amazon RDS 数据库实例之间的复制。在执行该操作时,我们建议您仅使用该存储过程以及其他与复制相关的存储过程。这些做法可以在 Amazon RDS 数据库实例之间实现更复杂的复制拓扑。我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。有关管理 Amazon RDS 数据库实例之间的复制的信息,请参阅使用数据库实例只读副本。
在调用 mysql.rds_set_external_master_with_auto_position
之前,务必调用 mysql.rds_set_external_source_gtid_purged,以便使用来自外部源的指定 GTID 范围设置 gtid_purged
系统变量。
在调用 mysql.rds_set_external_master_with_auto_position
将 Amazon RDS 数据库实例配置为只读副本后,可对该只读副本调用 mysql.rds_start_replication 开始复制过程。您可以调用 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_start_replication_until 或 mysql.rds_start_replication_until_gtid 存储过程一起使用。要将延迟只读副本的更改向前滚动到发生灾难之前的时间,您可以运行 mysql.rds_set_external_master_with_auto_position
过程。在 mysql.rds_start_replication_until_gtid
过程停止复制后,您可以通过使用将只读副本提升为独立的数据库实例中的说明将只读副本提升为新的主数据库实例。
要使用 mysql.rds_rds_start_replication_until_gtid
过程,必须启用基于 GTID 的复制。要跳过已知会导致灾难的特定基于 GTID 的事务,您可以使用 mysql.rds_skip_transaction_with_gtid 存储过程。有关使用基于 GTID 的复制的更多信息,请参阅使用基于 GTID 的复制。
示例
在 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', 0, 3600);
mysql.rds_set_external_master_with_delay
将 RDS for MySQL 数据库实例配置为在 Amazon RDS 外部运行的 MySQL 实例的只读副本并配置延迟复制。
重要
要运行此过程,必须启用 autocommit
。要启用它,请将 autocommit
参数设置为 1
。有关修改参数的信息,请参阅 在 Amazon RDS 中修改数据库参数组中的参数。
语法
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_name
-
在 Amazon RDS 之外运行并将变为源数据库实例的 MySQL 实例的主机名或 IP 地址。
-
host_port
-
在 Amazon RDS 之外运行的要配置为源数据库实例的 MySQL 实例使用的端口。如果网络配置包括转换端口号的 SSH 端口复制,则指定由 SSH 公开的端口号。
-
replication_user_name
-
对在 Amazon RDS 外部运行的 MySQL 实例具有
REPLICATION CLIENT
和REPLICATION 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,这意味着连接已加密,但未验证证书。 -
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 的外部实例配置为源数据库实例
-
通过使用所选的 MySQL 客户端,连接到 MySQL 的外部实例并创建要用于复制的用户账户。以下是示例。
CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'SomePassW0rd'
-
对于 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'
有关更多信息,请参阅“配置与外部源实例之间的二进制日志文件位置复制”。
注意
我们建议您尽可能使用只读副本管理两个 Amazon RDS 数据库实例之间的复制。在执行该操作时,我们建议您仅使用该存储过程以及其他与复制相关的存储过程。这些做法可以在 Amazon RDS 数据库实例之间实现更复杂的复制拓扑。我们提供这些存储过程主要是为了与在 Amazon RDS 外部运行的 MySQL 实例之间启用复制。有关管理 Amazon RDS 数据库实例之间的复制的信息,请参阅使用数据库实例只读副本。
在调用 mysql.rds_set_external_master_with_delay
将 Amazon RDS 数据库实例配置为只读副本后,可对该只读副本调用 mysql.rds_start_replication 开始复制过程。您可以调用 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_start_replication_until 或 mysql.rds_start_replication_until_gtid 存储过程一起使用。要将延迟只读副本的更改向前滚动到发生灾难之前的时间,您可以运行 mysql.rds_set_external_master_with_delay
过程。在 mysql.rds_start_replication_until
过程停止复制后,您可以通过使用将只读副本提升为独立的数据库实例中的说明将只读副本提升为新的主数据库实例。
要使用 mysql.rds_rds_start_replication_until_gtid
过程,必须启用基于 GTID 的复制。要跳过已知会导致灾难的特定基于 GTID 的事务,您可以使用 mysql.rds_skip_transaction_with_gtid 存储过程。有关使用基于 GTID 的复制的更多信息,请参阅使用基于 GTID 的复制。
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, 0, 3600);
mysql.rds_set_external_source_gtid_purged
使用来自外部源的指定 GTID 范围设置 gtid_purgedgtid_purged
值。
重要
要运行此过程,必须启用 autocommit
。要启用它,请将 autocommit
参数设置为 1
。有关修改参数的信息,请参阅 在 Amazon RDS 中修改数据库参数组中的参数。
语法
CALL mysql.rds_set_external_source_gtid_purged(
server_uuid
,start_pos
,end_pos
);
参数
-
server_uuid
-
从中导入 GTID 范围的外部服务器的通用唯一标识符(UUID)。
-
start_pos
-
要设置的 GTID 范围的起始位置。
-
end_pos
-
要设置的 GTID 范围的结束位置。
使用说明
mysql.rds_set_external_source_gtid_purged
过程仅适用于 MySQL 8.0.37 和更高的 8.0 版本。
先调用 mysql.rds_set_external_source_gtid_purged
,然后再调用 mysql.rds_set_external_master_with_auto_position 或 mysql.rds_set_external_source_with_auto_position_for_channel。
在调用 mysql.rds_set_external_source_gtid_purged
之前,请务必停止数据库的所有活动的复制通道。要检查通道的状态,请使用 SHOW REPLICA STATUS
MySQL 语句。要停止通道上的复制,请调用 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_purged 值
确定要用作复制起点的时间点或特定的备份文件。这可能是逻辑备份(mysqldump 文件)或物理备份(Amazon RDS 快照)。
确定
gtid_executed
值。此值表示在服务器上提交的所有 GTID 的集合。要检索此值,请在源实例上执行下列操作之一:在执行备份时运行 SQL 语句
SELECT @@GLOBAL.GTID_EXECUTED;
。如果相应的备份实用程序中包含任何相关选项,请从备份文件中提取值。有关更多信息,请参阅 MySQL 文档中的 set-gtid-purged
选项。
确定用于调用
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
值相同。确定与备份一致的适当
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_set_master_auto_position
将复制模式设置为基于二进制日志文件位置或全局事务标识符 (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
过程。
所有 RDS for MySQL 5.7 版本和 RDS for MySQL 8.0.26 及更高的 8.0.x 版本均支持此过程。
mysql.rds_set_source_delay
设置延迟从源数据库实例复制到当前只读副本的最小秒数。在您连接到只读副本时使用该过程来从其源数据库实例延迟复制。
语法
CALL mysql.rds_set_source_delay(
delay
);
参数
-
delay
-
延迟从源数据库实例复制的最小秒数。
该参数的限制为一天(86400 秒)。
使用说明
主用户必须运行 mysql.rds_set_source_delay
过程。
对于灾难恢复,您可以将该过程与 mysql.rds_start_replication_until 或 mysql.rds_start_replication_until_gtid 存储过程一起使用。要将延迟只读副本的更改向前滚动到发生灾难之前的时间,您可以运行 mysql.rds_set_source_delay
过程。在 mysql.rds_start_replication_until
或 mysql.rds_start_replication_until_gtid
过程停止复制后,您可以使用将只读副本提升为独立的数据库实例中的说明将只读副本提升为新的主数据库实例。
要使用 mysql.rds_rds_start_replication_until_gtid
过程,必须启用基于 GTID 的复制。要跳过已知会导致灾难的特定基于 GTID 的事务,您可以使用 mysql.rds_skip_transaction_with_gtid 存储过程。有关基于 GTID 的复制的更多信息,请参阅 使用基于 GTID 的复制。
mysql.rds_set_source_delay
过程在以下版本的 RDS for MySQL 中可用:
-
MySQL 8.0.26 和更高的 8.0.x 版本
-
所有 5.7 版本
示例
要将从源数据库实例向当前只读副本的复制延迟至少一个小时(3600 秒),您可以使用以下参数调用 mysql.rds_set_source_delay
:
CALL mysql.rds_set_source_delay(3600);
mysql.rds_skip_repl_error
跳过并删除 MySQL 数据库只读副本上的复制错误。
语法
CALL mysql.rds_skip_repl_error;
使用说明
主用户必须对只读副本运行 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
。
想要了解更多有关解决 Amazon RDS 的复制错误的信息,请参阅 排查 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
从 RDS for MySQL 数据库实例发起复制。
注意
您可以使用 mysql.rds_start_replication_until 或 mysql.rds_start_replication_until_gtid 存储过程从 RDS for MySQL 数据库实例中启动复制,并在指定的二进制日志文件位置停止复制。
语法
CALL mysql.rds_start_replication;
使用说明
主用户必须运行 mysql.rds_start_replication
过程。
要从 Amazon RDS 外部的 MySQL 实例导入数据,请在调用 mysql.rds_set_external_master
以构建复制配置后,再对只读副本调用 mysql.rds_start_replication
以开始复制过程。有关更多信息,请参阅 将备份还原到 Amazon RDS for MySQL 数据库实例。
要将数据导出到 Amazon RDS 外部的 MySQL 实例,请对只读副本调用 mysql.rds_start_replication
和 mysql.rds_stop_replication
以控制某些复制操作,如清除二进制日志。有关更多信息,请参阅 使用复制从 MySQL 数据库实例中导出数据。
您还可以对只读副本调用 mysql.rds_start_replication
,以便重新启动您先前通过调用 mysql.rds_stop_replication
停止的任何复制过程。有关更多信息,请参阅 使用数据库实例只读副本。
mysql.rds_start_replication_until
从 RDS for 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
过程。
mysql.rds_start_replication_until
过程在以下版本的 RDS for MySQL 中可用:
-
MySQL 8.0.26 和更高的 8.0.x 版本
-
所有 5.7 版本
您可以对延迟复制使用该过程以进行灾难恢复。如果您已配置延迟复制,则可以使用该过程来将延迟只读副本的更改向前滚动到灾难之前的时间。在该过程停止复制后,您可以通过使用将只读副本提升为独立的数据库实例中的说明,将只读副本提升为新的主数据库实例。
您可以使用以下存储过程配置延迟复制:
为 replication_log_file
参数指定的文件名必须与源数据库实例二进制日志文件名匹配。
当 replication_stop_point
参数指定位于过去的某个停止位置时,即会立即停止复制。
示例
以下示例将启动复制并复制更改,直到它到达 120
二进制日志文件中的 mysql-bin-changelog.000777
位置。
call mysql.rds_start_replication_until( 'mysql-bin-changelog.000777', 120);
mysql.rds_stop_replication
停止从 MySQL 数据库实例中进行复制。
语法
CALL mysql.rds_stop_replication;
使用说明
主用户必须运行 mysql.rds_stop_replication
过程。
如果要配置复制,使其从在 Amazon RDS 外部运行的 MySQL 实例导入数据,则要在导入完成后,再对只读副本调用 mysql.rds_stop_replication
以停止复制过程。有关更多信息,请参阅 将备份还原到 Amazon RDS for MySQL 数据库实例。
如果要配置复制,使其将数据导出到在 Amazon RDS 外部运行的 MySQL 实例,则要对只读副本调用 mysql.rds_start_replication
和 mysql.rds_stop_replication
以控制某些复制操作,如清除二进制日志。有关更多信息,请参阅 使用复制从 MySQL 数据库实例中导出数据。
您还可以使用 mysql.rds_stop_replication
停止两个 Amazon RDS 数据库实例之间的复制。停止复制通常是为了对只读副本执行长时间运行的操作,如在只读副本上创建大型索引。您可以重新启动您通过对只读副本调用 mysql.rds_start_replication 停止的任何复制过程。有关更多信息,请参阅 使用数据库实例只读副本。