Amazon Relational Database Service
用户指南 (API Version 2014-10-31)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库群集之间的复制

由于 Amazon Aurora 与 MySQL 兼容,因此可以在 MySQL 数据库与 Amazon Aurora 数据库群集之间设置复制。建议您的 MySQL 数据库运行 MySQL 版本 5.5 或更高版本。在设置的复制中,可以将您的 Amazon Aurora 数据库群集作为复制主体或副本,并且可以与 Amazon RDS MySQL 数据库实例、Amazon RDS 外部的 MySQL 数据库或其他 Amazon Aurora 数据库群集间进行复制。

还可以与其他 AWS 区域中的 Amazon RDS MySQL 数据库实例或 Amazon Aurora 数据库群集间进行复制。跨 AWS 区域执行复制时,请确保您的数据库群集和数据库实例可公开访问。Amazon Aurora 数据库群集必须是您的 VPC 中公有子网的一部分。

警告

在 Amazon Aurora 与 MySQL 之间复制时,必须确保仅使用 InnoDB 表。如果有 MyISAM 表需要复制,可以在设置复制之前使用以下命令将其转换为 InnoDB:

alter table <schema>.<table_name> engine=innodb, algorithm=copy;

使用 Amazon Aurora 设置 MySQL 复制的步骤如下 (本主题后文有详细讨论)。

1. 在复制主体上启用二进制日志记录

2. 在复制主体上保留二进制日志,直到不再需要

3. 创建复制主体的快照

4. 将快照加载到副本中

5. 启用复制

6. 监控副本

设置与 MySQL 或其他 Aurora 数据库群集的复制

要使用 MySQL 设置 Aurora 复制,请执行以下步骤。

1. 在复制主体上启用二进制日志记录

在下面查找有关如何在数据库引擎的复制主体上启用二进制日志记录的说明。

数据库引擎 说明

Aurora

在 Amazon Aurora 数据库群集上启用二进制日志记录

binlog_format 参数设置为 ROWSTATEMENTMIXED。建议 MIXED,除非您有特定二进制日志格式需求。

binlog_format 参数在 default.aurora5.6 群集参数组中,其默认值为 OFF。如果要将 binlog_format 参数从 OFF 更改为其他值,您需要重启 Aurora 数据库群集以使更改生效。

有关更多信息,请参阅 数据库群集和数据库实例参数使用数据库参数组

RDS MySQL

在 Amazon RDS 数据库实例上启用二进制日志记录

您不能直接为 Amazon RDS 数据库实例启用二进制日志记录,但可以通过执行以下操作之一来启用它:

MySQL (外部)

在外部 MySQL 数据库上启用二进制日志记录

  1. 从命令外壳中停止 mysql 服务:

    sudo service mysqld stop
  2. 编辑 my.cnf 文件 (此文件通常位于 /etc 下):

    sudo vi /etc/my.cnf

    log_binserver_id 选项添加到 [mysqld] 节。log_bin 选项为二进制日志文件提供文件名标识符。server_id 选项为主-副本关系中的服务器提供唯一标识符。

    以下示例显示 my.cnf 文件的已更新的 [mysqld] 节:

    [mysqld] log-bin=mysql-bin server-id=1

    此外,必须将 MySQL 数据库实例的 sql_mode 选项设置为 0,否则不得将该选项包含在 my.cnf 文件中。

    有关更多信息,请参阅 MySQL 文档中的设置复制主配置

  3. 启动 mysql 服务:

    sudo service mysqld start

2. 在复制主体上保留二进制日志,直到不再需要

使用 MySQL 二进制日志复制时,Amazon RDS 不会对复制过程进行管理。因此,您需要确保复制主体上的二进制日志文件保留到更改应用于副本之后。保留这些文件可帮助确保在发生故障时可还原您的主数据库。

在下面查找有关如何为数据库引擎保留二进制日志的说明。

数据库引擎 说明

Aurora

在 Amazon Aurora 数据库群集上保留二进制日志

您无法访问 Amazon Aurora 数据库群集的二进制日志文件。因此,您必须为复制主体上的二进制日志文件选择足够长的保留时间,从而确保在 Amazon RDS 删除二进制日志文件之前将更改应用于副本。Amazon Aurora 数据库群集上的二进制日志文件最多可以保留 90 天。

