

# 将数据导入到 Amazon RDS for MySQL 数据库实例
<a name="MySQL.Procedural.Importing.Other"></a>

您可以使用多种不同的技术将数据导入到 RDS for MySQL 数据库实例。最佳方法取决于多种因素：
+ 数据的来源
+ 数据量
+ 一次性导入，还是持续导出
+ 停机时间量

 如果还要随数据一起迁移应用程序，则务必考虑停机时间量。

下表中列出了将数据导入到 RDS for MySQL 数据库实例的技巧：


| 来源 | 数据量 | 一次性或持续 | 应用程序停机时间 | 方法 | 更多信息 | 
| --- | --- | --- | --- | --- | --- | 
|  本地或 Amazon EC2 上的现有 MySQL 数据库  |  任何  |  一次性  |  一段时间  |  创建本地数据库的备份，将其存储在 Amazon S3 上，然后将该备份文件还原到运行 MySQL 的新 Amazon RDS 数据库实例上。  |  [将备份还原到 Amazon RDS for MySQL 数据库实例](MySQL.Procedural.Importing.md)  | 
|  本地或 Amazon EC2 上的现有 MySQL 数据库  |  任何  |  持续  |  最低  |  配置复制，使用现有 MySQL 数据库作为复制源。  |  [配置与外部源实例之间的二进制日志文件位置复制](MySQL.Procedural.Importing.External.Repl.md) [将数据导入 Amazon RDS for MySQL 数据库实例并减少停机时间](mysql-importing-data-reduced-downtime.md)  | 
|  任何现有数据库  |  任何  |  一次性或持续  |  最低  |  使用 AWS Database Migration Service 可在最少停机时间下迁移数据库，对于很多数据库引擎，将继续进行持续复制。  |  *AWS Database Migration Service 用户指南*中的[什么是 AWS Database Migration Service](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 和[将与 MySQL 兼容的数据库作为 AWS DMS 的目标](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Target.MySQL.html)   | 
|  现有 MySQL 数据库实例  |  任何  |  一次性或持续  |  最低  |  为正在进行的复制创建只读副本。提升只读副本用于一次性创建新数据库实例。  |  [使用数据库实例只读副本](USER_ReadRepl.md)  | 
|  现有 MySQL 数据库  |  小型  |  一次性  |  一段时间  | 使用命令行实用程序，将数据直接复制到您的 MySQL 数据库实例。 |  [将数据从外部 MySQL 数据库导入到 Amazon RDS for MySQL 数据库实例](mysql-importing-data-external-database.md)  | 
|  未存储在现有数据库中的数据  |  中  |  一次性  |  一段时间  | 使用 MySQL LOAD DATA LOCAL INFILE 语句创建平面文件并导入这些文件。 |  [从任意源将数据导入 Amazon RDS for MySQL 数据库实例](mysql-importing-data-any-source.md)  | 

**注意**  
`mysql` 系统数据库包含登录到数据库实例并访问数据所需的身份验证和授权信息。在数据库实例中删掉、改动、重命名或截取 `mysql` 数据库中的表、数据或其他内容可能会导致错误，并可能导致无法访问数据库实例和数据。如果发生此情况，您可以使用 AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html) 命令从快照中还原数据库实例。您可以使用 AWS CLI [https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-to-point-in-time.html) 命令恢复数据库实例。

# 为 MySQL 导入数据的注意事项
<a name="MySQL.Procedural.Importing.Advanced"></a>

以下内容包含与将数据加载到 MySQL 中相关的技术信息。此内容面向熟悉 MySQL 服务器架构的用户。

## 二进制日志记录
<a name="MySQL.Procedural.Importing.Advanced.Log"></a>

与禁用日志记录相比，启用二进制日志记录会降低数据加载性能，并且需要多达四倍的额外磁盘空间。用于加载数据的事务大小直接影响系统性能和磁盘空间需求，也即，事务越大，需要的资源越多。

## 事务大小
<a name="MySQL.Procedural.Importing.Advanced.Size"></a>

事务大小会影响 MySQL 数据加载的以下方面：
+ 资源消耗
+ 磁盘空间利用率
+ 恢复进程
+ 恢复时间
+ 输入格式（平面文件或 SQL）

本部分介绍了事务大小如何影响二进制日志记录以及让案例在大数据加载过程中禁用二进制日志记录。可以通过设置 Amazon RDS 自动备份保留期来启用和禁用二进制日志记录。非零值会启用二进制日志记录，零会将其禁用。有关更多信息，请参阅 [备份保留期](USER_WorkingWithAutomatedBackups.BackupRetention.md)。

本节还介绍大型事务对 InnoDB 的影响以及将事务大小保持为较小的重要性。

### 小型事务
<a name="MySQL.Procedural.Importing.Advanced.Log.Small"></a>

对于小型事务，二进制日志记录会使加载数据所需的磁盘写入次数翻倍。这种影响会严重降低其他数据库会话的性能，并增加数据加载所需的时间。所经历的降级在一定程度上取决于以下因素：
+ 上传速率
+ 在加载期间发生的其它数据库活动
+ Amazon RDS 数据库实例的容量

此外，二进制日志占用的磁盘空间大致等于加载的数据量，直至备份和移除日志。Amazon RDS 通过频繁备份和移除二进制日志来尽量减少占用的磁盘空间量。

### 大型事务
<a name="MySQL.Procedural.Importing.Advanced.Log.Large"></a>

对于大型事务，二进制日志记录会使 IOPS 和磁盘使用量增加两倍，原因如下：
+ 二进制日志缓存将事务数据临时存储在磁盘上。
+ 此缓存会随着事务大小而增长，这会占用磁盘空间。
+ 当事务（提交或回滚）完成时，系统会将缓存复制到二进制日志。

此过程会创建数据的三个副本：
+ 原始数据
+ 磁盘上的缓存
+ 最终二进制日志条目

每个写入操作都会产生额外的 IO，从而进一步影响性能。

因此，与禁用日志记录相比，二进制日志记录需要三倍的磁盘空间。例如，在单个事务中加载 10 GiB 的数据会创建三个副本：
+ 表数据为 10 GiB
+ 二进制日志缓存为 10 GiB
+ 二进制日志文件为 10 GiB

所需的临时磁盘空间总量为 30 GiB。

磁盘空间重要注意事项：
+ 缓存文件会一直存在，直到会话结束或新事务创建另一个缓存。
+ 二进制日志会保留直至对其进行备份，可能会在很长一段时间内占用 20 GiB（缓存和日志）。

如果您使用 `LOAD DATA LOCAL INFILE` 来加载数据，数据恢复会创建第四个副本，以防数据库必须从加载前进行的备份中恢复。在恢复期间，MySQL 将二进制日志中的数据提取到平面文件中。然后，MySQL 运行 `LOAD DATA LOCAL INFILE`。在前一个示例的基础上，此恢复需要的临时磁盘空间总量为 40 GiB，也即表、缓存、日志和本地文件各为 10 GiB。如果没有至少 40 GiB 的可用磁盘空间，则恢复将失败。

### 优化大数据加载
<a name="MySQL.Procedural.Importing.AnySource.Advanced.Disable"></a>

对于大数据加载，请禁用二进制日志记录，以减少开销和磁盘空间要求。可以通过将备份保留期设置为 0 来禁用二进制日志记录。完成加载后，将备份保留期还原为适当的非零值。有关更多信息，请参阅[修改 Amazon RDS 数据库实例](Overview.DBInstance.Modifying.md)和设置表中的[备份保留期](USER_ModifyInstance.Settings.md)。

**注意**  
如果数据库实例是只读副本的源数据库实例，则您无法将备份保留期设置为 0。

在加载数据之前，我们建议您创建数据库快照。有关更多信息，请参阅 [管理手动备份](USER_ManagingManualBackups.md)。

## InnoDB
<a name="MySQL.Procedural.Importing.Advanced.InnoDB"></a>

以下有关撤消日志记录和恢复选项的信息支持将 InnoDB 事务保持为较小，以优化数据库性能。

### 了解 InnoDB 撤消日志记录
<a name="MySQL.Procedural.Importing.Advanced.InnoDB.Undo"></a>

撤消是一种日志记录机制，可启用事务回滚并支持多版本并发控制（MVCC）。

对于 MySQL 5.7 及更低版本，撤消日志存储在 InnoDB 系统表空间（通常为 ibdata1）中，并保留至清除线程移除它们为止。因此，大数据加载事务可能会导致系统表空间变得相当大，并占用磁盘空间，除非重新创建数据库，否则无法回收这些磁盘空间。

对于所有 MySQL 版本，清除线程必须等待以移除所有撤消日志，直到最旧的活动事务提交或回滚。如果数据库在加载过程中正在处理其它事务，则其撤消日志也会累积并且无法移除，即使事务提交并且没有其它事务需要 MVCC 的撤消日志，也是如此。在这种情况下，所有事务（包括只读事务）都会变慢。之所以发生这种变慢过程，是因为所有事务都访问任何事务（而不仅仅是加载事务）更改的所有行。实际上，事务必须扫描一些撤消日志，在撤消日志清理期间，长时间运行的加载事务已阻止清除这些撤消日志。这会影响访问已修改行的任何操作的性能。

### InnoDB 事务恢复选项
<a name="MySQL.Procedural.Importing.Advanced.InnoDB.Rollback"></a>

尽管 InnoDB 优化了提交操作，但大型事务回滚速度很慢。为了加快恢复速度，请执行时间点故障恢复或还原数据库快照。有关更多信息，请参阅[时间点故障恢复](USER_PIT.md)和[还原到数据库实例](USER_RestoreFromSnapshot.md)。

## 数据导入格式
<a name="MySQL.Procedural.Importing.Advanced.InputFormat"></a>

MySQL 支持两种数据导入格式：平面文件和 SQL。查看有关每种格式的信息，以确定最适合您需求的选项。

### 平面文件
<a name="MySQL.Procedural.Importing.Advanced.InputFormat.FlatFiles"></a>

对于小型事务，请使用 `LOAD DATA LOCAL INFILE` 加载平面文件。与使用 SQL 相比，这种数据导入格式具有以下优势：
+ 减少网络流量
+ 降低数据传输成本
+ 减少了数据库处理开销
+ 处理速度更快

