使用 Percona XtraBackup 和 Amazon S3 从 MySQL 进行物理迁移 - Amazon Aurora

使用 Percona XtraBackup 和 Amazon S3 从 MySQL 进行物理迁移

您可以将源 MySQL 版本 5.7 或 8.0 数据库中的完整和增量备份文件复制到 Amazon S3 桶中。然后,您可以从这些文件中还原到具有相同的主要数据库引擎版本的 Amazon Aurora MySQL 数据库集群。

该选项可能比使用 mysqldump 迁移数据要快得多,因为使用 mysqldump 可以重放所有命令,以便在新的 Aurora MySQL 数据库集群中从源数据库重新创建架构和数据。通过复制源 MySQL 数据文件,Aurora MySQL 可以立即将这些文件作为 Aurora MySQL 数据库集群的数据。

还可以在迁移过程中使用二进制日志复制来最大程度地减少停机时间。如果您使用二进制日志复制,则在将数据迁移到 Aurora MySQL 数据库集群时,外部 MySQL 数据库仍对事务保持开放。在创建 Aurora MySQL 数据库集群后,您可以使用二进制日志复制以将 Aurora MySQL 数据库集群与在备份后发生的事务同步。如果 Aurora MySQL 数据库集群与 MySQL 数据库一致,您可以完全切换到 Aurora MySQL 数据库集群以执行新事务,从而完成迁移。有关更多信息,请参阅 通过复制同步 Amazon Aurora MySQL 数据库集群和 MySQL 数据库

限制和注意事项

以下限制和注意事项适用于从 Amazon S3 桶还原到 Amazon Aurora MySQL 数据库集群:

  • 您只能将数据迁移到新的数据库集群,而不能迁移到现有的数据库集群。

  • 您必须使用 Percona XtraBackup 将数据备份到 S3。有关更多信息,请参阅 安装 Percona XtraBackup

  • Amazon S3 桶和 Aurora MySQL 数据库集群必须位于同一 AWS 区域中。

  • 您无法从以下内容还原:

    • 导出到 Amazon S3 的数据库集群快照。您也无法将数据从数据库集群快照导出迁移到 S3 桶。

    • 加密的源数据库,但您可以加密正在迁移的数据。您也可以在迁移过程中不加密数据。

    • MySQL 5.5 或 5.6 数据库

  • 不支持将 Percona Server for MySQL 作为源数据库,因为它可能在 mysql 架构中包含 compression_dictionary* 表。

  • 您无法还原到 Aurora Serverless 数据库集群。

  • 主要版本或次要版本都不支持反向迁移。例如,您不能从 MySQL 版本 8.0 迁移到 Aurora MySQL 2 版本(与 MySQL 5.7 兼容),也不能从 MySQL 版本 8.0.32 迁移到与 MySQL 社区版本 8.0.26 兼容的 Aurora MySQL 版本 3.03。

  • 您无法从一些较早的 MySQL 8.0 版本(包括 8.0.11、8.0.13 和 8.0.15)迁移到 Aurora MySQL 版本 3.05 及更高版本。我们建议您在迁移之前先升级到 MySQL 版本 8.0.28。

  • 在 db.t2.micro 数据库实例类上不支持从 Amazon S3 导入。不过,您可以还原到不同的数据库实例类,并稍后更改该数据库实例类。有关数据库实例类的更多信息,请参阅 Aurora 数据库实例类

  • Amazon S3 将上传到 S3 桶的文件大小限制为 5TB。如果备份文件超过 5 TB,则必须将备份文件拆分为较小的文件。

  • Amazon RDS 将上传到 S3 桶的文件数限制为一百万个。如果数据库的备份数据(包括所有完整和增量备份)超过 100 万个文件,请使用 Gzip(.gz)、tar(.tar.gz)或 Percona xbstream(.xbstream)文件将完整和增量备份文件存储在 S3 桶中。Percona XtraBackup 8.0 仅支持使用 Percona xbstream 进行压缩。

  • 要为每个数据库集群提供管理服务,需要在创建数据库集群时创建 rdsadmin 用户。由于这是 RDS 中的保留用户,因此以下限制适用:

  • 对于 Aurora MySQL 版本 3,不导入动态权限。迁移后可以导入 Aurora 支持的动态权限。有关更多信息,请参阅 Aurora MySQL 版本 3 中的动态权限

  • 不会迁移 mysql 架构中用户创建的表。

  • innodb_data_file_path 参数必须仅配置一个使用默认数据文件名 ibdata1:12M:autoextend 的数据文件。使用此方法无法迁移具有两个数据文件或具有不同名称的数据文件的数据库。

    下面是不允许使用的文件名示例:innodb_data_file_path=ibdata1:50Mibdata2:50M:autoextendinnodb_data_file_path=ibdata01:50M:autoextend

  • 您无法从在默认 MySQL 数据目录外部定义表的源数据库中迁移。

  • 使用此方法的未压缩备份支持的最大大小目前限制为 64TiB。对于压缩备份,考虑到解压缩空间的需求,此限制会降低。在此类情况下,支持的最大备份大小为(64 TiB – compressed backup size)。

  • Aurora MySQL 不支持导入 MySQL 以及其他外部组件和插件。

  • Aurora MySQL 不会还原数据库中的所有内容。我们建议您从源 MySQL 数据库保存数据库架构以及以下项目的值,然后将这些内容添加到已还原的 Aurora MySQL 数据库集群(在创建该集群后):