如果所设置的复制以 MySQL 数据库或 RDS MySQL 数据库实例作为副本,并且要创建副本的数据库非常大,请为二进制日志文件选择较长的保留时间,直到数据库到副本的初始复制完成,并且副本滞后达到 0。

要设置二进制日志保留时间范围,请使用 mysql.rds_set_configuration 过程并指定 'binlog retention hours' 配置参数以及在数据库群集上保留二进制日志文件的小时数 (最多 2160,即 90 天)。以下示例将二进制日志文件的保留期设置为 6 天:

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

复制开始之后,可以对副本运行 SHOW SLAVE STATUS 命令并检查 Seconds behind master 字段,以验证更改是否已经应用于副本。如果 Seconds behind master 字段为 0,则表示不存在副本滞后。不存在副本滞后时,请通过将 binlog retention hours 配置参数设置为更短的时间范围缩短保留二进制日志文件的时间。

RDS MySQL

在 Amazon RDS 数据库实例上保留二进制日志

您也可以通过设置二进制日志保留小时数在 Amazon RDS 数据库实例上保留二进制日志文件,就如同 Amazon Aurora 数据库群集一样 (如上一节所述)。

还可以通过为数据库实例创建只读副本,在 Amazon RDS 数据库实例上保留二进制日志文件。此只读副本是临时副本,仅用于保留二进制日志文件的目的。创建只读副本之后,可对只读副本调用 mysql.rds_stop_replication 过程 (mysql.rds_stop_replication 过程只适用于 MySQL 5.5、5.6、5.7 版及更高版本)。复制停止时,Amazon RDS 不会删除复制主体上的任何二进制日志文件。设置与永久副本间的复制之后,可以在复制主体与永久副本之间的副本滞后 (Seconds behind master 字段) 达到 0 时删除只读副本。

MySQL (外部)

在外部 MySQL 数据库上保留二进制日志

外部 MySQL 数据库上的二进制日志文件不由 Amazon RDS 进行管理,因此它们会一直保留,直到由您删除。

复制开始之后,可以对副本运行 SHOW SLAVE STATUS 命令并检查 Seconds behind master 字段,以验证更改是否已经应用于副本。如果 Seconds behind master 字段为 0,则表示不存在副本滞后。不存在副本滞后时,可以删除旧的二进制日志文件。

3. 创建复制主体的快照

使用复制主体的快照将数据的基线副本加载到您的副本上,然后从该点开始复制。

在下面查找有关如何创建数据库引擎的复制主体的快照的说明。

数据库引擎 说明

Aurora

创建 Amazon Aurora 数据库群集的快照

  1. 创建 Amazon Aurora 数据库群集的数据库群集快照。有关更多信息,请参阅 创建数据库快照

  2. 通过从刚创建的数据库群集快照进行还原来创建新的 Aurora 数据库群集。确保为存储的数据库群集保留的数据库参数组与为原始数据库群集保留的相同。这将确保数据库群集的副本已启用二进制日志记录。有关更多信息,请参阅 从数据库快照中还原

  3. 在控制台中,选择 Instances,然后为您还原的 Aurora 数据库群集选择主实例 (写入方)。查看警报和近期事件。显示的事件消息将包括二进制日志文件名和位置。事件消息采用以下格式:

    Binlog position from crash recovery is binlog-file-name binlog-position

    例如,下面显示二进制日志文件名为 mysql-bin-changelog.000003、二进制日志位置为 4278 的事件消息。

     Amazon Aurora 二进制日志文件名和位置

    在开始复制时,保存二进制日志文件名和位置的值。

    您也可以通过 AWS CLI 调用 describe-events 命令来获取二进制日志文件名和位置。下面是包含输出的 describe-events 命令的示例。

    PROMPT> aws rds describe-events
    { "Events": [ { "EventCategories": [], "SourceType": "db-instance", "SourceArn": "arn:aws-cn:rds:us-west-2:123456789012:db:sample-restored-instance", "Date": "2016-10-28T19:43:46.862Z", "Message": "Binlog position from crash recovery is mysql-bin-changelog.000003 4278", "SourceIdentifier": "sample-restored-instance" } ] }
  4. 如果您的副本将作为其他区域中的 Aurora 数据库群集、由其他 AWS 账户拥有的 Aurora 数据库群集、外部 MySQL 数据库或 RDS MySQL 数据库实例,则无法从 Amazon Aurora 数据库群集快照加载数据。但您可以通过使用 MySQL 客户端连接到数据库群集并发出 mysqldump 命令,创建 Amazon Aurora 数据库群集的转储。请务必针对您创建的 Amazon Aurora 数据库群集的副本运行 mysqldump 命令。以下是示例:

    PROMPT> mysqldump --databases <database_name> --single-transaction --order-by-primary -r backup.sql -u <local_user> -p
  5. 完成从新创建的 Aurora 数据库群集创建数据转储之后,请删除数据库群集,因为不再需要它。

