Amazon Relational Database Service
用户指南 (API 版本 2014-10-31)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

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

开始前的准备工作

您可以使用复制的事务的二进制日志文件位置配置复制。在 Amazon RDS MySQL 5.7.23 和更高的 MySQL 5.7 版本中,您还可以使用全局事务标识符 (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 文档中的基于语句和基于行的复制的优点和缺点

注意

在所有情况下都应使用本主题中的过程配置复制,除非外部实例是 MariaDB 10.0.2 或更高版本并且 Amazon RDS 实例是 MariaDB。在这种情况下,请使用 将基于 GTID 的复制配置到 Amazon RDS 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 MySQL 或 MariaDB 数据库实例并减少停机时间中的过程。

    针对 Linux、OS X 或 Unix:

    mysqldump --databases <database_name> \ --single-transaction \ --compress \ --order-by-primary \ -u <local_user> \ -p<local_password> | mysql \ --host=hostname \ --port=3306 \ -u <RDS_user_name> \ -p<RDS_password>

    对于 Windows:

    mysqldump --databases <database_name> ^ --single-transaction ^ --compress ^ --order-by-primary ^ -u <local_user> ^ -p<local_password> | mysql ^ --host=hostname ^ --port=3306 ^ -u <RDS_user_name> ^ -p<RDS_password>

    注意

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

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

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

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

    有关生成备份以用于复制的更多信息,请参阅 MySQL 文档中的通过将主实例和副本设为只读来对其进行备份

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

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

    host <RDS_MySQL_DB_host_name>

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

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

    CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY '<password>';
  7. 对于外部 实例,向复制用户授予 REPLICATION CLIENTREPLICATION SLAVE 权限。例如,要为您的域的“repl_user”用户授予对所有数据库的 REPLICATION CLIENTREPLICATION SLAVE 权限,请发出以下命令。

    GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com' IDENTIFIED BY '<password>';
  8. 将 Amazon RDS 数据库实例设置为副本。为此,请使用 mysql.rds_set_external_master 命令以主用户身份连接到 Amazon RDS 数据库实例,并将外部 MySQL 或 MariaDB 数据库指定为复制主实例。使用在步骤 2 中确定的主日志文件名和主日志位置。以下是示例。

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

    注意

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

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

    CALL mysql.rds_start_replication;

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

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

重要

仅在 Amazon RDS MySQL 5.7.23 和更高的 MySQL 5.7 版本上支持基于 GTID 的复制。Amazon RDS MySQL 5.5、5.6 或 8.0 不支持基于 GTID 的复制。

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

  1. 准备基于 GTID 的复制:

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

      gtid_modeON

      enforce_gtid_consistencyON

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

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

      • gtid_modeONON_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 MySQL 或 MariaDB 数据库实例并减少停机时间中的过程。

    针对 Linux、OS X 或 Unix:

    mysqldump --databases <database_name> \ --single-transaction \ --compress \ --order-by-primary \ -u <local_user> \ -p<local_password> | mysql \ --host=hostname \ --port=3306 \ -u <RDS_user_name> \ -p<RDS_password>

    对于 Windows:

    mysqldump --databases <database_name> ^ --single-transaction ^ --compress ^ --order-by-primary ^ -u <local_user> ^ -p<local_password> | mysql ^ --host=hostname ^ --port=3306 ^ -u <RDS_user_name> ^ -p<RDS_password>

    注意

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

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

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

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

    有关生成备份以用于复制的更多信息,请参阅 MySQL 文档中的通过将主实例和副本设为只读来对其进行备份

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

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

    host <RDS_MySQL_DB_host_name>

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

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

    CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY '<password>';
  7. 对于外部 实例,向复制用户授予 REPLICATION CLIENTREPLICATION SLAVE 权限。例如,要为您的域的“repl_user”用户授予对所有数据库的 REPLICATION CLIENTREPLICATION SLAVE 权限,请发出以下命令。

    GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com' IDENTIFIED BY '<password>';
  8. 将 Amazon RDS 数据库实例设置为副本。为此,请使用 mysql.rds_set_external_master_with_auto_position 命令以主用户身份连接到 Amazon RDS 数据库实例,并将外部 MySQL 或 MariaDB 数据库指定为复制主实例。以下是示例。

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

    注意

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

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

    CALL mysql.rds_start_replication;