开始前的准备工作

在将数据复制到 Amazon S3 存储桶并从这些文件还原到数据库集群之前,您必须执行以下操作:

  • 在您的本地服务器上安装 Percona XtraBackup。

  • 准许 Aurora MySQL 代表您访问您的 Amazon S3 存储桶。

安装 Percona XtraBackup

Amazon Aurora 可以从使用 Percona XtraBackup 创建的文件还原数据库集群。您可以从软件下载 - Percona 安装 Percona XtraBackup。

对于 MySQL 5.7 迁移,使用 Percona XtraBackup 2.4。

对于 MySQL 8.0 迁移,使用 Percona XtraBackup 8.0。请确保 Percona XtraBackup 版本与您的源数据库的引擎版本兼容。

所需的权限

要将 MySQL 数据迁移到 Amazon Aurora MySQL 数据库集群,需要几种权限:

  • 请求该 Aurora 从 Amazon S3 存储桶创建新集群的用户必须有权限列出您的AWS账户的存储桶。通过使用 AWS Identity and Access Management(IAM)策略,可以向用户授予该权限。

  • Aurora 需要代表您访问 Amazon S3 存储桶(在该存储桶中,您存储了用于创建 Amazon Aurora MySQL 数据库集群的文件)的权限。您可以使用 IAM 服务角色为 Aurora 授予所需的权限。

  • 发出请求的用户还必须有权限列出您的AWS账户的 IAM 角色。

  • 如果用户发出请求的目的是创建 IAM 服务角色或请求 Aurora 创建 IAM 服务角色 (使用控制台),则用户必须有权限为您的 AWS 账户创建 IAM 角色。

  • 如果您打算在迁移过程中加密数据,请更新将要执行迁移操作的用户的 IAM 策略,以授予 RDS 对用于加密备份的 AWS KMS keys 的访问权限。有关说明,请参阅 创建 IAM 策略以访问 AWS KMS 资源

例如,以下 IAM 策略为用户授予所需的最小权限,以使用控制台列出 IAM 角色、创建 IAM 角色、列出您的账户的 Amazon S3 存储桶以及列出 KMS 密钥。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iam:ListRoles", "iam:CreateRole", "iam:CreatePolicy", "iam:AttachRolePolicy", "s3:ListBucket", "kms:ListKeys" ], "Resource": "*" } ] }

此外,要使用户能够将 IAM 角色与 Amazon S3 存储桶关联,IAM 用户必须具有该 IAM 角色的 iam:PassRole 权限。该权限允许管理员限制用户可以将哪些 IAM 角色与 Amazon S3 存储桶关联。

例如,以下 IAM 策略允许用户将名为 S3Access 的角色与 Amazon S3 存储桶关联。

{ "Version":"2012-10-17", "Statement":[ { "Sid":"AllowS3AccessRole", "Effect":"Allow", "Action":"iam:PassRole", "Resource":"arn:aws:iam::123456789012:role/S3Access" } ] }

有关 IAM 用户权限的更多信息,请参阅使用策略管理访问