RDS MySQL

创建 Amazon RDS 数据库实例的快照

  1. 创建 Amazon RDS 数据库实例的只读副本。有关创建只读副本的更多信息,请参阅创建只读副本

  2. 连接到只读副本,然后通过运行 mysql.rds_stop_replication 命令停止复制。

  3. 在只读副本处于 Stopped 状态期间,连接到只读副本并运行 SHOW SLAVE STATUS 命令。从 Relay_Master_Log_File 字段检索当前二进制日志文件名,并从 Exec_Master_Log_Pos 字段检索日志文件位置。在开始复制时保存这些值。

  4. 在只读副本保持 Stopped 状态期间,创建只读副本的数据库快照。有关创建数据库快照的更多信息,请参阅创建数据库快照

  5. 删除只读副本。

MySQL (外部)

创建外部 MySQL 数据库的快照

  1. 创建快照之前,您需要确保快照的二进制日志位置随主实例中的数据保持最新状态。为此,必须先使用以下命令停止对实例进行的任何写入操作:

    mysql> FLUSH TABLES WITH READ LOCK;
  2. 使用 mysqldump 命令创建 MySQL 数据库的转储,如下所示:

    PROMPT> sudo mysqldump --databases <database_name> --master-data=2 --single-transaction --order-by-primary -r backup.sql -u <local_user> -p
  3. 创建快照之后,请使用以下命令解锁 MySQL 数据库中的表:

    mysql> UNLOCK TABLES;

4. 将快照加载到副本中

将复制主体的快照加载到副本之前,请务必考虑以下事项:

  • 如果将要跨 AWS 区域进行复制,则无法使用 Amazon Aurora 数据库群集快照加载副本。数据库群集快照不能跨区域复制。若要跨区域进行复制,则可以通过 RDS MySQL 数据库实例的数据库快照在其他区域中创建 Amazon Aurora 数据库实例。将数据库快照复制到将要托管您的复制从属的区域,然后从该快照创建 Amazon Aurora 数据库群集或 MySQL 数据库实例。有关将快照复制到其他区域的信息,请参阅复制数据库快照或数据库群集快照

  • 如果您将要从 Amazon RDS 外部的 MySQL 数据库转储加载数据,则您可能要创建用于将转储文件复制到其中的 EC2 实例,然后从该 EC2 实例将数据加载到数据库群集或数据库实例中。使用此方法时,您可以在将转储文件复制到 EC2 实例之前压缩它们,以便降低与向 Amazon RDS 复制数据关联的网络成本。在网络中进行传输时,还可以加密转储文件以保护数据。

在下面查找有关如何将复制主体的快照加载到数据库引擎的副本的说明。

数据库引擎 说明

Aurora

将快照加载到 Amazon Aurora 数据库群集中

  • 如果主副本的快照是数据库群集快照,则可以从数据库群集快照进行还原以创建新的 Amazon Aurora 数据库群集作为副本。有关更多信息,请参阅 从数据库快照中还原

  • 如果主副本的快照是数据库快照,则可以将数据从数据库快照迁移到新的 Amazon Aurora 数据库群集中。有关更多信息,请参阅 将数据迁移到 Amazon Aurora 数据库群集

  • 如果主副本的快照是 mysqldump 命令的输出,请按照以下步骤操作:

    1. mysqldump 命令的输出从主副本复制到也可以连接到 Amazon Aurora 数据库群集的位置。

    2. 使用 mysql 命令连接到 Amazon Aurora 数据库群集。以下是示例:

      PROMPT> mysql -h <host_name> -port=3306 -u <db_master_user> -p
    3. mysql 提示符下,运行 source 命令并向它传递您的数据库转储文件名,以便将数据加载到 Amazon Aurora 数据库群集中,例如:

      mysql> source backup.sql;

RDS MySQL

