

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Percona、A XtraBackup mazon EFS 和 Amazon S3 将本地 MySQL 数据库迁移到 Aurora MySQL
<a name="migrate-on-premises-mysql-databases-to-aurora-mysql-using-percona-xtrabackup-amazon-efs-and-amazon-s3"></a>

*Rohan Jamadagni、Udayasimha Theepireddy 和 sajith menon，Amazon Web Services*

## Summary
<a name="migrate-on-premises-mysql-databases-to-aurora-mysql-using-percona-xtrabackup-amazon-efs-and-amazon-s3-summary"></a>

此模式描述了如何使用 Percon XtraBackup a 将大型本地 MySQL 数据库高效地迁移到 Amazon Aurora MySQL。Percona XtraBackup 是一款适用于基于 MySQL 的服务器的开源、非阻塞备份实用程序。该模式显示了如何使用 Amazon Elastic File System（Amazon EFS）来缩短将备份上传到 Amazon Simple Storage Service（Amazon S3）的时间，以及将备份恢复到 Amazon Aurora MySQL 的时间。该模式还详细介绍了如何进行 Percona 增量备份，以最大限度地减少要应用于目标 Aurora MySQL 数据库的二进制日志数量。 

## 先决条件和限制
<a name="migrate-on-premises-mysql-databases-to-aurora-mysql-using-percona-xtrabackup-amazon-efs-and-amazon-s3-prereqs"></a>

**先决条件**
+ 一个有效的 Amazon Web Services account
+ 创建 AWS Identity and Access Management（IAM）角色和策略的权限
+ 本地 MySQL 数据库与 AWS 上的虚拟私有云（VPC）之间的网络连接

**限制**
+ 源服务器必须是基于 Linux 的系统，可以安装网络文件系统 (NFS) 客户端 (nfs-utils/nfs-common)。
+ 用于上传备份文件的 S3 存储桶仅支持服务器端加密(SSE-S3/SSE-KMS)。
+ Amazon S3 将备份文件大小限制为 5 TB。如果备份文件超过 5 TB，则可以将其分为多个较小的文件。
+ 上传到 S3 存储桶的源文件个数不能超过 100 万个。
+ 该模式仅支持 Percona XtraBackup 完整备份和增量备份。它不支持使用 `--tables`、`--tables-exclude`、`--tables-file`、`--databases`、`--databases-exclude` 或 `--databases-file` 的部分备份。
+ Aurora 不会从 MySQL 源数据库中恢复用户、函数、存储过程或时区信息。

**产品版本**
+ 源数据库必须是 MySQL 版本 5.5、5.6 或 5.7。
+ 对于 MySQL 5.7，你必须使用 Percona XtraBackup 2.4。
+ 对于 MySQL 5.6 和 5.6，你必须使用 Percona XtraBackup 2.3 或 2.4。

## 架构
<a name="migrate-on-premises-mysql-databases-to-aurora-mysql-using-percona-xtrabackup-amazon-efs-and-amazon-s3-architecture"></a>

**源技术堆栈**
+ 基于 Linux 的操作系统
+ MySQL 服务器
+ Percona XtraBackup

**目标技术堆栈**
+ Amazon Aurora
+ Amazon S3
+ Amazon EFS

**目标架构**