创建 IAM 服务角色

您可以在 AWS Management Console中选择创建新角色选项(本主题稍后介绍)以创建角色。如果您选择该选项并为新角色指定名称,Aurora 将使用您提供的名称为 Aurora 创建访问 Amazon S3 存储桶所需的 IAM 服务角色。

作为替代方法,您可以使用以下程序手动创建角色。

为 Aurora 创建 IAM 角色以访问 Amazon S3
  1. 完成 创建 IAM 策略以访问 Amazon S3 资源 中的步骤。

  2. 完成 创建 IAM 角色以允许 Amazon Aurora 访问AWS服务 中的步骤。

  3. 完成 将 IAM 角色与 Amazon Aurora MySQL 数据库集群关联 中的步骤。

备份要还原为 Amazon Aurora MySQL 数据库集群的文件

您可以使用 Percona XtraBackup 创建 MySQL 数据库文件的完整备份,并且可将备份文件上传到 Amazon S3 存储桶。或者,如果您已使用 Percona XtraBackup 备份您的 MySQL 数据库文件,则可将现有的完整备份和增量备份目录和文件上传到 Amazon S3 存储桶。

使用 Percona XtraBackup 创建完整备份

要创建 MySQL 数据库文件的完整备份,以从 Amazon S3 中还原这些文件来创建 Aurora MySQL 数据库集群,请使用 Percona XtraBackup 实用程序(xtrabackup)备份数据库。

例如,以下命令创建 MySQL 数据库的备份并将备份文件存储在 /on-premises/s3-restore/backup 文件夹中。

xtrabackup --backup --user=<myuser> --password=<password> --target-dir=</on-premises/s3-restore/backup>

如果您要将备份压缩为单个文件 (可在需要时进行拆分),则可以使用 --stream 选项来采用下列格式之一保存备份:

  • Gzip (.gz)

  • tar (.tar)

  • Percona xbstream (.xbstream)

以下命令为您的 MySQL 数据库创建一个拆分成多个 Gzip 文件的备份。

xtrabackup --backup --user=<myuser> --password=<password> --stream=tar \ --target-dir=</on-premises/s3-restore/backup> | gzip - | split -d --bytes=500MB \ - </on-premises/s3-restore/backup/backup>.tar.gz

以下命令为您的 MySQL 数据库创建一个拆分成多个 tar 文件的备份。

xtrabackup --backup --user=<myuser> --password=<password> --stream=tar \ --target-dir=</on-premises/s3-restore/backup> | split -d --bytes=500MB \ - </on-premises/s3-restore/backup/backup>.tar

以下命令为您的 MySQL 数据库创建一个拆分成多个 xbstream 文件的备份。

xtrabackup --backup --user=<myuser> --password=<password> --stream=xbstream \ --target-dir=</on-premises/s3-restore/backup> | split -d --bytes=500MB \ - </on-premises/s3-restore/backup/backup>.xbstream
注意

如果您看到以下错误,则可能是由于命令中混用了文件格式所致:

ERROR:/bin/tar: This does not look like a tar archive

在使用 Percona XtraBackup 实用程序备份 MySQL 数据库后,您可以将备份目录和文件复制到 Amazon S3 存储桶。

有关创建文件并将其上传到 Amazon S3 存储桶的信息,请参阅 Amazon S3 入门指南 中的 Amazon Simple Storage Service 入门

通过 Percona XtraBackup 使用增量备份

Amazon Aurora MySQL 支持使用 Percona XtraBackup 创建的完整备份和增量备份。如果您已使用 Percona XtraBackup 对 MySQL 数据库文件进行完整备份和增量备份,则无需创建完整备份和将备份文件上传到 Amazon S3。相反,您可以通过将网站备份和增量备份的现有备份目录和文件复制到 Amazon S3 存储桶来节约大量时间。有关更多信息,请参阅 Percona 网站上的创建增量备份

在将现有的完整备份和增量备份文件复制到 Amazon S3 存储桶时,您必须以递归方式复制基目录的内容。这些内容包括完整备份以及所有增量备份目录和文件。此副本必须在 Amazon S3 存储桶中保留目录结构。Aurora 将循环访问所有文件和目录。Aurora 使用每个增量备份中包含的 xtrabackup-checkpoints 文件来标识基本目录,并按日志序列号(LSN)范围对增量备份进行排序。