将快照加载到 Amazon RDS 数据库实例中

  1. mysqldump 命令的输出从主副本复制到也可以连接到 MySQL 数据库实例的位置。

  2. 使用 mysql 命令连接到 MySQL 数据库实例。以下是示例:

    PROMPT> mysql -h <host_name> -port=3306 -u <db_master_user> -p
  3. mysql 提示符下,运行 source 命令并向它传递您的数据库转储文件名,以便将数据加载到 MySQL 数据库实例中,例如:

    mysql> source backup.sql;

MySQL (外部)

将快照加载到外部 MySQL 数据库中

无法将数据库快照或数据库群集快照加载到外部 MySQL 数据库中。您必须使用 mysqldump 命令的输出。

  1. mysqldump 命令的输出从主副本复制到也可以连接到 MySQL 数据库的位置。

  2. 使用 mysql 命令连接到 MySQL 数据库。以下是示例:

    PROMPT> mysql -h <host_name> -port=3306 -u <db_master_user> -p
  3. mysql 提示符下,运行 source 命令并向它传递您的数据库转储文件名,以便将数据加载到 MySQL 数据库中,例如:

    mysql> source backup.sql;

5. 启用复制

启用复制之前,我们建议您先创建 Amazon Aurora 数据库群集或 RDS MySQL 数据库实例副本的手动快照,然后再开始复制。如果出现问题,而您需要重新建立与数据库群集或数据库实例副本间的复制,则可从此快照还原数据库群集或数据块实例,而不必再次将数据导入您的副本之中。

您可能还需要创建专用于复制的用户 ID。该用户 ID 需要 REPLICATION CLIENTREPLICATION SLAVE 权限。以下是示例:

REPLICATION CLIENT and REPLICATION SLAVE privileges. For example: CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY '<password>'; GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com' IDENTIFIED BY '<password>';

在下面查找有关如何对数据库引擎启用复制的说明。

数据库引擎 说明

Aurora

从 Amazon Aurora 数据库群集实现复制

  1. 如果数据库群集是从数据库群集快照创建的,请连接到数据库实例并发出 SHOW MASTER STATUS 命令。从 File 字段检索当前二进制日志文件名,并从 Position 字段检索日志文件位置。

    如果数据库群集是从数据库快照创建的,则您需要作为复制起点的二进制日志文件和二进制日志位置。创建复制主体的快照时,您通过 SHOW SLAVE STATUS 命令检索了这些值。

    如果数据库群集是从使用 --master-data=2 选项的 mysqldump 命令的输出填充的,则二进制日志文件和二进制日志位置包含在该输出中。以下是示例:

    -- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000031', MASTER_LOG_POS=107;
  2. 连接到数据库群集,然后发出 mysql.rds_set_external_mastermysql.rds_start_replication 命令,以便使用上一步获得的二进制日志文件名和位置启动与复制主体间的复制。以下是示例:

    CALL mysql.rds_set_external_master ('mydbinstance.123456789012.us-east-1.rds.amazonaws.com', 3306, 'repl_user', '<password>', 'mysql-bin-changelog.000031', 107, 0); CALL mysql.rds_start_replication;

RDS MySQL

启用从 Amazon RDS 数据库实例进行复制

  1. 如果数据库实例是从数据库快照创建的,则您需要作为复制起点的二进制日志文件和二进制日志位置。创建复制主体的快照时,您通过 SHOW SLAVE STATUS 命令检索了这些值。

    如果数据库实例是从使用 --master-data=2 选项的 mysqldump 命令的输出填充的,则二进制日志文件和二进制日志位置包含在该输出中。以下是示例:

    -- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000031', MASTER_LOG_POS=107;
  2. 连接到数据库实例,然后发出 mysql.rds_set_external_mastermysql.rds_start_replication 命令,以便使用上一步获得的二进制日志文件名和位置启动与复制主体间的复制。以下是示例:

    CALL mysql.rds_set_external_master ('mydbcluster.cluster-123456789012.us-east-1.rds.amazonaws.com', 3306, 'repl_user', '<password>', 'mysql-bin-changelog.000031', 107, 0); CALL mysql.rds_start_replication;

MySQL (外部)