`LOAD DATA LOCAL INFILE` 会将整个平面文件作为一个事务进行加载。将各个文件的大小保持为较小可获得以下优势：
+ **恢复功能**：可以保持跟踪哪些文件已加载。如果在加载期间出现问题，可以从停止处继续加载。可能需要将一些数据重新传输到 Amazon RDS，但使用小文件，就可以将重新传输的量减少至最低水平。
+ **并行数据加载**：如果 IOPS 和网络带宽足以支持单个文件加载，那么并行加载就可以节省时间。
+ **加载速率控制**：如果数据加载对其它进程产生负面影响，则可以通过增加文件之间的间隔来控制加载速率。

大型事务会降低使用 `LOAD DATA LOCAL INFILE` 导入数据的优势。当您无法将大量数据分解成较小的文件时，可以考虑使用 SQL。

### SQL
<a name="MySQL.Procedural.Importing.Advanced.InputFormat.SQL"></a>

与平面文件相比，SQL 的一个主要优势为：您可以轻松地将事务大小保持为较小。但是，SQL 的加载时间可能比平面文件长得多。此外，在发生故障后，可能难以确定从哪里恢复，而您无法重新启动 mysqldump 文件。如果加载 mysqldump 文件时出现故障，您必须修改或替换该文件，然后才能恢复加载。或者，在纠正故障的原因后，您可以恢复到加载前的时间点，并重新发送该文件。有关更多信息，请参阅 [时间点故障恢复](USER_PIT.md)。

## 使用 Amazon RDS 数据库快照提供数据库检查点
<a name="MySQL.Procedural.Importing.Advanced.Checkpoints"></a>

如果您在没有二进制日志记录的情况下长时间（如数小时或数天）加载数据，请使用数据库快照提供定期检查点来实现数据安全。每个数据库快照都会创建数据库实例的一致副本，该副本在系统故障或数据损坏事件期间用作恢复点。由于数据库快照速度很快，因此频繁的检查点对加载性能的影响微乎其微。您可以在不影响数据库持久性或恢复能力的情况下，删除以前的数据库快照。有关数据库快照的更多信息，请参阅[管理手动备份](USER_ManagingManualBackups.md)。

## 减少数据库加载时间
<a name="MySQL.Procedural.Importing.Advanced.LoadTime"></a>

以下各项是减少加载时间的其它技巧：
+ 在将数据加载到 MySQL 数据库之前，请创建所有二级索引。与其它数据库系统不同，MySQL 在添加或修改二级索引时会重建整个表。此过程会创建一个包含索引更改的新表，复制所有数据，然后删除原始表。
+ 按主键顺序加载数据。对于 InnoDB 表，这可以将加载时间缩短 75% 至 80%，并将数据文件大小减少 50%。
+ 通过将 `foreign_key_checks` 设置为 `0` 来禁用外键约束。对于使用 `LOAD DATA LOCAL INFILE` 加载的平面文件，这通常是必需的。对于任何加载，禁用外键检查会加快数据加载速度。加载完成后，通过将 `foreign_key_checks` 设置为 `1` 来重新启用约束并验证数据。
+ 并行加载数据，除非接近资源限制。要实现跨多个表段的并行加载，请在适当时使用分区表。
+ 要减少 SQL 执行开销，请将多条 `INSERT` 语句合并为单个多值 `INSERT` 操作。`mysqldump` 自动实现此优化。
+ 通过将 `innodb_flush_log_at_trx_commit` 设置为 `0` 来减少 InnoDB 日志 IO 操作。加载完成后，将 `innodb_flush_log_at_trx_commit` 还原为 `1`。
**警告**  
将 `innodb_flush_log_at_trx_commit` 设置为 `0` 会导致 InnoDB 每秒都刷新其日志，而不是在每次提交时刷新。此设置可以提高性能，但在系统故障期间可能会有事务丢失的风险。
+ 如果您要将数据加载到没有只读副本的数据库实例，请将 `sync_binlog` 设置为 `0`。加载完成后，将 `sync_binlog parameter` 还原为 `1`。
+ 在将数据库实例转换为多可用区部署之前，将数据加载到单可用区实例中。如果数据库实例已经使用多可用区部署，我们建议您不要切换为单可用区部署来加载数据。这样做所带来的改进微不足道。

# 将备份还原到 Amazon RDS for MySQL 数据库实例
<a name="MySQL.Procedural.Importing"></a>

Amazon RDS 支持使用备份文件导入 MySQL 数据库。您可以创建数据库的备份，将备份文件存储在 Amazon S3 上，然后将该备份文件还原到运行 MySQL 的新 Amazon RDS 数据库实例上。Amazon RDS 支持在所有 AWS 区域中从 Amazon S3 导入备份文件。

本节中介绍的方案将还原本地数据库的备份。只要数据库可供访问，您就可以将此技术用于其它位置（例如 Amazon EC2 或其它云服务）中的数据库。

下图显示了支持的方案。