有关创建文件并将其上传到 Amazon S3 存储桶的信息,请参阅 Amazon S3 入门指南 中的 Amazon Simple Storage Service 入门

备份注意事项

Aurora 不支持使用 Percona XtraBackup 创建的部分备份。在备份数据库的源文件时,不能使用以下选项创建部分备份:--tables--tables-exclude--tables-file--databases--databases-exclude--databases-file

有关使用 Percona XtraBackup 备份数据库的更多信息,请参阅 Percona 网站上的 Percona XtraBackup - 文档使用二进制日志

Aurora 支持使用 Percona XtraBackup 创建的增量备份。有关更多信息,请参阅 Percona 网站上的创建增量备份

Aurora 根据文件名使用您的备份文件。确保根据文件格式为备份文件指定相应的文件扩展名,例如对于使用 Percona xbstream 格式存储的文件,指定 .xbstream

Aurora 按照字母顺序以及自然数字顺序使用您的备份文件。始终在您发出 split 命令时使用 xtrabackup 选项,以确保备份文件按适当的顺序写入和命名。

Amazon S3 将上传到 Amazon S3 存储桶的文件大小限制为 5 TB。如果数据库的备份数据超过 5 TB,请使用 split 命令将备份文件拆分为多个文件,每个小于 5 TB。

Aurora 将上传到 Amazon S3 存储桶的源文件数限制为 100 万个。在某些情况下,数据库的备份数据 (包括所有完整和增量备份) 可以提供大量文件。在这些情况下,使用 tarball (.tar.gz) 文件,将完整和增量备份文件存储在 Amazon S3 存储桶中。

将文件上传到 Amazon S3 存储桶时,您可以使用服务器端加密来加密数据。之后,您可以通过这些加密文件还原 Amazon Aurora MySQL 数据库集群。Amazon Aurora MySQL 可以从使用以下类型的服务器端加密功能加密的文件还原数据库集群:

  • 使用具有 Amazon S3 托管密钥的服务器端加密 (SSE-S3) – 通过增强的多因素加密使用唯一密钥加密每个对象。

  • 具有 AWS KMS 托管密钥的服务器端加密(SSE-KMS)与 SSE-S3 类似,但您可以选择自己创建和管理加密密钥,并且还具有其他一些区别。

有关在将文件上传到 Amazon S3 存储桶时使用服务器端加密的信息,请参阅 Amazon S3 开发人员指南 中的使用服务器端加密保护数据

从 Amazon S3 存储桶还原 Amazon Aurora MySQL 数据库集群

您可以使用 Amazon RDS 控制台从 Amazon S3 存储桶中还原备份文件以创建新的 Amazon Aurora MySQL 数据库集群。