启用从外部 MySQL 数据库进行复制

  1. 检索作为复制起点的二进制日志文件和二进制日志位置。创建复制主体的快照时,您通过 SHOW SLAVE STATUS 命令检索了这些值。如果数据库是从使用 --master-data=2 选项的 mysqldump 命令的输出填充的,则二进制日志文件和二进制日志位置包含在该输出中。以下是示例:

    -- -- Position to start replication or point-in-time recovery from -- -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000031', MASTER_LOG_POS=107;
  2. 连接到数据库,然后发出 CHANGE MASTER TOSTART SLAVE 命令,以便使用上一步获得的二进制日志文件名和位置启动与复制主体间的复制,例如:

    CHANGE MASTER TO MASTER_HOST = 'mydbcluster.cluster-123456789012.us-east-1.rds.amazonaws.com' MASTER_PORT = 3306 MASTER_USER = 'repl_user' MASTER_PASSWORD = '<password>' MASTER_LOG_FILE = 'mysql-bin-changelog.000031' MASTER_LOG_POS = 107; START SLAVE;

6. 监控副本

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

还可以通过连接到副本并运行 SHOW SLAVE STATUS 命令监控副本落后于复制主体的程度。命令输出中的 Seconds Behind Master 字段可以揭示副本落后于主体的程度。

停止 Aurora 和 MySQL 之间或 Aurora 和其他 Aurora 数据库群集之间的复制

要停止对 MySQL 数据库实例、外部 MySQL 数据库或其他 Aurora 数据库群集进行的二进制日志复制,请执行以下步骤 (本主题后文有详细讨论)。

1. 停止二进制日志复制

2. 在复制主体上禁用二进制日志记录

1. 停止二进制日志复制

在下面查找有关如何停止数据库引擎的二进制日志复制的说明。

数据库引擎 说明

Aurora

在 Amazon Aurora 数据库群集上停止二进制日志复制

  1. 连接到作为副本的 Aurora 数据库群集并调用 mysql.rds_stop_replication 过程 (mysql.rds_stop_replication 过程仅对 MySQL 5.5 版及更高版本、5.6 版及更高版本和 5.7 及更高版本可用)。

  2. 将二进制日志保留时间范围设置为 0。要设置二进制日志保留时间范围,请使用 mysql.rds_set_configuration 过程并指定 binlog retention hours 的配置参数以及在数据库群集上保留二进制日志文件的小时数,在此示例中为 0,如以下示例所示:

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

RDS MySQL

停止 Amazon RDS 数据库实例上的二进制日志复制

连接到作为副本的 RDS 数据库实例并调用 mysql.rds_stop_replication 过程 (mysql.rds_stop_replication 过程仅对 MySQL 5.5 版及更高版本、5.6 版及更高版本和 5.7 版及更高版本可用)。

MySQL (外部)

在外部 MySQL 数据库上停止二进制日志复制

连接到 MySQL 数据库并调用 STOP REPLICATION 命令。

2. 在复制主体上禁用二进制日志记录

在下面查找有关如何在数据库引擎的复制主体上禁用二进制日志记录的说明。

数据库引擎 说明

Aurora

在 Amazon Aurora 数据库群集上禁用二进制日志记录

binlog_format 参数设置为 OFF. (binlog_format 参数在 default.aurora5.6 群集参数组中,其默认值为 OFF。)

在更改 binlog_format 参数值后,重启数据库群集以便更改生效。

有关更多信息,请参阅 数据库群集和数据库实例参数修改数据库参数组中的参数

RDS MySQL

在 Amazon RDS 数据库实例上禁用二进制日志记录

您不能直接禁用 Amazon RDS 数据库实例的二进制日志记录,但可通过执行以下操作来禁用它:

  1. 为数据库实例禁用自动备份。您可通过修改现有数据库实例并将 Backup Retention Period 设置为 0 来禁用自动备份。有关更多信息,请参阅 修改运行 MySQL 数据库引擎的数据库实例使用备份

  2. 删除数据库实例的所有只读副本。有关更多信息,请参阅 使用 PostgreSQL、MySQL 和 MariaDB 只读副本

MySQL (外部)

在外部 MySQL 数据库上禁用二进制日志记录

连接到 MySQL 数据库并调用 STOP REPLICATION 命令。

  1. 从命令外壳中停止 mysql 服务:

    sudo service mysqld stop
  2. 编辑 my.cnf 文件 (此文件通常位于 /etc 下):

    sudo vi /etc/my.cnf

    [mysqld] 部分中删除 log_binserver_id 选项。

    有关更多信息,请参阅 MySQL 文档中的设置复制主配置

  3. 启动 mysql 服务:

    sudo service mysqld start

相关主题