配置与外部源实例之间的二进制日志文件位置复制 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

配置与外部源实例之间的二进制日志文件位置复制

您可以使用二进制日志文件复制来设置 RDS for MySQL 或 MariaDB 数据库实例与 Amazon RDS 外部的 MySQL 或 MariaDB 实例之间的复制。

开始前的准备工作

您可以使用复制的事务的二进制日志文件位置配置复制。

对 Amazon RDS 数据库实例启动复制功能所需的权限受到限制且对 Amazon RDS 主用户不可用。因此,请确保您使用 Amazon RDS mysql.rds_set_external_mastermysql.rds_start_replication 命令来设置活动数据库和 Amazon RDS 数据库之间的复制。

要为 MySQL 或 MariaDB 数据库设置二进制日志记录格式,请更新 binlog_format 参数。如果数据库实例使用默认的数据库实例参数组,则创建一个新的数据库参数组来修改 binlog_format 设置。建议您对 binlog_format 使用默认设置,也即 MIXED。不过,如果您需要特定的二进制日志 (binlog) 格式,也可以将 binlog_format 设置为 ROWSTATEMENT。重启您的数据库实例以使更改生效。

有关设置 binlog_format 参数的信息,请参阅配置 RDS for MySQL 二进制日志记录。有关不同 MySQL 复制类型的含义的信息,请参阅 MySQL 文档中的基于语句和基于行的复制的优点和缺点

注意

从 RDS for MySQL 版本 8.0.36 开始,Amazon RDS 不复制 mysql 数据库。因此,如果 Amazon RDS 副本上的外部数据库中有您需要的用户,请务必手动创建这些用户。

配置与外部源实例之间的二进制日志文件位置复制

对 Amazon RDS 设置外部源实例和副本时,请遵循以下准则:

  • 监控作为副本的 Amazon RDS 数据库实例的故障转移事件。如果发生故障转移,则可能会在具有不同的网络地址的新主机上重新创建作为副本的数据库实例。有关如何监控故障转移事件的信息,请参阅使用 Amazon RDS 事件通知

  • 在您的源实例上维护二进制日志,直至您确认其已应用于副本。该维护确保在发生故障时可以还原源实例。

  • 对 Amazon RDS 数据库实例启用自动备份。通过启用自动备份,可以确保在需要重新同步源实例和副本时能够将副本还原到特定时间点。有关备份和时间点还原的信息,请参阅备份、还原和导出数据

配置与外部源实例之间的二进制日志文件复制
  1. 将源 MySQL 或 MariaDB 实例设置为只读。

    mysql> FLUSH TABLES WITH READ LOCK; mysql> SET GLOBAL read_only = ON;
  2. 对源 MySQL 或 MariaDB 实例运行 SHOW MASTER STATUS 命令以确定二进制日志位置。

    您将收到类似于以下示例的输出。

    File Position ------------------------------------ mysql-bin-changelog.000031 107 ------------------------------------
  3. 使用 mysqldump 将数据库从外部实例复制到 Amazon RDS 数据库实例。对于非常大的数据库,您可能需要使用将数据导入到停机时间更少的 Amazon RDS MariaDB 或 MySQL 实例中的过程。

    对于 Linux、macOS 或 Unix:

    mysqldump --databases database_name \ --single-transaction \ --compress \ --order-by-primary \ -u local_user \ -plocal_password | mysql \ --host=hostname \ --port=3306 \ -u RDS_user_name \ -pRDS_password

    对于 Windows:

    mysqldump --databases database_name ^ --single-transaction ^ --compress ^ --order-by-primary ^ -u local_user ^ -plocal_password | mysql ^ --host=hostname ^ --port=3306 ^ -u RDS_user_name ^ -pRDS_password
    注意

    确保 -p 选项和输入的密码之间没有空格。

    要指定主机名、用户名、端口和密码以连接到 Amazon RDS 数据库实例,请在 --host 命令中使用 --user (-u)--port-pmysql 选项。主机名是 Amazon RDS 数据库实例端点中的域名服务 (DNS) 名称,例如 myinstance.123456789012.us-east-1.rds.amazonaws.com。您可以在 Amazon Web Services Management Console上的实例详细信息中找到终端节点值。

  4. 再次将源 MySQL 或 MariaDB 实例设置为可写。

    mysql> SET GLOBAL read_only = OFF; mysql> UNLOCK TABLES;

    有关生成备份以用于复制的更多信息,请参阅 MySQL 文档

  5. 在 Amazon Web Services Management Console 中,将托管外部数据库的服务器的 IP 地址添加到 Amazon RDS 数据库实例的 Virtual Private Cloud (VPC) 安全组中。有关修改 VPC 安全组的更多信息,请参阅 Amazon Virtual Private Cloud 用户指南 中的您的 VPC 的安全组

    在满足以下条件时,IP 地址可能会发生更改:

    • 您正在使用公有 IP 地址在外部源实例和数据库实例之间进行通信。

    • 外部源实例已停止并重新启动。

    如果满足这些条件,请在添加 IP 地址之前先对其进行验证。

    您可能还需要配置本地网络,以允许来自 Amazon RDS 数据库实例的 IP 地址的连接。通过执行此操作,您的本地网络可以与外部 MySQL 或 MariaDB 实例进行通信。要查找 Amazon RDS 数据库实例的 IP 地址,请使用 host 命令。

    host db_instance_endpoint

    主机名是 Amazon RDS 数据库实例终端节点中的 DNS 名称。

  6. 通过使用所选的客户端,连接到外部实例并创建要用于复制的用户。请仅将该账户用于复制,并将其限制为您的域以提高安全性。示例如下:

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

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

  7. 对于外部 实例,向复制用户授予 REPLICATION CLIENTREPLICATION SLAVE 权限。例如,要为您的域的“REPLICATION CLIENT”用户授予对所有数据库的 REPLICATION SLAVErepl_user 权限,请发出以下命令。

    GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com';
  8. 将 Amazon RDS 数据库实例设置为副本。为此,请先以主用户身份连接到 Amazon RDS 数据库实例。然后使用 mysql.rds_set_external_master 命令,将外部 MySQL 或 MariaDB 数据库标识为源实例。使用在步骤 2 中确定的主日志文件名和主日志位置。示例如下:

    CALL mysql.rds_set_external_master ('mymasterserver.mydomain.com', 3306, 'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 0);
    注意

    在 RDS for MySQL 上,可以选择通过运行 mysql.rds_set_external_master_with_delay 存储过程来使用延迟复制。在 RDS for MySQL 中,使用延迟复制的一个原因是,使用 mysql.rds_start_replication_until 存储过程打开灾难恢复。目前,RDS for MariaDB 支持延迟复制,但不支持 mysql.rds_start_replication_until 过程。

  9. 在 Amazon RDS 数据库实例上,发出 mysql.rds_start_replication 命令以启动复制。

    CALL mysql.rds_start_replication;