![\[使用 Perc XtraBackup ona 将大型 MySQL 数据库迁移到 Amazon Aurora MySQL 的架构。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/bf327776-bafd-484d-9ae2-a6f5c8af6edd/images/7a410539-1511-4106-90e2-8c0c8e95f92b.png)


## 工具
<a name="migrate-on-premises-mysql-databases-to-aurora-mysql-using-percona-xtrabackup-amazon-efs-and-amazon-s3-tools"></a>

*Amazon Web Services*
+ [Amazon Aurora](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.AuroraMySQL.html) 是一款完全托管型关系数据库引擎，可以让您通过简单且经济高效的方式设置、操作和扩展 MySQL 部署。Aurora MySQL 是 MySQL 的插拔式替换。
+ [Amazon Elastic File System（Amazon EFS）](https://docs.aws.amazon.com/efs/latest/ug/whatisefs.html)可帮助您在 Amazon Web Services Cloud 中创建和配置共享文件系统。
+ [Amazon Simple Storage Service（Amazon S3）](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html)是一项基于云的对象存储服务，可帮助您存储、保护和检索任意数量的数据。

**其他工具**
+ [Percona XtraBackup](https://www.percona.com/doc/percona-xtrabackup/2.4/index.html) 是一个开源实用程序，可在不中断或阻塞数据库的情况下执行 MySQL 数据库的流式备份、压缩备份和增量备份。

## 操作说明
<a name="migrate-on-premises-mysql-databases-to-aurora-mysql-using-percona-xtrabackup-amazon-efs-and-amazon-s3-epics"></a>

### 创建 Amazon EFS 文件系统
<a name="create-an-amazon-efs-file-system"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建一个与 Amazon EFS 挂载目标关联的安全组。 | 在 VPC 中创建一个安全组，该组配有通过 AWS Transit Gateway 连接到本地数据库的 VPN。有关本文和其他文章中描述的命令和步骤的更多信息，请参阅此模式末尾的“相关资源”部分中的链接。 | AWS DevOps/database 管理员 | 
| 编辑安全组规则。 | 添加入站规则，使用类型 NFS、端口 2049 和本地数据库服务器的 IP 范围作为源。默认情况下，出站规则允许所有流量离开。如果不是这种情况，请添加出站规则以打开 NFS 端口的连接。再添加两个入站规则：端口 2049（来源：同一安全组的安全组 ID）和端口 22（来源：您将从中连接到 EC2 实例的 IP 范围）。 | AWS DevOps/database 管理员 | 
| 创建文件系统。 | 在挂载目标中，使用您在上一个情节中创建的 VPC 和安全组。根据本地数据库的 I/O 要求选择吞吐量模式和性能。或者，启用静态加密。 | AWS DevOps/database 管理员 | 

### 挂载文件系统
<a name="mount-the-file-system"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建要与实例关联的 IAM EC2 实例配置文件角色。 | 创建有权上传和访问 Amazon S3 中的对象的 IAM 角色。选择将备份存储为策略资源的 S3 存储桶。 | AWS DevOps | 
| 创建实 EC2 例。 | 启动基于 Linux 的 EC2 实例，并附加您在上一步中创建的 IAM 实例配置文件角色和之前创建的安全组。 | AWS DevOps | 
| 安装 NFS 客户端。 | 在本地数据库服务器和 EC2 实例上安装 NFS 客户端。有关安装说明，请参阅“其他信息”部分。 | DevOps | 
| 挂载 Amazon EFS 文件系统。 | 在本地和 EC2 实例上安装 Amazon EFS 文件系统。在每台服务器上，创建一个用于存储备份的目录，然后使用挂载目标端点挂载文件系统。有关示例，请参阅“其他信息”部分。 | DevOps | 

### 生成 MySQL 源数据库的备份
<a name="make-a-backup-of-the-mysql-source-database"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 Percona XtraBackup。 | 在本地数据库服务器上安装 Percona XtraBackup 2.3 或 2.4（取决于您的 MySQL 数据库的版本）。有关安装链接，请查看“相关资源”部分。 | 数据库管理员 | 
| 计数源数据库中的架构和表。 | 收集并记下 MySQL 源数据库中架构和对象的数量。迁移后，您将使用这些计数来验证 Aurora MySQL 数据库。 | 数据库管理员 | 
| （可选）记下源数据库中最新的二进制日志序列。 | 如果要在源数据库和 Aurora MySQL 之间建立二进制日志复制以最大限度地减少停机时间，请执行此步骤。必须启用日志箱，且 server\$1id 必须是唯一的。在启动备份之前，请记下源数据库中当前的二进制日志序列。如果您计划仅使用完整备份，请在完整备份之前执行此步骤。如果您计划在完整备份后进行增量备份，请先执行此步骤，然后再在 Aurora MySQL 数据库实例上恢复最终增量备份。 | 数据库管理员 | 
| 创建 MySQL 源数据库的完整备份。 | 使用 Percon XtraBackup a 对 MySQL 源数据库进行完整备份。有关完整备份和增量备份的命令示例，请参阅“其他信息”部分。 | 数据库管理员 | 
| （可选）使用 Percon XtraBackup a 进行增量备份。 | 增量备份可用于减少将源数据库与 Aurora MySQL 同步所需二进制日志量。大型和事务密集型数据库可能会在备份期间生成大量二进制日志。通过进行增量备份并将其存储在共享的 Amazon EFS 文件系统上，您可以显著缩短备份和上传数据库的时间。有关详细信息，请参阅“其他信息”部分。继续进行增量备份，直到准备好开始向 Aurora 的迁移过程。 | 数据库管理员 | 
| 准备备份。 | 在此步骤中，将事务日志应用于备份期间传输中的事务的备份。继续对每个增量备份应用事务日志 (--apply-log-only) 以合并除上次备份之外的备份。有关示例，请参阅“其他信息”部分。完成此步骤后，完整的合并备份将位于 \$1/<efs\$1mount\$1name>/fullbackup。 | 数据库管理员 | 
| 压缩并拆分最终合并的备份。 | 准备好最终的合并备份后，使用 tar、zip 和 split 命令创建较小的备份压缩文件。有关示例，请参阅“其他信息”部分。 | 数据库管理员 | 

### 将备份恢复到 Aurora MySQL 数据库集群
<a name="restore-the-backup-to-an-aurora-mysql-db-cluster"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 将备份文件上传到 Amazon S3。 | 存储备份文件的 Amazon EFS 文件系统同时安装在本地数据库和 EC2 实例上，因此备份文件随时可供 EC2 实例使用。<bucket\$1name>使用安全外壳 (SSH) 连接到 EC2 实例，然后将压缩后的备份文件上传到新的或现有的 S3 存储桶；例如：aws s3 sync \$1/ <efs\$1mount\$1name>/fullbackup s3: ///fullbackup s3: //fullbackup。有关其他详细信息，请查看“相关资源”部分的链接。 | AWS DevOps | 
| 为 Aurora 创建服务角色以访问 Amazon S3。 | 创建具有信任“rds.amazonaws.com”的 IAM 角色和一个允许 Aurora 访问存储备份文件的 S3 存储桶的策略。所需的权限是 ListBucket GetObject、和 GetObjectVersion。 | AWS DevOps | 
| 为 Aurora 创建联网配置。 | 创建一个集群数据库子网组，该子网组具有至少两个可用区和一个允许对源数据库进行出站连接的子网路由表配置。创建一个安全组，允许对本地数据库进行出站连接，并允许管理员连接到 Aurora 数据库集群。有关更多信息，请参阅“相关资源”部分中的链接。 | AWS DevOps/database 管理员 | 
| 将备份恢复到 Aurora MySQL 数据库集群。 | 通过上传到 Amazon S3 的备份恢复数据。指定源数据库的 MySQL 版本，提供上传备份文件的 S3 存储桶名称和文件夹路径前缀（例如，“其他信息”部分中的示例为“fullbackup”），并提供您为授权 Aurora 访问 Amazon S3 而创建的 IAM 角色。 | AWS DevOps/database 管理员 | 
| 验证 Aurora MySQL 数据库。 | 根据您从源数据库获得的计数来验证已恢复的 Aurora 数据库集群中的架构和对象计数。 | 数据库管理员 | 
| 设置二进制日志复制。 | 在创建恢复到 Aurora 数据库集群的最后一次备份之前，请使用您之前记下的二进制日志序列。在源数据库上创建复制用户，然后按照“其他信息”部分中的说明提供相应的权限，在 Aurora 上启用复制，并确认复制已同步。 | AWS DevOps/database 管理员 | 

## 相关资源
<a name="migrate-on-premises-mysql-databases-to-aurora-mysql-using-percona-xtrabackup-amazon-efs-and-amazon-s3-resources"></a>

**创建 Amazon EFS 文件系统**
+ [创建安全组](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#CreatingSecurityGroups)（Amazon VPC 文档）
+ [传输网关 VPN 连接](https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpn-attachments.html)（Amazon VPC 文档）
+ [使用 AWS Transit Gateway 扩展 VPN 吞吐量](https://aws.amazon.com/blogs/networking-and-content-delivery/scaling-vpn-throughput-using-aws-transit-gateway/)（联网和内容交付博客）
+ [创建 Amazon EFS 文件系统](https://docs.aws.amazon.com/efs/latest/ug/efs-onpremises.html#wt5-step1-efs)（Amazon EFS 文档）
+ [创建挂载目标](https://docs.aws.amazon.com/efs/latest/ug/accessing-fs.html)（Amazon EFS 文档）
+ [加密静态数据](https://docs.aws.amazon.com/efs/latest/ug/encryption-at-rest.html)（Amazon EFS 文档）

**挂载 EFS 文件系统**
+ 亚马逊@@ [的 IAM 角色 EC2（亚马逊](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) EC2 文档）
+ [启动亚马逊 EC2 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-launch-instance)（亚马逊 EC2 文档）
+ [安装 NFS 客户端](https://docs.aws.amazon.com/efs/latest/ug/efs-onpremises.html#wt5-step4-install-nfs)（Amazon EFS 文档）
+ [在本地客户端上安装 Amazon EFS 文件系统](https://docs.aws.amazon.com/efs/latest/ug/efs-onpremises.html#wt5-step3-connect)（Amazon EFS 文档）
+ [安装 EFS 文件系统](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html)（Amazon EFS 文档）

**创建 MySQL 源数据库的备份**
+ [安装 Percona XtraBackup 2.3](https://www.percona.com/doc/percona-xtrabackup/2.3/installation.html)（Per XtraBackup cona 文档）
+ [安装 Percona XtraBackup 2.4](https://www.percona.com/doc/percona-xtrabackup/2.4/installation.html)（Per XtraBackup cona 文档） 
+ [设置复制主配置](https://dev.mysql.com/doc/refman/5.7/en/replication-howto-masterbaseconfig.html)（MySQL 文档）
+ [将数据从外部 MySQL 数据库迁移到 Aurora MySQL 数据库集群](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Migrating.ExtMySQL.html)（Aurora 文档）
+ [增量备份](https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/incremental_backup.html)（Percona 文档 XtraBackup ）

**将备份恢复到 Amazon Aurora MySQL**
+ [创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#create-bucket-intro)（Amazon S3 文档）
+ [使用 SSH 连接到 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AccessingInstancesLinux.html)（Amazon EC2 文档）
+ [配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)（AWS CLI 文档）
+ [同步命令](https://docs.aws.amazon.com/cli/latest/reference/s3/sync.html)（AWS CLI 命令参考）
+ [创建 IAM policy 以访问 Amazon S3 资源](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Integrating.Authorizing.IAM.S3CreatePolicy.html)（Aurora 文档）
+ [数据库集群先决条件](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.CreateInstance.html#Aurora.CreateInstance.Prerequisites)（Aurora 文档）
+ [使用数据库子网组](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_VPC.WorkingWithRDSInstanceinaVPC.html#USER_VPC.Subnets)（Aurora 文档）
+ [为私有数据库实例创建 VPC 安全组](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_Tutorials.WebServerDB.CreateVPC.html#CHAP_Tutorials.WebServerDB.CreateVPC.SecurityGroupDB)（Aurora 文档）
+ [从 S3 存储桶恢复 Aurora MySQL 数据库集群](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Migrating.ExtMySQL.html#AuroraMySQL.Migrating.ExtMySQL.S3.Restore)（Aurora 文档）
+ [使用 MySQL 或其他 Aurora 数据库集群设置复制](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.html#AuroraMySQL.Replication.MySQL.SettingUp)（Aurora 文档）
+ [mysql.rds\$1set\$1external\$1master procedure](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql_rds_set_external_master.html)（Amazon RDS 上的 MySQL 参考）
+ [mysql.rds\$1start\$1replication procedure](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/mysql_rds_start_replication.html)（Amazon RDS 上的 MySQL SQL 参

**其他参考资料**
+ [将数据从外部 MySQL 数据库迁移到 Aurora MySQL 数据库集群](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Migrating.ExtMySQL.html)（Aurora 文档）
+ [MySQL 服务器下载](https://downloads.mysql.com/archives/community/)（Oracle 网站）

**教程和视频**
+  [使用 Amazon S3 将 MySQL 数据迁移到 Aurora MySQL 数据库集群](https://aws.amazon.com/premiumsupport/knowledge-center/migrate-mysql-aurora-innobackup/)（AWS Knowledge Center）
+  [Amazon EFS 设置和挂载](https://www.youtube.com/watch?v=NR8rVsSn_dY)（视频）

## 附加信息
<a name="migrate-on-premises-mysql-databases-to-aurora-mysql-using-percona-xtrabackup-amazon-efs-and-amazon-s3-additional"></a>

**安装 NFS 客户端**
+ 如果您使用的是 Red Hat 或类似的 Linux 操作系统，请使用以下命令： 

```
$ sudo yum -y install nfs-utils
```
+ 如果您使用的是 Ubuntu 或类似的 Linux 操作系统，请使用以下命令： 

```
$ sudo apt-get -y install nfs-common
```

有关更多信息，请参阅 Amazon EFS 文档中的[演练](https://docs.aws.amazon.com/efs/latest/ug/efs-onpremises.html#wt5-step4-install-nfs)。

**挂载 Amazon EFS 文件系统**

使用命令：

```
mkdir ~/<efs_mount_name>
$ sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport mount-target-IP:/ ~/<efs_mount_name>
```

有关更多信息，请参阅 Amazon EFS 文档中的[演练](https://docs.aws.amazon.com/efs/latest/ug/efs-onpremises.html#wt5-step3-connect)和[挂载 EFS 文件系统](https://docs.aws.amazon.com/efs/latest/ug/mounting-fs.html)。

**生成 MySQL 源数据库的备份**

*完整备份*

使用如下命令，该命令获取备份，将其压缩，然后将其拆分为每个大小 1 GB 的小块：

```
xtrabackup --backup --user=dbuser --password=<password> --binlog-info=AUTO --stream=tar --target-dir=~/<efs_mount_name>/fullbackup | gzip - | split -d --bytes=1024MB - ~/<efs_mount_name>/fullbackup/backup.tar.gz &
```

如果您计划在完整备份后进行后续增量备份，请不要压缩和拆分备份。使用类似于以下内容的命令：

```
xtrabackup --backup --user=dbuser --password=<password> --target-dir=~/<efs_mount_name>/fullbackup/
```

*增量备份*

使用完整备份路径作为 `--incremental-basedir` 参数；例如：

```
xtrabackup --backup --user=dbuser --password=<password> --target-dir=~/<efs_mount_name>/incremental/backupdate --incremental-basedir=~/<efs_mount_name>/fullbackup
```

其中 *basedir* 是完整备份和 xtrabackup\$1checkpoints 文件的路径。

有关更多信息，请参阅 Aurora 文档中的[将数据从外部 MySQL 数据库迁移到 Amazon Aurora MySQL 数据库集群](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Migrating.ExtMySQL.html)。

**准备备份**

要准备完整备份，请执行以下操作：

```
xtrabackup --prepare --apply-log-only --target-dir=~/<efs_mount_name>/fullbackup
```

要准备增量备份，请执行以下操作：

```
xtrabackup --prepare --apply-log-only --target-dir=~/<efs_mount_name>/fullbackup --incremental-dir=~/<efs_mount_name>/incremental/06062020
```

要准备最终备份，请执行以下操作：

```
xtrabackup --prepare --target-dir=~/<efs_mount_name>/fullbackup --incremental-dir=~/<efs_mount_name>/incremental/06072020
```

有关更多信息，请参阅 Percona XtraBackup 文档中的[增量备份](https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/incremental_backup.html)。

**压缩和拆分合并的备份**

要将合并的备份压缩到 \$1/<efs\$1mount\$1name>/fullbackup，请执行以下操作：

```
tar -zcvf <backupfilename.tar.gz> ~/<efs_mount_name>/fullbackup
```

要拆分备份，请执行以下操作：

```
split -d -b1024M --verbose  <backupfilename.tar.gz> <backupfilename.tar.gz>
```

**设置二进制日志复制**

要在源数据库上创建复制用户并提供相应的权限，请执行以下操作：

```
CREATE USER 'repl_user'@'' IDENTIFIED BY ''; GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'';
```

要通过连接到 Aurora 数据库集群在 Aurora 上启用复制，请在数据库集群参数组中启用二进制日志。设置 `binlog_format = mixed`（首选混合模式）。此更改要求您重新启动实例才能应用更新。

```
CALL mysql.rds_set_external_master ('sourcedbinstanceIP', sourcedbport, 'repl_user', '', 'binlog_file_name', binlog_file_position, 0); CALL mysql.rds_start_replication;
```

要确认复制是否处于同步状态，请执行以下操作：

```
SHOW Slave Status \G;
```

**落后秒数主**字段显示 Aurora 与本地数据库相比落后了多远。