![\[MySQL 从 S3 中导入备份文件。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/MySQL-bak-file.png)


如果在创建、复制和还原备份文件时，您的本地数据库可能处于脱机状态，则我们建议您使用备份文件将数据库导入到 Amazon RDS。如果数据库无法脱机，则可以使用以下方法之一：
+ **二进制日志** – 首先，将备份文件从 Amazon S3 导入到 Amazon RDS，如本主题所述。然后，使用二进制日志（binlog）复制来更新数据库。有关更多信息，请参阅 [配置与外部源实例之间的二进制日志文件位置复制](MySQL.Procedural.Importing.External.Repl.md)。
+ **AWS Database Migration Service** – 使用 AWS Database Migration Service 将数据库迁移到 Amazon RDS。有关更多信息，请参阅[什么是 AWS Database Migration Service？](https://docs.aws.amazon.com/dms/latest/userguide/Welcome.html) 

## 将备份文件从 Amazon S3 导入到 Amazon RDS 的设置概述
<a name="MySQL.Procedural.Importing.Enabling"></a>

要将备份文件从 Amazon S3 导入到 Amazon RDS，您需要以下组件：
+ 用于存储备份文件的 Amazon S3 存储桶。

  如果您已有一个 Amazon S3 存储桶，则可以使用该存储桶。如果没有 Amazon S3 存储桶，请创建一个新的存储桶。有关更多信息，请参阅[创建存储桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingaBucket.html)。
+ Percona XtraBackup 创建的本地数据库备份。

  有关更多信息，请参阅 [创建数据库备份](#MySQL.Procedural.Importing.Backup)。
+ AWS Identity and Access Management（IAM）角色，支持 Amazon RDS 访问 S3 存储桶。

  如果您已有 IAM 角色，则可以使用该角色并向其附加信任和权限策略。有关更多信息，请参阅 [手动创建 IAM 角色](#MySQL.Procedural.Importing.Enabling.IAM)。

  如果您没有 IAM 角色，则有两个选项：
  + 您可以手动创建新的 IAM 角色。有关更多信息，请参阅 [手动创建 IAM 角色](#MySQL.Procedural.Importing.Enabling.IAM)。
  + 您可以选择让 Amazon RDS 为您创建新的 IAM 角色。如果您希望 Amazon RDS 为您创建新的 IAM 角色，请按照[将数据从 Amazon S3 导入到新的 MySQL 数据库实例](#MySQL.Procedural.Importing.PerformingImport)一节中使用 AWS 管理控制台的过程进行操作。

## 创建数据库备份
<a name="MySQL.Procedural.Importing.Backup"></a>

可以使用 Percona XtraBackup 软件创建备份。建议您使用最新的 Percona XtraBackup 版本。您可以通过 Percona 网站上的 [Software Downloads](https://www.percona.com/downloads/) 安装 Percona XtraBackup。

**警告**  
创建数据库备份时，XtraBackup 可能会将凭证保存在 xtrabackup\$1info 文件中。务必确认 xtrabackup\$1info 文件中的 `tool_command` 设置不包含任何敏感信息。

您使用的 Percona XtraBackup 版本取决于您要备份的 MySQL 版本。
+ **MySQL 8.4** – 使用 Percona XtraBackup 版本 8.4。
+ **MySQL 8.0** – 使用 Percona XtraBackup 版本 8.0。
**注意**  
Percona XtraBackup 8.0.12 及更高版本支持迁移所有 MySQL 8.0 版本。如果要迁移到 RDS for MySQL 8.0.32 或更高版本，则必须使用 Percona XtraBackup 8.0.12 或更高版本。
+ **MySQL 5.7** – 使用 Percona XtraBackup 版本 2.4。

您可以使用 Percona XtraBackup 来创建 MySQL 数据库文件的完整备份。或者，如果已使用 Percona XtraBackup 备份 MySQL 数据库文件，您可以上传现有的完整和增量备份目录和文件。

有关使用 Percona XtraBackup 备份数据库的更多信息，请参阅 Percona 网站上的 [Percona XtraBackup - Documentation](https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html)。

### 使用 Percona XtraBackup 创建完整备份
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Full"></a>

要为 Amazon RDS 可从 Amazon S3 中还原的 MySQL 数据库文件创建完整备份，请使用 Percona XtraBackup 实用程序 (`xtrabackup`)。

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

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

如果您想将备份压缩到单个文件中（如果需要，您可以稍后将其拆分为多个文件），可以根据 MySQL 版本将备份保存为以下格式之一：
+ **Gzip (.gz)**：适用于 MySQL 5.7 及更低版本
+ **tar (.tar)**：适用于 MySQL 5.7 及更低版本
+ **Percona xbstream (.xbstream)**：适用于所有 MySQL 版本

**注意**  
Percona XtraBackup 8.0 及更高版本仅支持使用 Percona xbstream 进行压缩。

**MySQL 5.7 及更低版本**

以下命令为您的 MySQL 数据库创建一个拆分成多个 Gzip 文件的备份。将值替换为您自己的信息。

```
xtrabackup --backup --user=my_user --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 5.7 及更低版本**

以下命令为您的 MySQL 数据库创建一个拆分成多个 tar 文件的备份。将值替换为您自己的信息。

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

**所有 MySQL 版本**

以下命令为您的 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 使用增量备份
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Incr"></a>

如果您已使用 Percona XtraBackup 对 MySQL 数据库文件进行完整备份和增量备份，则无需创建完整备份和将备份文件上传到 Amazon S3。相反，为了节省时间，请将现有的备份目录和文件复制到 Amazon S3 存储桶中。有关使用 Percona XtraBackup 创建增量备份的更多信息，请参阅 Percona 网站上的 [Create an incremental backup](https://docs.percona.com/percona-xtrabackup/LATEST/create-incremental-backup.html)。

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

### Percona XtraBackup 的备份注意事项
<a name="AuroraMySQL.Migrating.ExtMySQL.S3.Backup.Considerations"></a>

Amazon RDS 根据文件名使用您的备份文件。根据文件格式使用相应的文件扩展名来命名备份文件。例如，使用 `.xbstream` 来表示使用 Percona xbstream 格式存储的文件。

Amazon RDS 按照字母顺序以及自然数字顺序使用您的备份文件。为确保按正确的顺序写入和命名备份文件，请在发出 `xtrabackup` 命令时使用 `split` 选项。

Amazon RDS 不支持使用 Percona XtraBackup 创建的部分备份。在备份数据库的源文件时，不能使用以下选项创建部分备份：
+ `--tables`
+ `--tables-exclude`
+ `--tables-file`
+ `--databases`
+ `--databases-exclude`
+ `--databases-file`

## 手动创建 IAM 角色
<a name="MySQL.Procedural.Importing.Enabling.IAM"></a>

如果您没有 IAM 角色，则可以手动创建一个新的角色。但是，如果您使用 AWS 管理控制台还原数据库，我们建议您选择让 Amazon RDS 为您创建这个新的 IAM 角色。要让 Amazon RDS 为您创建此角色，请按照[将数据从 Amazon S3 导入到新的 MySQL 数据库实例](#MySQL.Procedural.Importing.PerformingImport)一节中的过程进行操作。

要手动创建新的 IAM 角色以从 Amazon S3 导入数据库，请创建一个角色，以便将权限从 Amazon RDS 委托给 Amazon S3 存储桶。在创建 IAM 角色时，可附加信任和权限策略。要从 Amazon S3 中导入备份文件，请使用类似于以下示例的信任和权限策略。有关创建角色的更多信息，请参阅[创建将权限委派给 AWS 服务的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)。

信任和权限策略要求您提供 Amazon Resource Name (ARN)。有关 ARN 格式的更多信息，请参阅 [Amazon Resource Name (ARN) 和 AWS 服务命名空间](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html)。

**Example 用于从 Amazon S3 导入的信任策略**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AssumeRoleForBackup",
      "Effect": "Allow",
      "Principal": {
        "Service": "rds.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

**Example 用于从 Amazon S3 导入的权限策略 – IAM 用户权限**  
在以下示例中，将 *iam\$1user\$1id* 替换为您自己的值。    
****  

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

**Example 用于从 Amazon S3 导入的权限策略 – 角色权限**  
在以下示例中，将 *amzn-s3-demo-bucket* 和 *prefix* 替换为您自己的值。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement":
    [
        {
        "Effect": "Allow",
        "Action":
            [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket"
        },
        {
        "Effect": "Allow",
        "Action":
            [
                "s3:GetObject"
            ],
        "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/prefix*"
        },
        {
        "Effect": "Allow",
        "Action":
            [
                "kms:Decrypt"
            ],
        "Resource": [
            "arn:aws:kms:us-east-1:111122223333:key/key_id*"
            ]
        }
    ]
}
```
如果包含文件名前缀，请在前缀后面包含星号 (\$1)。如果您不想指定前缀，请仅指定星号。

## 将数据从 Amazon S3 导入到新的 MySQL 数据库实例
<a name="MySQL.Procedural.Importing.PerformingImport"></a>

您可以使用AWS 管理控制台、AWS CLI 或 RDS API 将数据从 Amazon S3 导入到新的 MySQL 数据库实例。

### 控制台
<a name="MySQL.Procedural.Importing.Console"></a>

**将数据从 Amazon S3 导入到新的 MySQL 数据库实例**

1. 登录 AWS 管理控制台 并通过以下网址打开 Amazon RDS 控制台：[https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)。

1. 在 Amazon RDS 控制台的右上角，选择要在其中创建数据库实例的 AWS 区域。选择与包含数据库备份的 Amazon S3 桶相同的 AWS 区域。

1. 在导航窗格中，选择**数据库**。

1. 选择**从 S3 还原**。

   此时将显示**通过从 S3 还原创建数据库**页面。  
![\[通过从 S3 还原创建数据库页面，可在其中指定从 S3 还原数据库实例的详细信息。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/mys-s3-ingestion.png)

1. 在 **S3 源**下：

   1. 选择包含备份的 **S3 桶**。

   1. （可选）对于 **S3 前缀**，输入存储在 Amazon S3 存储桶中的文件的文件路径前缀。

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

      例如，您将备份文件存储在 S3 上名为 backups 的子文件夹中，并且具有多组备份文件，每个文件位于其自己的目录（gzip\$1backup1、gzip\$1backup2，依此类推）中。在这种情况下，要从 gzip\$1backup1 文件夹中的文件进行还原，请指定前缀 backups/gzip\$1backup1。

1. 在**引擎选项**下：

   1. 对于**引擎类型**，选择 **MySQL**。

   1. 对于**源引擎版本**，请选择源数据库的 MySQL 主版本。

   1. 对于**引擎版本**，选择您所在AWS 区域中 MySQL 主要版本的默认次要版本。

      在AWS 管理控制台中，仅默认的次要版本可用。完成导入后，您可以升级数据库实例。

1. 对于 **IAM 角色**，创建或选择具有所需信任策略和权限策略的 IAM 角色，即允许 Amazon RDS 访问您的 Amazon S3 存储桶。执行以下操作之一：
   + （推荐）选择**创建新角色**，然后输入 **IAM 角色名称**。选择此选项后，Amazon RDS 会自动为您创建具有信任策略和权限策略的角色。
   + 选择现有 IAM 角色。确保此角色符合[手动创建 IAM 角色](#MySQL.Procedural.Importing.Enabling.IAM)中的所有条件。

1. 指定数据库实例信息。有关每项设置的信息，请参阅 [数据库实例的设置](USER_CreateDBInstance.Settings.md)。
**注意**  
确保为新的数据库实例分配足够的存储空间，以便成功进行还原操作。  
要支持未来自动增长，请在**其他存储配置**下选择**启用存储自动扩缩**。

1. 根据需要选择其他设置。

1. 选择**创建数据库**。

### AWS CLI
<a name="MySQL.Procedural.Importing.CLI"></a>

要使用 AWS CLI 将数据从 Amazon S3 导入新的 MySQL 数据库实例，请使用以下选项运行 [restore-db-instance-from-s3](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-s3.html) 命令。有关每项设置的信息，请参阅[数据库实例的设置](USER_CreateDBInstance.Settings.md)。

**注意**  
确保为新的数据库实例分配足够的存储空间，以便成功进行还原操作。  
要启用存储自动扩缩并支持未来自动增长，请使用 `--max-allocated-storage` 选项。
+ `--allocated-storage`
+ `--db-instance-identifier`
+ `--db-instance-class`
+ `--engine`
+ `--master-username`
+ `--manage-master-user-password`
+ `--s3-bucket-name`
+ `--s3-ingestion-role-arn`
+ `--s3-prefix`
+ `--source-engine`
+ `--source-engine-version`

**Example**  
对于 Linux、macOS 或 Unix：  

```
 1. aws rds restore-db-instance-from-s3 \
 2.     --allocated-storage 250 \
 3.     --db-instance-identifier my_identifier \
 4.     --db-instance-class db.m5.large \
 5.     --engine mysql \
 6.     --master-username admin \
 7.     --manage-master-user-password \
 8.     --s3-bucket-name amzn-s3-demo-bucket \
 9.     --s3-ingestion-role-arn arn:aws:iam::account-number:role/rolename \
10.     --s3-prefix bucket_prefix \
11.     --source-engine my_sql \
12.     --source-engine-version 8.0.32 \
13.     --max-allocated-storage 1000
```
对于：Windows  

```
 1. aws rds restore-db-instance-from-s3 ^
 2.     --allocated-storage 250 ^
 3.     --db-instance-identifier my_identifier ^
 4.     --db-instance-class db.m5.large ^
 5.     --engine mysql ^
 6.     --master-username admin ^
 7.     --manage-master-user-password ^
 8.     --s3-bucket-name amzn-s3-demo-bucket ^
 9.     --s3-ingestion-role-arn arn:aws:iam::account-number:role/rolename ^
10.     --s3-prefix bucket_prefix ^
11.     --source-engine mysql ^
12.     --source-engine-version 8.0.32 ^
13.     --max-allocated-storage 1000
```

### RDS API
<a name="MySQL.Procedural.Importing.API"></a>

要使用 Amazon RDS API 将数据从 Amazon S3 导入新的 MySQL 数据库实例，请调用 [RestoreDBInstanceFromS3](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_RestoreDBInstanceFromS3.html) 操作。

## 将备份文件从 Amazon S3 导入到 Amazon RDS 的限制和注意事项
<a name="MySQL.Procedural.Importing.Limitations"></a>

以下限制和注意事项适用于将备份文件从 Amazon S3 导入到 RDS for MySQL 数据库实例：
+ 您只能将数据迁移到新的数据库实例，而不能迁移到现有的数据库实例。
+ 您必须使用 Percona XtraBackup 将数据备份到 Amazon S3。有关更多信息，请参阅 [创建数据库备份](#MySQL.Procedural.Importing.Backup)。
+ Amazon S3 存储桶和 RDS for MySQL 数据库实例必须在同一个 AWS 区域中。
+ 您无法从以下来源进行还原：
  + 到 Amazon S3 的数据库实例快照导出。您也无法将数据从数据库实例快照导出迁移到 Amazon S3 存储桶。
  + 加密的源数据库。但是，您可以加密正在迁移的数据。您也可以在迁移过程中不加密数据。
  + MySQL 5.5 或 5.6 数据库。
+ RDS for MySQL 不支持将 Percona Server for MySQL 用作源数据库，因为它可能在 `mysql schema` 中包含 `compression_dictionary*` 表。
+ RDS for MySQL 不支持主要版本或次要版本的反向迁移。例如，您无法从 MySQL 版本 8.0 迁移到 RDS for MySQL 5.7，也无法从 MySQL 版本 8.0.32 迁移到 RDS for MySQL 版本 8.0.26。
+ Amazon RDS 不支持从 Amazon S3 中的 db.t2.micro 数据库实例类上进行导入。不过，您可以还原到不同的数据库实例类，然后更改该数据库实例类。有关实例类的更多信息，请参阅[数据库实例类的硬件规格](Concepts.DBInstanceClass.Summary.md)。
+ Amazon S3 将上传到 Amazon S3 存储桶的文件大小限制为 5 TB。如果备份文件超过 5 TB，则必须将备份文件拆分为较小的文件。
+ Amazon RDS 将上传到 Amazon S3 存储桶的文件数限制为一百万个。如果数据库的备份数据 (包括所有完整和增量备份) 超过 100 万个文件，请使用 Gzip (.gz)、tar (.tar.gz) 或 Percona xbstream (.xbstream) 文件将完整和增量备份文件存储在 Amazon S3 存储桶中。Percona XtraBackup 8.0 仅支持使用 Percona xbstream 进行压缩。
+ 要为每个数据库实例提供管理服务，Amazon RDS 会在创建数据库实例时创建 `rdsadmin` 用户。由于 `rdsamin` 是 Amazon RDS 中的保留用户，因此以下限制适用：
  + Amazon RDS 不导入以 `'rdsadmin'@'localhost'` 作为定义者的函数、过程、视图、事件和触发器。有关更多信息，请参阅[以 'rdsamin'@'localhost' 作为定义者的存储对象](#MySQL.Procedural.Importing.StoredObjects)和[主用户账户权限](UsingWithRDS.MasterAccounts.md)。
  + 创建数据库实例时，Amazon RDS 会创建一个具有最大受支持权限的主用户。从备份还原时，Amazon RDS 会自动移除分配给正在导入的用户的任何不受支持的权限。

    要识别可能受此影响的用户，请参阅[具有不支持的权限的用户账户](#MySQL.Migrating.ExtMySQL.Prechecks.Users)。有关 RDS for MySQL 中支持的权限的更多信息，请参阅 [RDS for MySQL 的基于角色的权限模型](Appendix.MySQL.CommonDBATasks.privilege-model.md)。
+ Amazon RDS 不会迁移 `mysql` 架构中用户创建的表。
+ 您必须仅通过一个使用默认数据文件名 `ibdata1:12M:autoextend` 的数据文件来配置 `innodb_data_file_path` 参数。可以使用此方法迁移具有两个数据文件或具有不同名称的数据文件的数据库。

  以下示例是 Amazon RDS 不支持的文件名：
  + `innodb_data_file_path=ibdata1:50M`
  + `ibdata2:50M:autoextend`
  + `innodb_data_file_path=ibdata01:50M:autoextend`
+ 您无法从在默认 MySQL 数据目录外部定义表的源数据库中迁移。
+ 使用此方法的未压缩备份支持的最大大小限制为 64 TiB。对于压缩的备份，考虑到解压缩空间的需求，此限制会降低。在此类情况下，支持的最大备份大小为 `64 TiB - compressed backup size`。

  有关 RDS for MySQL 支持的最大数据库大小的信息，请参阅[通用型 SSD 存储](CHAP_Storage.md#Concepts.Storage.GeneralSSD)和[预置 IOPS SSD 存储](CHAP_Storage.md#USER_PIOPS)。
+ Amazon RDS 不支持导入 MySQL 以及其它外部组件和插件。
+ Amazon RDS 不会从您的数据库中还原所有内容。我们建议您从源 MySQL 系统数据库保存数据库架构以及以下项目的值，然后将这些内容添加到已还原的 RDS for MySQL 数据库实例（在创建该实例后）：
  + 用户账户
  + 函数
  + 存储过程
  + 时区信息。从 RDS for MySQL 数据库实例的本地操作系统中加载时区信息。有关更多信息，请参阅 [MySQL 数据库实例的本地时区](MySQL.Concepts.LocalTimeZone.md)。

### 以 'rdsamin'@'localhost' 作为定义者的存储对象
<a name="MySQL.Procedural.Importing.StoredObjects"></a>

Amazon RDS 不导入以 `'rdsadmin'@'localhost'` 作为定义者的函数、过程、视图、事件和触发器。

您可以在源 MySQL 数据库上使用以下 SQL 脚本来列出具有不受支持的定义程序的存储对象。

```
-- This SQL query lists routines with `rdsadmin`@`localhost` as the definer.

SELECT
    ROUTINE_SCHEMA,
    ROUTINE_NAME
FROM
    information_schema.routines
WHERE
    definer = 'rdsadmin@localhost';

-- This SQL query lists triggers with `rdsadmin`@`localhost` as the definer.

SELECT
    TRIGGER_SCHEMA,
    TRIGGER_NAME,
    DEFINER
FROM
    information_schema.triggers
WHERE
    DEFINER = 'rdsadmin@localhost';

-- This SQL query lists events with `rdsadmin`@`localhost` as the definer.

SELECT
    EVENT_SCHEMA,
    EVENT_NAME
FROM
    information_schema.events
WHERE
    DEFINER = 'rdsadmin@localhost';

-- This SQL query lists views with `rdsadmin`@`localhost` as the definer.
SELECT
    TABLE_SCHEMA,
    TABLE_NAME
FROM
    information_schema.views
WHERE
    DEFINER = 'rdsadmin@localhost';
```

### 具有不支持的权限的用户账户
<a name="MySQL.Migrating.ExtMySQL.Prechecks.Users"></a>

如果用户账户的权限不受 RDS for MySQL 支持，则在导入这些账户时将不包含这些不受支持的权限。有关支持的权限列表，请参阅[RDS for MySQL 的基于角色的权限模型](Appendix.MySQL.CommonDBATasks.privilege-model.md)。

可以在源数据库上运行以下 SQL 查询，以列出具有不受支持的权限的用户账户。

```
SELECT
    user,
    host
FROM
    mysql.user
WHERE
    Shutdown_priv = 'y'
    OR File_priv = 'y'
    OR Super_priv = 'y'
    OR Create_tablespace_priv = 'y';
```

# 将数据从外部 MySQL 数据库导入到 Amazon RDS for MySQL 数据库实例
<a name="mysql-importing-data-external-database"></a>

您可以将数据从现有 MySQL 数据库导入到 RDS for MySQL 数据库实例。为此，请使用 [mysqldump](https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html) 复制数据库，然后通过管道将其直接传输到 RDS for MySQL 数据库实例。`mysqldump` 命令行实用程序通常用于创建备份以及在 MySQL 服务器之间传输数据。该实用程序包含在 MySQL 客户端软件中。

**注意**  
如果您使用 MySQL 数据库实例导入或导出大量数据，则可以使用 `xtrabackup` 备份文件和 Amazon S3 更可靠、更块地将数据移入和移出 Amazon RDS。有关更多信息，请参阅 [将备份还原到 Amazon RDS for MySQL 数据库实例](MySQL.Procedural.Importing.md)。

将数据从外部数据库移动到 Amazon RDS 数据库实例的典型 `mysqldump` 命令类似以下示例。将值替换为您自己的信息。

```
mysqldump -u local_user \
    --databases database_name \
    --single-transaction \
    --compress \
    --order-by-primary  \
    --routines=0 \
    --triggers=0 \
    --events=0 \
    -plocal_password | mysql -u RDS_user \
        --port=port_number \
        --host=host_name \
        -pRDS_password
```

**重要**  
确保 `-p` 选项和输入的密码之间不留空格。  
作为安全最佳实践，请指定此示例中显示的提示以外的凭证。

确保您了解以下建议和注意事项：
+ 从转储文件中排除以下架构：
  + `sys`
  + `performance_schema`
  + `information_schema`

  默认情况下，`mysqldump` 实用工程序包括这些架构。
+ 如果您需要迁移用户和权限，请考虑使用生成数据控制语言 (DCL) 的工具 (如 [pt-show-grants](https://www.percona.com/doc/percona-toolkit/LATEST/pt-show-grants.html) 实用程序) 来重新创建用户和权限。
+ 要执行导入，请确保执行此操作的用户有权访问数据库实例。有关更多信息，请参阅 [使用安全组控制访问权限](Overview.RDSSecurityGroups.md)。

所用参数如下所示：
+ `-u local_user` – 用于指定用户名。在第一次使用该参数时，请指定您使用 `--databases` 参数确定的本地 MySQL 数据库中的用户账户名称。
+ `--databases database_name`：用于指定本地 MySQL 实例上您要导入 Amazon RDS 的数据库的名称。
+ `--single-transaction` – 用于确保从本地数据库加载的所有数据都与单一时间点保持一致。如果在 `mysqldump` 读取数据期间有其他进程更改数据，使用该参数有助于保持数据完整性。
+ `--compress` – 用于降低网络带宽消耗，方式为将数据从本地数据库发送到 Amazon RDS 之前压缩数据。
+ `--order-by-primary` – 用于减少加载时间，方式为根据主键对每个表中的数据进行排序。
+ `--routines`：如果您要复制的数据库中存在诸如存储过程或函数之类的例程，则使用此参数。将此参数设置为 `0`，这将在导入过程中排除例程。稍后在 Amazon RDS 数据库中手动重新创建例程。
+ `--triggers`：如果要复制的数据库中存在触发器，则使用此参数。将此参数设置为 `0`，这将在导入过程中排除触发器。稍后在 Amazon RDS 数据库中手动重新创建触发器。
+ `--events`：如果要复制的数据库中存在事件，则使用此参数。将此参数设置为 `0`，这将在导入过程中排除事件。稍后在 Amazon RDS 数据库中手动重新创建事件。
+ `-plocal_password` – 用于指定密码。在第一次使用该参数时，请为您使用第一个 `-u` 参数标识的用户账户指定密码。
+ `-u RDS_user` – 用于指定用户名。在第二次使用该参数时，请为您使用 `--host` 参数标识的 MySQL 数据库实例指定默认数据库上的用户账户的名称。
+ `--port port_number`：用于为您的 MySQL 数据库实例指定端口。默认情况下该值为 3306，除非您在创建数据库实例时更改了该值。
+ `--host host_name` – 用于从 Amazon RDS 数据库实例端点指定域名系统 (DNS) 名称，例如，`myinstance.123456789012.us-east-1.rds.amazonaws.com`。您可以在 Amazon RDS 控制台上的数据库实例详细信息中找到端点值。
+ `-pRDS_password` – 用于指定密码。在第二次使用该参数时，您为第二个 `-u` 参数确定的用户账户指定密码。

确保在 Amazon RDS 数据库中手动创建任何存储过程、触发器、函数或事件。如果您所复制的数据库中有上述任一对象，则在运行 `mysqldump` 时排除这些对象。为此，使用 `mysqldump` 命令时请包含以下参数：
+ `--routines=0`
+ `--triggers=0`
+ `--events=0`

**示例**

以下示例将本地主机上的 `world` 示例数据库复制到 RDS for MySQL 数据库实例中。将值替换为您自己的信息。

对于 Linux、macOS 或 Unix：

```
sudo mysqldump -u local_user \
    --databases world \
    --single-transaction \
    --compress \
    --order-by-primary  \
    --routines=0 \
    --triggers=0 \
    --events=0 \
    -plocal_password | mysql -u rds_user \
        --port=3306 \
        --host=my_instance.123456789012.us-east-1.rds.amazonaws.com \
        -pRDS_password
```

对于：Windows

在已通过右键单击 Windows 程序菜单上的**命令提示符**并选择**以管理员身份运行**打开的命令提示符中，运行以下命令：将值替换为您自己的信息。

```
mysqldump -u local_user ^
    --databases world ^
    --single-transaction ^
    --compress ^
    --order-by-primary  ^
    --routines=0 ^
    --triggers=0 ^
    --events=0 ^
    -plocal_password | mysql -u RDS_user ^
        --port=3306 ^
        --host=my_instance.123456789012.us-east-1.rds.amazonaws.com ^
        -pRDS_password
```

**注意**  
作为安全最佳实践，请指定示例中显示的提示以外的凭证。

# 将数据导入 Amazon RDS for MySQL 数据库实例并减少停机时间
<a name="mysql-importing-data-reduced-downtime"></a>

有时，您可能需要将数据从支持活动应用程序的外部 MySQL 数据库导入到 RDS for MySQL 数据库实例或 RDS for MySQL 多可用区数据库集群。使用以下过程可最大程度地减小对应用程序可用性产生的影响。如果使用非常大的数据库，该步骤也很有用。使用该过程，您可以通过减少跨网络传送到 AWS 的数据量以降低导入成本。

在该过程中，您将数据库数据的副本传输到 Amazon EC2 实例，并将数据导入到新的 Amazon RDS 数据库中。然后，使用复制功能使 Amazon RDS 数据库与活动的外部实例保持同步，再将应用程序重新导向到 Amazon RDS 数据库。基于二进制日志坐标配置复制。

**注意**  
如果您想要将数据导入到 RDS for MySQL 数据库实例中且您的方案支持此操作，则建议使用备份文件和 Amazon S3 将数据移入和移出 Amazon RDS。有关更多信息，请参阅 [将备份还原到 Amazon RDS for MySQL 数据库实例](MySQL.Procedural.Importing.md)。

下图显示将外部 MySQL 数据库导入到 Amazon RDS 上的 MySQL 数据库。

![\[显示将外部 MySQL 数据库导入到 Amazon RDS 上的 MySQL 数据库的工作流程。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_1.png)


## 任务 1：创建现有数据库的副本
<a name="mysql-importing-data-reduced-downtime-copy-database"></a>

要以尽可能少的停机时间将大量数据迁移到 RDS for MySQL 数据库，第一步是创建源数据的副本。

下图显示了创建 MySQL 数据库的备份。

![\[显示创建 MySQL 数据库的备份的工作流程。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_2.png)


您可以使用 `mysqldump` 实用程序创建 SQL 或分隔的文本格式的数据库备份。建议您在非生产环境中对每种格式运行测试，以便了解哪种方法能最大程度地减少 `mysqldump` 运行的时间。

我们还建议您对照将分隔文本格式用于加载所获得的好处来权衡 `mysqldump` 性能。使用分隔的文本格式的备份将为所转储的每个表创建制表符分隔的文本文件。为减少导入数据库所需的时间，您可以使用 `LOAD DATA LOCAL INFILE` 命令并行加载这些文件。有关更多信息，请参阅“从任意来源导入数据”过程中的[步骤 5：加载数据](mysql-importing-data-any-source.md#mysql-importing-data-any-source-load-data)。

在开始备份操作之前，确保对将复制到 Amazon RDS 的 MySQL 数据库设置复制选项。复制选项包括开启二进制日志记录和设置唯一的服务器 ID。设置这些选项将促使您的服务器开始记录数据库事务，并做好在该过程的后面充当源复制实例的准备。

确保您了解以下建议和注意事项：
+ 将 `--single-transaction` 选项与 `mysqldump` 结合使用，因为它会转储数据库的一致状态。为确保转储文件有效，请勿在 `mysqldump` 运行时运行数据定义语言 (DDL) 语句。您可以为这些操作计划维护时段。
+ 从转储文件中排除以下架构：
  + `sys`
  + `performance_schema`
  + `information_schema`

  默认情况下，`mysqldump` 实用工程序包括这些架构。
+ 如果您需要迁移用户和权限，请考虑使用生成数据控制语言 (DCL) 的工具 (如 [pt-show-grants](https://www.percona.com/doc/percona-toolkit/LATEST/pt-show-grants.html) 实用程序) 来重新创建用户和权限。

### 设置复制选项
<a name="mysql-importing-data-reduced-downtime-set-replication-options"></a>

1. 编辑 `my.cnf` 文件。此文件通常位于 `/etc` 下。

   ```
   sudo vi /etc/my.cnf
   ```

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

   以下示例显示 `my.cnf` 文件已更新的 `[mysqld]` 部分：

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

   有关更多信息，请参阅 MySQL 文档中的 [Setting the Replication Source Configuration](https://dev.mysql.com/doc/refman/8.4/en/replication-howto-masterbaseconfig.html)。

1. 要使用多可用区数据库集群进行复制，请将 `ENFORCE_GTID_CONSISTENCY` 和 `GTID_MODE` 参数设置为 `ON`。

   ```
   mysql> SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;
   ```

   ```
   mysql> SET @@GLOBAL.GTID_MODE = ON;
   ```

   使用数据库实例进行复制不需要这些设置。

1. 重新启动 `mysql` 服务。

   ```
   sudo service mysqld restart
   ```

### 创建现有数据库的备份副本
<a name="mysql-importing-data-reduced-downtime-create-backup"></a>

1. 使用 `mysqldump` 实用程序创建数据备份，并指定 SQL 或分隔的文本格式。

   对于 MySQL 8.0.25 及更低版本，指定 `--master-data=2` 以创建可用于启动服务器间复制的备份文件。对于 MySQL 8.0.26 及更高版本，指定 `--source-data=2` 以创建可用于启动服务器间复制的备份文件。有关更多信息，请参阅 MySQL 文档中的 [mysqldump — A Database Backup Program](https://dev.mysql.com/doc/refman/8.4/en/mysqldump.html)。

   要提高性能和确保数据完整性，请对于 `mysqldump` 使用 `--order-by-primary` 和 `--single-transaction` 选项。

   要避免在备份中包括 MySQL 系统数据库，请不要将 `--all-databases` 选项与 `mysqldump` 结合使用。有关更多信息，请参阅 MySQL 文档中的 [Creating a Data Snapshot Using mysqldump](https://dev.mysql.com/doc/mysql-replication-excerpt/8.0/en/replication-howto-mysqldump.html)。

   如有必要，可使用 `chmod` 来确保要在其中创建备份文件的目录是可写的。
**重要**  
在 Windows 中，以管理员身份运行命令窗口。
   + 要生成 SQL 输出，请使用以下命令：

     对于 Linux、macOS 或 Unix：

     ```
     sudo mysqldump \
         --databases database_name \
         --master-data=2  \
         --single-transaction \
         --order-by-primary \
         -r backup.sql \
         -u local_user \
         -ppassword
     ```
**注意**  
作为安全最佳实践，请指定示例中显示的提示以外的凭证。

     对于：Windows

     ```
     mysqldump ^
         --databases database_name ^
         --master-data=2  ^
         --single-transaction ^
         --order-by-primary ^
         -r backup.sql ^
         -u local_user ^
         -ppassword
     ```
**注意**  
作为安全最佳实践，请指定示例中显示的提示以外的凭证。
   + 要生成分隔文本输出，请使用以下命令：

     对于 Linux、macOS 或 Unix：

     ```
     sudo mysqldump \
         --tab=target_directory \
         --fields-terminated-by ',' \
         --fields-enclosed-by '"' \
         --lines-terminated-by 0x0d0a \
         database_name \
         --master-data=2 \
         --single-transaction \
         --order-by-primary \
         -ppassword
     ```

     对于：Windows

     ```
     mysqldump ^
         --tab=target_directory ^
         --fields-terminated-by "," ^
         --fields-enclosed-by """ ^
         --lines-terminated-by 0x0d0a ^
         database_name ^
         --master-data=2 ^
         --single-transaction ^
         --order-by-primary ^
         -ppassword
     ```
**注意**  
作为安全最佳实践，请指定示例中显示的提示以外的凭证。  
确保在 Amazon RDS 数据库中手动创建任何存储过程、触发器、函数或事件。如果您所复制的数据库中有上述任一对象，则在运行 `mysqldump` 时排除这些对象。为此，请在 `mysqldump` 命令中包含以下参数：  
`--routines=0`
`--triggers=0`
`--events=0`

     对于 MySQL 8.0.22 及更低版本，当您运行 `mysqldump` 并指定分隔文本格式时，将返回 `CHANGE MASTER TO` 注释。此注释包含主日志文件名称和位置。对于 MySQL 8.0.23 及更高版本，如果您使用分隔文本格式运行 `mysqldump`，将返回 `CHANGE REPLICATION SOURCE TO` 注释。此注释包含源日志文件名称和位置。如果外部实例是 MySQL 8.0.23 及更高版本，请注意 `MASTER_LOG_FILE` 和 `MASTER_LOG_POS` 的值。设置复制时需要这些值。

     对于 MySQL 8.0.22 及更低版本，将返回以下输出：

     ```
     -- Position to start replication or point-in-time recovery from
     --
     -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin-changelog.000031', MASTER_LOG_POS=107;
     ```

     对于 MySQL 8.0.23 及更高版本，将返回以下输出：

     ```
     -- Position to start replication or point-in-time recovery from
     --
     -- CHANGE SOURCE TO SOURCE_LOG_FILE='mysql-bin-changelog.000031', SOURCE_LOG_POS=107;
     ```

     对于 MySQL 8.0.22 及更低版本，如果您使用的是 SQL 格式，则可以在备份文件的 `CHANGE MASTER TO` 注释中获得主日志文件名称和位置。对于 MySQL 8.0.23 及更高版本，如果您使用的是 SQL 格式，则可以在备份文件的 `CHANGE REPLICATION SOURCE TO` 注释中获得源日志文件名称和位置。

1. 压缩复制后的数据可减少将数据复制到 Amazon RDS 数据库所需的网络资源量。记下备份文件的大小。您在确定要创建的 Amazon EC2 实例的大小时需要此信息。完成操作后，请使用 GZIP 或您的首选压缩实用程序来压缩备份文件。
   + 要压缩 SQL 输出，请使用以下命令：

     ```
     gzip backup.sql
     ```
   + 要压缩分隔文本输出，请使用以下命令：

     ```
     tar -zcvf backup.tar.gz target_directory
     ```

## 任务 2：创建 Amazon EC2 实例和复制压缩的数据库
<a name="mysql-importing-data-reduced-downtime-create-ec2-copy-database"></a>

将压缩的数据库备份文件复制到 Amazon EC2 实例所占用的网络资源少于直接在数据库实例之间复制未压缩的数据所占用的网络资源。当您的数据位于 Amazon EC2 中后，可以直接从中将数据复制到 MySQL 数据库。要节省网络资源成本，您的 Amazon EC2 实例必须与 Amazon RDS 数据库实例位于同一 AWS 区域内。使 Amazon EC2 实例位于 Amazon RDS 数据库所在的相同 AWS 区域内，还可以减少导入期间的网络延迟。

下图显示了将数据库备份复制到 Amazon EC2 实例。

![\[显示将数据库备份复制到 Amazon EC2 实例的工作流程。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_3.png)


### 创建 Amazon EC2 实例并复制数据
<a name="mysql-importing-data-reduced-downtime-create-ec2"></a>

1. 在您打算在其中创建 Amazon RDS 数据库的 AWS 区域中，创建虚拟私有云（VPC）、VPC 安全组和 VPC 子网。确保您的 VPC 安全组的入站规则允许应用程序连接到 AWS 所需的 IP 地址。您可以指定一系列 IP 地址（例如 `203.0.113.0/24`）或另一个 VPC 安全组。可以使用 [Amazon VPC 控制台](https://console.aws.amazon.com/vpc)来创建和管理 VPC、子网和安全组。有关更多信息，请参阅《Amazon Virtual Private Cloud 用户指南》**中的 [Amazon VPC 入门](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html#getting-started)。

1. 打开 [Amazon EC2 控制台](https://console.aws.amazon.com/ec2)，并选择将包含 Amazon EC2 实例和 Amazon RDS 数据库的 AWS 区域。使用您在步骤 1 中创建的 VPC、子网和安全组来启动 Amazon EC2 实例。在数据库备份文件未压缩的情况下，确保为该文件选择具有足够存储空间的实例类型。有关 Amazon EC2 实例的详细信息，请参阅《Amazon Elastic Compute Cloud 用户指南》**中的[开始使用 Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)。

1. 要从 Amazon EC2 实例连接到 Amazon RDS 数据库，请编辑 VPC 安全组。添加指定 EC2 实例的私有 IP 地址的入站规则。您可以在 EC2 控制台窗口中的 **Instance** 窗格的 **Details** 选项卡上找到私有 IP 地址。要编辑 VPC 安全组并添加入站规则，请在 EC2 控制台导航窗格中选择 **Security Groups**（安全组），然后为 MySQL 或 Aurora 添加指定 EC2 实例的私有 IP 地址的入站规则。要了解如何向 VPC 安全组添加入站规则，请参阅《Amazon Virtual Private Cloud 用户指南》**中的[安全组规则](https://docs.aws.amazon.com/vpc/latest/userguide/security-group-rules.html)。

1. 将压缩后的数据库备份文件从本地系统复制到 Amazon EC2 实例中。如有必要，可使用 `chmod` 来确保您具有 Amazon EC2 实例目标目录的写入权限。您可以使用 `scp` 或 Secure Shell (SSH) 客户端复制文件。以下命令是一个示例 `scp` 命令：

   ```
   scp -r -i key pair.pem backup.sql.gz ec2-user@EC2 DNS:/target_directory/backup.sql.gz
   ```
**重要**  
复制敏感数据时，务必使用安全网络传输协议。

1. 连接到 Amazon EC2 实例，并使用以下命令安装最新更新和 MySQL 客户端工具：

   ```
   sudo yum update -y
   sudo yum install mysql -y
   ```

   有关更多信息，请参阅《Amazon Elastic Compute Cloud 用户指南》**中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-connect-to-instance-linux)（适用于 Linux 实例）。
**重要**  
此示例介绍了如何在适用于 Amazon Linux 发行版的 Amazon Machine Image (AMI) 上安装 MySQL 客户端。此示例不在其它发行版（例如 Ubuntu 或 Red Hat Enterprise Linux）上安装 MySQL 客户端。有关安装 MySQL 的信息，请参阅 MySQL 文档中的 [Installing MySQL](https://dev.mysql.com/doc/refman/8.4/en/installing.html)。

1. 在连接到 Amazon EC2 实例时，请解压缩数据库备份文件。下面是一些命令示例。
   + 要解压缩 SQL 输出，请使用以下命令：

     ```
     gzip backup.sql.gz -d
     ```
   + 要解压缩分隔的文本输出，请使用以下命令：

     ```
     tar xzvf backup.tar.gz
     ```

## 任务 3：创建 MySQL 数据库，并从 Amazon EC2 实例导入数据
<a name="mysql-importing-data-reduced-downtime-create-database-import-data"></a>

通过在 Amazon EC2 实例所在的同一 AWS 区域中创建 RDS for MySQL 数据库实例或 RDS for MySQL 多可用区数据库集群，与通过互联网相比，可以更快地从 Amazon EC2 导入数据库备份文件。

下图显示了将备份从 Amazon EC2 实例导入到 MySQL 数据库。

![\[显示将备份从 EC2 实例导入到 MySQL 数据库的工作流程。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_4.png)


### 创建 MySQL 数据库并导入数据
<a name="mysql-importing-data-reduced-downtime-create-database"></a>

1. 确定支持此 Amazon RDS 数据库的预期工作负载所需的数据库实例类和存储空间量。作为过程的一部分，确定数据加载过程所需的足够空间量和处理能力。此外，确定处理生产工作负载所需的项目。您可以根据源 MySQL 数据库的大小和资源来进行估计。有关更多信息，请参阅 [数据库实例类](Concepts.DBInstanceClass.md)。

1. 在包含您的 Amazon EC2 实例的 AWS 区域中创建数据库实例或多可用区数据库集群。

   要创建 RDS for MySQL 多可用区数据库集群，请按[创建 Amazon RDS 的多可用区数据库集群](create-multi-az-db-cluster.md)中的说明操作。

   要创建 RDS for MySQL 数据库实例，请按照[创建 Amazon RDS 数据库实例](USER_CreateDBInstance.md)中的说明操作并使用以下准则：
   + 指定与源数据库实例兼容的数据库引擎版本。
   + 指定用于 Amazon EC2 实例的相同虚拟私有云（VPC）和 VPC 安全组。此方式将确保 Amazon EC2 实例和 Amazon RDS 实例通过网络相互可见。确保您的数据库实例可公开访问。要按下一节所述设置源数据库的复制，您的数据库实例必须可公开访问。
   + 在导入数据库备份之前，不要配置多个可用区、备份保留或只读副本。在完成该导入操作后，您可以为生产实例配置多可用区和备份保留期。

1. 检查 Amazon RDS 数据库的默认配置选项。如果数据库的默认参数组没有所需的配置选项，请查找具有这些选项的参数组，或创建新的参数组。有关创建参数组的详细信息，请参阅 [Amazon RDS 的参数组](USER_WorkingWithParamGroups.md)。

1. 以主用户身份连接到新 Amazon RDS 数据库。创建为需要访问数据库实例的管理员、应用程序和服务提供支持所需的用户。Amazon RDS 数据库的主机名为此数据库实例的**端点**值（不包含端口号），例如 `mysampledb.123456789012.us-west-2.rds.amazonaws.com`。您可以在 Amazon RDS 控制台上的数据库详细信息中找到端点值。

1. 连接到 Amazon EC2 实例。有关更多信息，请参阅《Amazon Elastic Compute Cloud 用户指南》**中的[连接到您的实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html#ec2-connect-to-instance-linux)（适用于 Linux 实例）。

1. 使用 `mysql` 命令以远程主机身份从 Amazon EC2 实例连接到 Amazon RDS 数据库。以下命令是一个示例：

   ```
   mysql -h host_name -P 3306 -u db_master_user -p
   ```

   *host\$1name* 是 Amazon RDS 数据库端点。

1. 在 `mysql` 提示符下，运行 `source` 命令并向它传递您的数据库转储文件名。此命令将数据加载到 Amazon RDS 数据库实例。
   + 对于 SQL 格式，请使用以下命令：

     ```
     mysql> source backup.sql;
     ```
   + 对于分隔文本格式，请先创建数据库（如果它不是您在设置 Amazon RDS 数据库时创建的默认数据库）。

     ```
     mysql> create database database_name;
     mysql> use database_name;
     ```

     然后，创建表。

     ```
     mysql> source table1.sql
     mysql> source table2.sql
     etc...
     ```

     然后，导入数据。

     ```
     mysql> LOAD DATA LOCAL INFILE 'table1.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '0x0d0a';
     mysql> LOAD DATA LOCAL INFILE 'table2.txt' INTO TABLE table2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '0x0d0a';
     etc...
     ```

     要提高性能，您可以从多个连接并行执行这些操作，以便同时创建并加载所有表。
**注意**  
如果您在最初转储表时已将任何数据格式化选项与 `mysqldump` 结合使用，则务必将相同的选项与 `LOAD DATA LOCAL INFILE` 结合使用，来确保正确地解读数据文件内容。

1. 对导入的数据库中的一个或两个表运行简单 `SELECT` 查询，来验证导入是否成功。

如果您不再需要该过程中使用的 Amazon EC2 实例，请终止 EC2 实例以减少AWS资源使用。要终止 EC2 实例，请参阅《Amazon Elastic Compute Cloud 用户指南》**中的[终止实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#terminating-instances-console)。

## 任务 4：将数据从外部数据库复制到新的 Amazon RDS 数据库
<a name="mysql-importing-data-reduced-downtime-replicate-data"></a>

在将数据复制并传输到 MySQL 数据库期间，您的源数据库可能已更新。这样，您可以使用复制功能使复制的数据库与源数据库保持同步。

![\[显示将数据从外部 MySQL 数据库复制到 Amazon RDS 上的数据库的工作流程。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_5.png)


对 Amazon RDS 数据库启动复制功能所需的权限受到限制且对 Amazon RDS 主用户不可用。因此，请使用适用于您的主要引擎版本的 Amazon RDS 存储过程：
+ [mysql\$1rds\$1set\$1external\$1master（RDS for MySQL 主要版本 8.0 及更低版本）](mysql-stored-proc-replicating.md#mysql_rds_set_external_master) 
+ [mysql.rds\$1set\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）](mysql-stored-proc-replicating.md#mysql_rds_set_external_source)
+ [mysql.rds\$1set\$1external\$1master\$1gtid](mysql_rds_set_external_master_gtid.md)（配置复制）和 [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication)（开始复制）

### 启动复制
<a name="mysql-importing-data-reduced-downtime-start-replication"></a>

在任务 1 中，[当您设置复制选项时](#mysql-importing-data-reduced-downtime-set-replication-options)，您开启了二进制日志记录，并为源数据库设置了唯一服务器 ID。现在您可以将 Amazon RDS 数据库设置为副本，并将活动数据库作为源数据库实例。

1. 在 Amazon RDS 控制台中，将托管源数据库的服务器的 IP 地址添加到 Amazon RDS 数据库的 VPC 安全组。有关配置 VPC 安全组的更多信息，请参阅《Amazon Virtual Private Cloud 用户指南》**中的[配置安全组规则](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-security-group-rules.html)。

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

   ```
   host host_name
   ```

   *host\$1name* 是 Amazon RDS 数据库端点中的 DNS 名称，例如 `myinstance.123456789012.us-east-1.rds.amazonaws.com`。您可以在 Amazon RDS 控制台上的数据库实例详细信息中找到端点值。

1. 通过使用所选的客户端，连接到源实例并创建将用于复制的用户。此账户仅用于复制，并且必须仅供您的域使用以增强安全性。以下命令是一个示例：

   ```
   CREATE USER 'repl_user'@'mydomain.com' IDENTIFIED BY 'password';
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的凭证。

1. 对于源 实例，向复制用户授予 `REPLICATION CLIENT` 和 `REPLICATION SLAVE` 权限。例如，要为您的域的“`REPLICATION CLIENT`”用户授予对所有数据库的 `REPLICATION SLAVE` 和 `repl_user` 权限，请发出以下命令。

   ```
   GRANT REPLICATION CLIENT, REPLICATION SLAVE ON *.* TO 'repl_user'@'mydomain.com';
   ```

1. 将 Amazon RDS 数据库设置为副本。使用适当的 Amazon RDS 存储过程，以主用户身份连接到 Amazon RDS 数据库，并将源数据库标识为源复制实例。
   + [mysql\$1rds\$1set\$1external\$1master（RDS for MySQL 主要版本 8.0 及更低版本）](mysql-stored-proc-replicating.md#mysql_rds_set_external_master)
   + [mysql.rds\$1set\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）](mysql-stored-proc-replicating.md#mysql_rds_set_external_source)

   如果您具有 SQL 格式的备份文件，则使用您在步骤 4 中确定的主日志文件名和主日志位置。如果您使用的是分隔文本格式，则使用您在创建备份文件时确定的名称和位置。下面是一些命令示例：

   **MySQL 8.4 及更高版本**

   ```
   CALL mysql.rds_set_external_source ('myserver.mydomain.com', 3306,
       'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 1);
   ```

   **MySQL 8.0 及更低版本**

   ```
   CALL mysql.rds_set_external_master ('myserver.mydomain.com', 3306,
       'repl_user', 'password', 'mysql-bin-changelog.000031', 107, 1);
   ```
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的凭证。

1. 在 Amazon RDS 数据库上，要开始复制，请运行以下使用 [mysql.rds\$1start\$1replication](mysql-stored-proc-replicating.md#mysql_rds_start_replication) 存储过程的命令：

   ```
   CALL mysql.rds_start_replication;
   ```

1. 在 Amazon RDS 数据库上，要确定副本何时与源复制实例实现同步，请运行 [SHOW REPLICA STATUS](https://dev.mysql.com/doc/refman/8.0/en/show-replica-status.html) 命令。`SHOW REPLICA STATUS` 命令的结果包括 `Seconds_Behind_Master` 字段。当 `Seconds_Behind_Master` 字段返回 0 时，副本将与源复制实例保持同步。
**注意**  
以前的 MySQL 版本使用的是 `SHOW SLAVE STATUS`，而不是 `SHOW REPLICA STATUS`。如果您使用的 MySQL 版本低于 8.0.23，那么请使用 `SHOW SLAVE STATUS`。

1. 在 Amazon RDS 数据库同步后，开启自动备份以便您可以在需要时还原该数据库。您可以使用 [Amazon RDS 控制台](https://console.aws.amazon.com/rds/)开启或修改 Amazon RDS 数据库的自动备份。有关更多信息，请参阅 [备份简介](USER_WorkingWithAutomatedBackups.md)。

## 任务 5：将您的活动应用程序重定向到 Amazon RDS 实例
<a name="mysql-importing-data-reduced-downtime-redirect-app"></a>

在 MySQL 数据库与源复制实例保持同步后，您现在可以更新活动的应用程序以使用 Amazon RDS 实例。

![\[显示停止复制并将活动应用程序定向到 Amazon RDS 上的数据库的工作流程。\]](http://docs.aws.amazon.com/zh_cn/AmazonRDS/latest/UserGuide/images/MigrateMySQLToRDS_6.png)


### 将活动应用程序重新导向到 MySQL 数据库并停止复制
<a name="mysql-importing-data-reduced-downtime-redirect-app-stop-app"></a>

1. 要添加 Amazon RDS 数据库的 VPC 安全组，请添加托管应用程序的服务器的 IP 地址。有关修改 VPC 安全组的更多信息，请参阅《Amazon Virtual Private Cloud 用户指南》**中的[配置安全组规则](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-security-group-rules.html)。

1. 验证 [SHOW REPLICA STATUS](https://dev.mysql.com/doc/refman/8.0/en/show-replica-status.html) 命令结果中的 `Seconds_Behind_Master` 字段是否为 0，这表示副本与源复制实例保持同步。

   ```
   SHOW REPLICA STATUS;
   ```
**注意**  
以前的 MySQL 版本使用的是 `SHOW SLAVE STATUS`，而不是 `SHOW REPLICA STATUS`。如果您使用的 MySQL 版本低于 8.0.23，那么请使用 `SHOW SLAVE STATUS`。

1. 在事务完成后关闭与源的所有连接。

1. 更新应用程序以使用 Amazon RDS 数据库。此更新通常涉及更改连接设置以标识 Amazon RDS 数据库的主机名和端口、用于进行连接的用户账户和密码以及要使用的数据库。

1. 连接到数据库实例。

   对于多可用区数据库集群，连接至写入器数据库实例。

1. 通过运行使用以下使用 [mysql.rds\$1stop\$1replication](mysql-stored-proc-replicating.md#mysql_rds_stop_replication) 存储过程的命令来停止 Amazon RDS 实例的复制：

   ```
   CALL mysql.rds_stop_replication;
   ```

1. 通过在 Amazon RDS 数据库上使用相应的 Amazon RDS 存储过程，重置复制配置，使该实例不再被识别为副本：
   +  [mysql\$1rds\$1reset\$1external\$1master（RDS for MySQL 主要版本 8.0 及更低版本）](mysql-stored-proc-replicating.md#mysql_rds_reset_external_master) 
   + [mysql.rds\$1reset\$1external\$1source（RDS for MySQL 主要版本 8.4 及更高版本）](mysql-stored-proc-replicating.md#mysql_rds_reset_external_source)

   **MySQL 8.4 及更高版本**

   ```
   CALL mysql.rds_reset_external_source;
   ```

   **MySQL 8.0 及更低版本**

   ```
   CALL mysql.rds_reset_external_master;
   ```

1. 开启其他 Amazon RDS 特征，例如多可用区支持和只读副本。有关更多信息，请参阅[配置和管理 Amazon RDS 的多可用区部署](Concepts.MultiAZ.md)和[使用数据库实例只读副本](USER_ReadRepl.md)。

# 从任意源将数据导入 Amazon RDS for MySQL 数据库实例
<a name="mysql-importing-data-any-source"></a>

使用 Amazon RDS，您可以将任意来源的现有 MySQL 数据迁移到 RDS for MySQL 数据库实例。您可以将数据从本地数据库、其他云提供商或现有 RDS for MySQL 数据库实例传输到目标 RDS for MySQL 数据库实例。借助此功能，您可以整合数据库、实施灾难恢复解决方案或从自管理数据库过渡。常见场景包括从自托管 MySQL 服务器迁移到完全托管的 Amazon RDS 数据库实例、将多个 MySQL 数据库整合为单个数据库实例，或者使用生产数据创建测试环境。以下几部分提供有关使用 `mysqldump`、备份文件或复制等方法导入 MySQL 数据的分步说明。

## 步骤 1：创建包含待加载数据的平面文件
<a name="mysql-importing-data-any-source-create-flat-files"></a>

使用通用格式存储待加载的数据，如逗号分隔值 (CSV)。每个表都必须拥有其自己的文件，您不能将多个表的数据合并到同一文件。每个文件的名称都必须与对应的表相同。可以根据个人喜好设置文件扩展名。例如，如果表名称为 `sales`，文件名可能为 `sales.csv` 或 `sales.txt`。

如果可能，请按照正在加载的表的主键对数据进行排序。这样做可以显著优化加载时间并尽可能减少磁盘存储要求。

该过程的速度和效率取决于能否将文件的大小保持在较小状态。如果在未压缩状态下单个文件的大小超过 1 GiB，则需将此文件分割为多个文件，然后分别加载各个文件。

在类 Unix 的系统（包括 Linux）中，请使用 `split` 命令。例如，以下命令会将 `sales.csv` 文件分割为多个小于 1 GiB 的文件，且只在换行符处进行分割 (-C 1024m)。新文件的名称包括升序数字后缀。以下命令生成名称如 `sales.part_00` 和 `sales.part_01` 的文件。

```
split -C 1024m -d sales.csv sales.part_ 
```

其他操作系统也具有类似的实用程序。

您可以将平面文件存储在任何地方。但是，当在[步骤 5](#mysql-importing-data-any-source-load-data) 中加载数据时，必须从文件存在的相同位置调用 `mysql` Shell，或者在运行 `LOAD DATA LOCAL INFILE` 时使用文件的绝对路径。

## 步骤 2：阻止任何应用程序访问目标数据库实例
<a name="mysql-importing-data-any-source-stop-apps"></a>

开始大量加载前，阻止所有应用程序活动访问您打算加载到的目标数据库实例。建议您这样做，特别是当其他会话将要修改正在加载的表或引用的表时。这可以降低加载过程中发生约束冲突的风险并提高加载性能。它还可以将数据库实例还原到加载前的某一时间点，而不会丢失未参与加载的进程所做的更改。

当然，这可能并不可行或不现实。如果您无法在加载前阻止应用程序访问数据库实例，应采取步骤以确保数据的可用性和完整性。所需的具体步骤在很大程度上根据特定的使用案例和现场要求而有所不同。

## 步骤 3：创建数据库快照
<a name="mysql-importing-data-any-source-create-snapshot"></a>

如果您计划将数据加载到不包含数据的新数据库实例，可以跳过此步骤。否则，我们建议您在加载数据之前和之后创建目标 Amazon RDS 数据库实例的数据库快照。Amazon RDS 数据库快照是数据库实例的完整备份，可用于将数据库实例还原到已知状态。在启动数据库快照时，针对数据库实例的 I/O 操作将在备份数据库过程中暂停。

通过在即将开始加载前创建数据库快照，您可以在需要时将数据库还原到加载前的状态。通过使用在加载后立即创建的数据库快照，您可以在遇到问题时不必再次加载数据。还可以在加载后使用数据库快照将数据导入到新的数据库实例中。

以下示例运行 AWS CLI [create-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-snapshot.html) 命令来创建 `AcmeRDS` 实例的数据库快照，并为该数据库快照指定标识符 `"preload"`。

对于 Linux、macOS 或 Unix：

```
aws rds create-db-snapshot \
    --db-instance-identifier AcmeRDS \
    --db-snapshot-identifier preload
```

对于：Windows

```
aws rds create-db-snapshot ^
    --db-instance-identifier AcmeRDS ^
    --db-snapshot-identifier preload
```

也可以使用从数据库快照还原功能，以创建用于试运行的测试数据库实例或撤消在加载期间进行的更改。

请务必注意，从数据库快照还原数据库将创建新的数据库实例，与所有数据库实例一样，该数据库实例具有唯一的标识符和端点。要还原数据库实例但不改变端点，请先删除该数据库实例，以使您能够重新使用此端点。

例如，要创建一个适用于试运行或其他测试的数据库实例，您可为数据库实例指定它自己的标识符。在示例中，标识符为 `AcmeRDS-2`"。该示例使用与 `AcmeRDS-2` 关联的端点连接到数据库实例。有关更多信息，请参阅 [restore-db-instance-from-db-snapshot](https://docs.aws.amazon.com/cli/latest/reference/rds/restore-db-instance-from-db-snapshot.html)。

对于 Linux、macOS 或 Unix：

```
aws rds restore-db-instance-from-db-snapshot \
    --db-instance-identifier AcmeRDS-2 \
    --db-snapshot-identifier preload
```

对于：Windows

```
aws rds restore-db-instance-from-db-snapshot ^
    --db-instance-identifier AcmeRDS-2 ^
    --db-snapshot-identifier preload
```

要重新使用现有的端点，请首先删除该数据库实例，然后为还原的数据库指定相同的标识符。有关更多信息，请参阅 [delete-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/delete-db-instance.html)。

以下示例还在删除数据库实例之前为其制作最终的数据库快照。您可以自由选择，但建议您这样做。

对于 Linux、macOS 或 Unix：

```
aws rds delete-db-instance \
    --db-instance-identifier AcmeRDS \
    --final-db-snapshot-identifier AcmeRDS-Final

aws rds restore-db-instance-from-db-snapshot \
    --db-instance-identifier AcmeRDS \
    --db-snapshot-identifier preload
```

对于：Windows

```
aws rds delete-db-instance ^
    --db-instance-identifier AcmeRDS ^
    --final-db-snapshot-identifier AcmeRDS-Final

aws rds restore-db-instance-from-db-snapshot ^
    --db-instance-identifier AcmeRDS ^
    --db-snapshot-identifier preload
```

## 步骤 4（可选）：关闭 Amazon RDS 自动备份
<a name="mysql-importing-data-any-source-turn-off-automated-backups"></a>

**警告**  
如果需要执行时间点故障恢复，请勿关闭自动备份。

关闭自动备份是一种性能优化，加载数据时不需要这样做。关闭自动备份会清除所有现有备份。因此，在关闭自动备份后，将无法使用时间点故障恢复功能。关闭自动备份不会影响手动数据库快照。仍然可以还原所有现有的手动数据库快照。

关闭自动备份可减少约 25% 的加载时间，并减少加载期间所需的存储空间。如果您计划将数据加载到不包含任何数据的新数据库实例，关闭备份就可轻松加速加载并避免使用备份所需的额外存储空间。但是，在某些情况下，您可能会计划将数据加载到已包含数据的数据库实例。如果是这样，请权衡关闭备份的优势与无法执行时间点恢复功能的影响。

数据库实例默认开启自动备份 (保留期为一天)。要关闭自动备份，请将备份保留期设置为零。加载后，可以将备份保留期设置为非零值，重新开启自动备份。要开启或关闭备份，Amazon RDS 将关闭并重新启动数据库实例，以开启或关闭 MySQL 日志记录。

运行 AWS CLI `modify-db-instance` 命令，将备份保留期设置为零并立即应用更改。要将保留期设置为零，需要重新启动数据库实例，因此，等到重新启动完成后再继续操作。有关更多信息，请参阅 [modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html)。

对于 Linux、macOS 或 Unix：

```
aws rds modify-db-instance \
    --db-instance-identifier AcmeRDS \
    --apply-immediately \
    --backup-retention-period 0
```

对于：Windows

```
aws rds modify-db-instance ^
    --db-instance-identifier AcmeRDS ^
    --apply-immediately ^
    --backup-retention-period 0
```

您可以使用 AWS CLI [describe-db-instances](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html) 命令检查数据库实例的状态。以下示例显示 `AcmeRDS` 数据库实例的数据库实例状态：

```
aws rds describe-db-instances --db-instance-identifier AcmeRDS --query "*[].{DBInstanceStatus:DBInstanceStatus}"
```

当数据库实例状态为 `available` 时，您已准备好进行下一步。

## 步骤 5：加载数据
<a name="mysql-importing-data-any-source-load-data"></a>

要将平面文件中的行读取到数据库表中，请使用 MySQL `LOAD DATA LOCAL INFILE` 语句。

**注意**  
必须从平面文件存在的相同位置调用 `mysql` Shell，或者在运行 `LOAD DATA LOCAL INFILE` 时使用文件的绝对路径。

以下示例说明如何将数据从名为 `sales.txt` 的文件加载到数据库中名为 `Sales` 的表中：

```
mysql> LOAD DATA LOCAL INFILE 'sales.txt' INTO TABLE Sales FIELDS TERMINATED BY ' ' ENCLOSED BY '' ESCAPED BY '\\';
Query OK, 1 row affected (0.01 sec)
Records: 1  Deleted: 0  Skipped: 0  Warnings: 0
```

有关 `LOAD DATA` 语句的更多信息，请参阅 MySQL 文档中的 [LOAD DATA Statement](https://dev.mysql.com/doc/refman/8.4/en/load-data.html)。

## 步骤 6：重新开启 Amazon RDS 自动备份
<a name="mysql-importing-data-any-source-turn-on-automated-backups"></a>

如果您在[步骤 4](#mysql-importing-data-any-source-turn-off-automated-backups) 中关闭了 Amazon RDS 自动备份，则在加载完成后，请通过将备份保留期重新设置为其预加载值来开启自动备份。如步骤 4 中所述，Amazon RDS 会重新启动数据库实例，因此，请为短暂中断做好准备。

以下示例运行 AWS CLI [modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) 命令来开启 `AcmeRDS` 数据库实例的自动备份，并将保留期设置为一天：

对于 Linux、macOS 或 Unix：

```
aws rds modify-db-instance \
    --db-instance-identifier AcmeRDS \
    --backup-retention-period 1 \
    --apply-immediately
```

对于：Windows

```
aws rds modify-db-instance ^
    --db-instance-identifier AcmeRDS ^
    --backup-retention-period 1 ^
    --apply-immediately
```