利用 Amazon RDS 外部运行的 MariaDB 或 MySQL 实例进行复制 - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

利用 Amazon RDS 外部运行的 MariaDB 或 MySQL 实例进行复制

您可以设置 RDS for MySQL 或 MariaDB 数据库实例和 Amazon RDS 外部的 MySQL 或 MariaDB 实例之间的复制。

开始前的准备工作

您可以使用复制的事务的二进制日志文件位置配置复制。在 RDS for MySQL 5.7.23 和更高的 MySQL 5.7 版本以及 RDS for MySQL 8.0.26 及更高的 8.0.x 版本中,您也可以使用全局事务标识符 (GTID) 配置复制。

对 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_format 设置为 ROWSTATEMENT (如果您需要特定的二进制日志格式)。重启您的数据库实例以使更改生效。

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

注意

在所有情况下都应使用本主题中的过程配置复制,除非外部实例是 MariaDB 10.0.24 或更高版本并且 Amazon RDS 实例是 MariaDB。在这种情况下,请使用 使用基于 GTID 的复制到 MariaDB 数据库实例中 上的过程设置基于 GTID 的复制。

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

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

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

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

  • 对 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. 通过使用所选的客户端,连接到外部实例并创建要用于复制的用户。请仅将该账户用于复制,并将其限制为您的域以提高安全性。以下是示例。

    MySQL 5.5、5.6 和 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';
  7. 对于外部 实例,向复制用户授予 REPLICATION CLIENTREPLICATION SLAVE 权限。例如,要为您的域的“REPLICATION CLIENT”用户授予对所有数据库的 REPLICATION SLAVErepl_user 权限,请发出以下命令。

    MySQL 5.5、5.6 和 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';
  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;

配置与外部源实例之间的基于 GTID 的复制

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

重要

仅有 RDS for MySQL 版本 5.7.23 和更高的 MySQL 5.7 版本、以及 RDS for MySQL 8.0.26 及更高的 8.0 版本支持基于 GTID 的复制。RDS for MySQL 5.6 不支持基于 GTID 的复制。

配置与外部源实例之间的基于 GTID 的复制

  1. 准备基于 GTID 的复制:

    1. 确保外部 MySQL 或 MariaDB 数据库启用了基于 GTID 的复制。为此,请确保外部数据库将以下参数设置为指定的值:

      gtid_modeON

      enforce_gtid_consistencyON

      有关更多信息,请参阅 MySQL 文档中的使用全局事务标识符进行复制或 MariaDB 文档中的全局事务 ID

    2. 确保与数据库实例关联的参数组具有以下参数设置:

      • gtid_mode - ONON_PERMISSIVEOFF_PERMISSIVE

      • enforce_gtid_consistencyON

      有关参数组的更多信息,请参阅 使用参数组

    3. 如果更改了数据库实例的参数组,请重新引导数据库实例。有关更多信息,请参阅“重启中的数据库实例”。

  2. 将源 MySQL 或 MariaDB 实例设置为只读。

    mysql> FLUSH TABLES WITH READ LOCK; mysql> SET GLOBAL read_only = ON;
  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 数据库实例的 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' IDENTIFIED BY 'password';
  8. 将 Amazon RDS 数据库实例设置为副本。为此,请先以主用户身份连接到 Amazon RDS 数据库实例。然后使用 mysql.rds_set_external_master_with_auto_position 命令,将外部 MySQL 或 MariaDB 数据库标识为复制主实例。以下是示例。

    CALL mysql.rds_set_external_master_with_auto_position ('mymasterserver.mydomain.com', 3306, 'repl_user', 'password', 0, 0);
    注意

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

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

    CALL mysql.rds_start_replication;