从 Amazon S3 存储桶上的文件还原 Amazon Aurora MySQL 数据库集群
  1. 登录AWS Management Console并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

  2. 在 Amazon RDS 控制台右上角,选择要在其中创建数据库集群的AWS区域。选择与包含数据库备份的 Amazon S3 存储桶相同的AWS区域。

  3. 在导航窗格中,选择 Databases (数据库),然后选择 Restore from S3 (从 S3 还原)

  4. 选择从 S3 还原

    此时将显示通过从 S3 还原创建数据库页面。

    您指定从 S3 还原数据库集群的详细信息的页面
  5. S3 目标下:

    1. 选择包含备份文件的 S3 存储桶

    2. (可选)对于 S3 文件夹路径前缀,输入存储在 Amazon S3 存储桶中的文件的文件路径前缀。

      如果未指定前缀,则 RDS 使用 S3 存储桶的根文件夹中的所有文件和文件夹创建数据库实例。如果指定了前缀,则 RDS 使用 S3 存储桶中文件路径以指定前缀开头的文件和文件夹创建数据库实例。

      例如,假设将备份文件存储在 S3 上名为 backups 的子文件夹中,并且具有多组备份文件,每个文件位于自己的目录 (gzip_backup1、gzip_backup2,依此类推) 中。在这种情况下,请指定 backups/gzip_backup1 前缀以从 gzip_backup1 文件夹中的文件还原。

  6. 引擎选项下:

    1. 对于 Engine type(引擎类型),选择 Amazon Aurora

    2. 对于 Version(版本),为还原的数据库实例选择 Aurora MySQL 引擎版本。

  7. 对于 IAM 角色,您可以选择现有 IAM 角色。

  8. (可选)您还可以通过选择 Create a new role(创建新角色)为自己创建新的 IAM 角色。如果是这样:

    1. 请输入 IAM role name(IAM 角色名称)。

    2. 选择是否允许访问 KMS 密钥

      • 如果您不加密备份文件,请选择

      • 如果在将备份文件上传到 Amazon S3 时使用 AES-256(SSE-S3)加密这些文件,请选择 No (否)。在此情况下,数据将会自动解密。

      • 如果在将备份文件上载到 Amazon S3 时使用 AWS KMS (SSE-KMS) 服务器端加密功能加密这些文件,请选择 Yes (是)。接下来,为 AWS KMS key 选择正确的 KMS 密钥。

        AWS Management Console 将创建一个 IAM 策略以允许 Aurora 解密数据。

      有关更多信息,请参阅 Amazon S3 开发人员指南 中的使用服务器端加密保护数据

  9. 选择数据库集群的设置,例如数据库集群存储配置、数据库实例类、数据库集群标识符和登录凭证。有关每项设置的信息,请参阅 Aurora 数据库集群的设置

  10. 根据需要自定义 Aurora MySQL 数据库集群的其他设置。

  11. 选择 Create database(创建数据库)以启动您的 Aurora 数据库实例。

在 Amazon RDS 控制台中,新数据库实例显示在数据库实例列表中。数据库实例具有 creating (创建) 状态,直到该数据库实例完成创建并可供使用。当状态更改为 available 时,您可连接到数据库集群的主实例。根据所分配的数据库实例类和存储的不同,新实例可能需要数分钟时间才能变得可用。

要查看新创建的集群,请在 Amazon RDS 控制台中选择 Databases(数据库) 视图,然后选择数据库集群。有关更多信息,请参阅“查看 Amazon Aurora 数据库集群”。

Amazon Aurora 数据库实例列表

记下数据库集群的端口和写入器终端节点。在执行写入或读取操作的任何应用程序的 JDBC 和 ODBC 连接字符串中,使用数据库集群的写入器终端节点和端口。

通过复制同步 Amazon Aurora MySQL 数据库集群和 MySQL 数据库

为了在迁移过程中实现最少或零停机时间,您可以将在 MySQL 数据库中提交的事务复制到 Aurora MySQL 数据库集群。通过复制,数据库集群可以与迁移期间发生的 MySQL 数据库上的事务保持一致。当数据库集群完全一致时,您可以停止复制并完成向 Aurora MySQL 的迁移。

配置外部 MySQL 数据库和 Aurora MySQL 数据库集群以进行加密复制

要安全地复制数据,您可以使用加密复制。

注意

如果您不需要使用加密复制,可以跳过以下步骤,然后继续参阅 同步 Amazon Aurora MySQL 数据库集群和外部 MySQL 数据库 中的说明。

以下是使用加密复制的先决条件:

  • 必须在外部 MySQL 主数据库上启用安全套接字层 (SSL)。

  • 必须为 Aurora MySQL 数据库集群准备客户端密钥和客户端证书。

在加密复制期间,Aurora MySQL 数据库集群充当 MySQL 数据库服务器的客户端。Aurora MySQL 客户端的证书和密钥必须是 .pem 格式的文件。

