

# 从任意源将数据导入 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
```