配置外部 MySQL 数据库和 Aurora MySQL 数据库集群以进行加密复制
  1. 确保您为加密复制做好以下准备:

    • 如果您没有在外部 MySQL 主数据库上启用 SSL,并且没有准备客户端密钥和客户端证书,请在 MySQL 数据库服务器上启用 SSL 并生成所需的客户端密钥和客户端证书。

    • 如果在外部主数据库上启用了 SSL,请提供 Aurora MySQL 数据库集群的客户端密钥和证书。如果未提供,请为 Aurora MySQL 数据库集群生成新密钥和证书。要对客户端证书进行签名,您必须拥有您用来在外部 MySQL 主数据库上配置 SSL 的证书颁发机构密钥。

    有关更多信息,请参阅 MySQL 文档中的使用 openssl 创建 SSL 证书和密钥

    您需要证书颁发机构证书、客户端密钥和客户端证书。

  2. 通过 SSL 以主用户身份连接到 Aurora MySQL 数据库集群。

    有关通过 SSL 连接到 Aurora MySQL 数据库集群的信息,请参阅将 TLS 与 Aurora MySQL 数据库集群结合使用

  3. 运行 mysql.rds_import_binlog_ssl_material 存储过程,以将 SSL 信息导入到 Aurora MySQL 数据库集群中。

    对于 ssl_material_value 参数,将 Aurora MySQL 数据库集群的 .pem 格式文件中的信息插入到正确的 JSON 负载中。

    以下示例将 SSL 信息导入到 Aurora MySQL 数据库集群中。在 .pem 格式文件中,主体代码通常比示例中显示的主体代码长。

    call mysql.rds_import_binlog_ssl_material( '{"ssl_ca":"-----BEGIN CERTIFICATE----- AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE -----END CERTIFICATE-----\n","ssl_cert":"-----BEGIN CERTIFICATE----- AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE -----END CERTIFICATE-----\n","ssl_key":"-----BEGIN RSA PRIVATE KEY----- AAAAB3NzaC1yc2EAAAADAQABAAABAQClKsfkNkuSevGj3eYhCe53pcjqP3maAhDFcvBS7O6V hz2ItxCih+PnDSUaw+WNQn/mZphTk/a/gU8jEzoOWbkM4yxyb/wB96xbiFveSFJuOp/d6RJhJOI0iBXr lsLnBItntckiJ7FbtxJMXLvvwJryDUilBMTjYtwB+QhYXUMOzce5Pjz5/i8SeJtjnV3iAoG/cQk+0FzZ qaeJAAHco+CY/5WrUBkrHmFJr6HcXkvJdWPkYQS3xqC0+FmUZofz221CBt5IMucxXPkX4rWi+z7wB3Rb BQoQzd8v7yeb7OzlPnWOyN0qFU0XA246RA8QFYiCNYwI3f05p6KLxEXAMPLE -----END RSA PRIVATE KEY-----\n"}');

    有关更多信息,请参阅mysql.rds_import_binlog_ssl_material将 TLS 与 Aurora MySQL 数据库集群结合使用

    注意

    运行该过程后,密钥会存储在文件中。稍后如果要删除文件,您可以运行 mysql.rds_remove_binlog_ssl_material 存储过程。

同步 Amazon Aurora MySQL 数据库集群和外部 MySQL 数据库

您可以使用复制,同步 Amazon Aurora MySQL 数据库集群和 MySQL 数据库。

通过复制同步 Aurora MySQL 数据库集群和 MySQL 数据库
  1. 确保外部 MySQL 数据库的 /etc/my.cnf 文件具有相关条目。

    如果不需要加密复制,请确保先为外部 MySQL 数据库启用二进制日志 (binlogs) 并禁用 SSL。以下是 /etc/my.cnf 文件中未加密数据的相关条目。

    log-bin=mysql-bin server-id=2133421 innodb_flush_log_at_trx_commit=1 sync_binlog=1

    如果需要加密复制,请确保先为外部 MySQL 数据库启用 SSL 和二进制日志。/etc/my.cnf 文件的条目包括 MySQL 数据库服务器的 .pem 文件位置。

    log-bin=mysql-bin server-id=2133421 innodb_flush_log_at_trx_commit=1 sync_binlog=1 # Setup SSL. ssl-ca=/home/sslcerts/ca.pem ssl-cert=/home/sslcerts/server-cert.pem ssl-key=/home/sslcerts/server-key.pem

    您可以通过以下命令验证是否已启用 SSL。

    mysql> show variables like 'have_ssl';

    您的输出应类似于以下内容。

    +~-~-~-~-~-~-~-~-~-~-~-~-~-~--+~-~-~-~-~-~--+ | Variable_name | Value | +~-~-~-~-~-~-~-~-~-~-~-~-~-~--+~-~-~-~-~-~--+ | have_ssl | YES | +~-~-~-~-~-~-~-~-~-~-~-~-~-~--+~-~-~-~-~-~--+ 1 row in set (0.00 sec)
  2. 确定复制的开始二进制日志位置。您可以在稍后步骤中指定启动复制的位置。

    使用 AWS Management Console

    1. 登录 AWS Management Console 并通过以下网址打开 Amazon RDS 控制台:https://console.aws.amazon.com/rds/

    2. 在导航窗格中,选择 Events

    3. 事件列表中,记下从二进制日志文件名还原事件的位置。

      查看 MySQL 主数据库

    使用 AWS CLI

    您也可以使用 describe-events AWS CLI 命令获取二进制日志文件名和位置。下面显示了示例 describe-events 命令。

    PROMPT> aws rds describe-events

    在输出中,确定显示二进制日志位置的事件。

  3. 连接到外部 MySQL 数据库时,创建要用于复制的用户。此账户仅用于复制,并且必须仅供您的域使用以增强安全性。以下是示例。

    mysql> CREATE USER '<user_name>'@'<domain_name>' IDENTIFIED BY '<password>';

    该用户需要 REPLICATION CLIENTREPLICATION SLAVE 权限。向该用户授予这些权限。

    GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO '<user_name>'@'<domain_name>';

    如果您需要使用加密复制,则需为复制用户要求 SSL 连接。例如,您可以使用以下语句来要求用户账户的 SSL 连接 <user_name>

    GRANT USAGE ON *.* TO '<user_name>'@'<domain_name>' REQUIRE SSL;
    注意

    如果不包括 REQUIRE SSL,则复制连接可能会无提示地返回到未加密连接。

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

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

    host <db_cluster_endpoint>

    主机名是 Aurora MySQL 数据库集群终端节点中的 DNS 名称。

  5. 通过运行 mysql.rds_reset_external_master(Aurora MySQL 版本 2)mysql.rds_reset_external_source(Aurora MySQL 版本 3) 存储过程,启用二进制日志复制。此存储过程使用以下语法。

    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 ); CALL mysql.rds_set_external_source ( host_name , host_port , replication_user_name , replication_user_password , mysql_binary_log_file_name , mysql_binary_log_file_location , ssl_encryption );

    有关参数的信息,请参阅mysql.rds_reset_external_master(Aurora MySQL 版本 2)mysql.rds_reset_external_source(Aurora MySQL 版本 3)

    对于 mysql_binary_log_file_namemysql_binary_log_file_location,使用您之前记下的从二进制日志文件名还原事件的位置。

    如果未加密 Aurora MySQL 数据库集群中的数据,则必须将 ssl_encryption 参数设置为 0。如果数据经过加密,则必须将 ssl_encryption 参数设置为 1

    以下示例为含有加密数据的 Aurora MySQL 数据库集群运行该过程。

    CALL mysql.rds_set_external_master( 'Externaldb.some.com', 3306, 'repl_user'@'mydomain.com', 'password', 'mysql-bin.000010', 120, 1); CALL mysql.rds_set_external_source( 'Externaldb.some.com', 3306, 'repl_user'@'mydomain.com', 'password', 'mysql-bin.000010', 120, 1);

    此存储过程设置了参数,Aurora MySQL 数据库集群使用此类参数连接到外部 MySQL 数据库并读取其二进制日志。如果数据经过加密,则它还会将 SSL 证书颁发机构证书、客户端证书和客户端密钥下载到本地磁盘。

  6. 通过运行 mysql.rds_start_replication 存储过程,启动二进制日志复制。

    CALL mysql.rds_start_replication;
  7. 监控 Aurora MySQL 数据库集群落后于 MySQL 副本主数据库的程度。为了做到这一点,请连接到 Aurora MySQL 数据库集群并运行以下命令。

    Aurora MySQL version 2: SHOW SLAVE STATUS; Aurora MySQL version 3: SHOW REPLICA STATUS;

    在命令输出中,Seconds Behind Master 字段显示 Aurora MySQL 数据库集群落后于 MySQL 主实例的程度。如果该值为 0(零),则表示 Aurora MySQL 数据库集群与主实例保持一致,您可以转到下一步以停止复制。

  8. 连接到 MySQL 副本主数据库并停止复制。为实现此目的,请运行 mysql.rds_stop_replication 存储过程。

    CALL mysql.rds_stop_replication;