

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

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

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

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

**注意**  
Amazon RDS 不支持 `mariadb-backup`，也不支持为 MariaDB 从 Amazon S3 进行导入。


| 来源 | 数据量 | 一次性或持续 | 应用程序停机时间 | 方法 | 更多信息 | 
| --- | --- | --- | --- | --- | --- | 
|  本地或 Amazon EC2 上的现有 MariaDB 数据库  |  任何  |  持续  |  Minimal  |  配置复制，使用现有 MariaDB 数据库作为复制源。 当外部实例为 MariaDB 版本 10.0.24 或更高版本时，您可以使用 MariaDB 全局事务标识符 (GTID) 配置复制到 MariaDB 数据库实例，对于 10.0.24 之前的版本，则可以使用 MariaDB 实例的二进制日志坐标来完成该操作。MariaDB GTID 与 MySQL GTID 的实施不同，后者不受 Amazon RDS 支持。  |  [配置与外部源实例之间的二进制日志文件位置复制](MySQL.Procedural.Importing.External.ReplMariaDB.md) [将数据导入到 Amazon RDS for MariaDB 数据库实例并减少停机时间](mariadb-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)  | 
|  现有 MariaDB 数据库实例  |  任何  |  一次性或持续  |  最低  |  为正在进行的复制创建只读副本。提升只读副本用于一次性创建新数据库实例。  |  [使用数据库实例只读副本](USER_ReadRepl.md)  | 
|  现有 MariaDB 数据库  |  小型  |  一次性  |  一段时间  |  使用命令行实用程序，将数据直接复制到您的 MariaDB 数据库实例。  |  [将数据从外部 MariaDB 数据库导入到 Amazon RDS for MariaDB 数据库实例](mariadb-importing-data-external-database.md)  | 
|  未存储在现有数据库中的数据  |  中  |  一次性  |  一段时间  |  使用 MariaDB `LOAD DATA LOCAL INFILE` 语句创建平面文件并导入这些文件。  |  [从任意源将数据导入 Amazon RDS for MariaDB 数据库实例](mariadb-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) 命令从快照中还原数据库实例。您可以使用 [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) 命令恢复数据库实例。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

### 平面文件
<a name="MariaDB.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="MariaDB.Procedural.Importing.Advanced.InputFormat.SQL"></a>

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

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

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

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

以下各项是减少加载时间的其它技巧：
+ 在将数据加载到 MariaDB 数据库之前，请创建所有二级索引。与其它数据库系统不同，MariaDB 在添加或修改二级索引时会重建整个表。此过程会创建一个包含索引更改的新表，复制所有数据，然后删除原始表。
+ 按主键顺序加载数据。对于 InnoDB 表，这可以将加载时间缩短 75% 至 80%，并将数据文件大小减少 50%。
+ 通过将 `foreign_key_checks` 设置为 `0` 来禁用外键约束。对于使用 `LOAD DATA LOCAL INFILE` 加载的平面文件，这通常是必需的。对于任何加载，禁用外键检查会加快数据加载速度。加载完成后，通过将 `foreign_key_checks` 设置为 `1` 来重新启用约束并验证数据。
+ 并行加载数据，除非接近资源限制。要实现跨多个表段的并行加载，请在适当时使用分区表。
+ 要减少 SQL 执行开销，请将多条 `INSERT` 语句合并为单个多值 `INSERT` 操作。`mariadb-dump` 自动实现此优化。
+ 通过将 `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`。
+ 在将数据库实例转换为多可用区部署之前，将数据加载到单可用区实例中。如果数据库实例已经使用多可用区部署，我们建议您不要切换为单可用区部署来加载数据。这样做所带来的改进微不足道

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

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

从 MariaDB 11.0.1 开始，您必须使用 `mariadb-dump` 而不是 `mysqldump`。

将数据从外部数据库移动到 Amazon RDS 数据库实例的典型 `mysqldump` 命令类似以下示例。将值替换为您自己的信息。对于 MariaDB 11.0.1 及更高版本，请将 `mysqldump` 替换为 `mariadb-dump`。

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

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

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

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

所用参数如下所示：
+ `-u local_user` – 用于指定用户名。在第一次使用该参数时，请指定您使用 `--databases` 参数确定的本地 MariaDB 数据库中的用户账户名称。
+ `--databases database_name`：用于指定本地 MariaDB 实例上您要导入 Amazon RDS 的数据库的名称。
+ `--single-transaction` – 用于确保从本地数据库加载的所有数据都与单一时间点保持一致。如果在 `mysqldump` 或 `mariadb-dump` 读取数据期间有其他进程更改数据，使用该参数有助于保持数据完整性。
+ `--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` 参数标识的 MariaDB 数据库实例指定默认数据库上的用户账户的名称。
+ `--port port_number`：用于为您的 MariaDB 数据库实例指定端口。默认情况下该值为 3306，除非您在创建数据库实例时更改了该值。
+ `--host host_name` – 用于从 Amazon RDS 数据库实例端点指定域名系统 (DNS) 名称，例如，`myinstance.123456789012.us-east-1.rds.amazonaws.com`。您可以在 Amazon RDS 控制台上的数据库实例详细信息中找到端点值。
+ `-pRDS_password` – 用于指定密码。在第二次使用该参数时，您为第二个 `-u` 参数确定的用户账户指定密码。

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

**示例**

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

对于 Linux、macOS 或 Unix：

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

对于：Windows

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

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

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

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

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

在该过程中，您将数据库数据的副本传输到 Amazon EC2 实例，并将数据导入到新的 Amazon RDS 数据库中。然后，使用复制功能使 Amazon RDS 数据库与活动的外部实例保持同步，再将应用程序重新导向到 Amazon RDS 数据库。如果外部实例是 MariaDB 10.0.24 或更高版本，并且目标实例是 RDS for MariaDB，则基于全局事务标识符（GTID）配置 MariaDB 复制。否则，将基于二进制日志坐标配置复制。如果您的外部数据库支持基于 GTID 的复制，我们建议使用它，因为基于 GTID 复制是一种更可靠的方法。有关更多信息，请参阅 MariaDB 文档中的[全局事务处理 ID](http://mariadb.com/kb/en/mariadb/global-transaction-id/)。

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

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


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

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

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

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


您可以使用 `mysqldump` 或 `mariadb-dump` 实用程序创建 SQL 或分隔的文本格式的数据库备份。在 MariaDB 10.5 中，客户端被称为 [mariadb-dump](https://mariadb.com/kb/en/mariadb-dump/)。从 MariaDB 11.0.1 开始，您必须使用 `mariadb-dump` 而不是 `mysqldump`。建议您在非生产环境中对每种格式运行测试，以便了解哪种方法能最大程度地减少 `mysqldump` 或 `mariadb-dump` 运行的时间。

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

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

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

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

### 设置复制选项
<a name="mariadb-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` 文件已更新的 `[mariadb]` 部分：

   ```
   [mariadb]
   log-bin
   server-id=1 
   log-basename=master1
   binlog-format=mixed
   ```

   有关更多信息，请参阅 MariaDB 文档中的 [Setting the Replication Source Configuration](https://mariadb.com/docs/server/ha-and-performance/standard-replication/setting-up-replication)。

1. 要使用多可用区数据库集群进行复制，请启用`gtid_strict_mode`。有关更多信息，请参阅 MariaDB 文档中的[ gtid\$1strict\$1mode](https://mariadb.com/docs/server/ha-and-performance/standard-replication/gtid#gtid_strict_mode)。

   使用数据库实例进行复制不需要启用 `gtid_strict_mode`。

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

   ```
   sudo service mariadb restart
   ```

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

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

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

   要避免在备份中包括 MySQL 系统数据库，请不要将 `--all-databases` 选项与 `mysqldump` 或 `mariadb-dump` 结合使用。有关更多信息，请参阅 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 输出，请使用以下命令。对于 MariaDB 10.11 及更低版本，请将 `mariadb-dump` 替换为 `mysqldump`。

     对于 Linux、macOS 或 Unix：

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

     对于：Windows

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

     对于 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` 或 `mariadb-dump` 时会排除这些对象。为此，请在 `mysqldump` 或 `mariadb-dump` 命令中包含以下参数：  
`--routines=0`
`--triggers=0`
`--events=0`

     如果运行 `mysqldump` 并指定分隔的文本格式，将返回 `CHANGE MASTER TO` 注释。此注释包含主日志文件名称和位置。如果外部实例是 MariaDB 10.0.23 或更低版本，请注意 `MASTER_LOG_FILE` 和 `MASTER_LOG_POS` 的值。设置复制时需要这些值。

     对于 MariaDB 版本，将返回以下输出。

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

1. 如果您使用的外部实例是 MariaDB 10.0.24 或更高版本，请使用基于 GTID 的复制。在外部 MariaDB 实例上运行 `SHOW MASTER STATUS` 以获取二进制日志文件名称和位置，然后通过在外部 MariaDB 实例上运行 `BINLOG_GTID_POS` 将它们转换为 GTID。

   ```
   SELECT BINLOG_GTID_POS('binary_log_file_name', binary_log_file_position);
   ```

   请记下返回的 GTID。您需要此 GTID 来配置复制。

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

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

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

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

将压缩的数据库备份文件复制到 Amazon EC2 实例所占用的网络资源少于直接在数据库实例之间复制未压缩的数据所占用的网络资源。当您的数据位于 Amazon EC2 中后，可以直接从中将数据复制到 MariaDB 数据库。要节省网络资源成本，您的 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/MigrateMariaDBToRDS_3.png)


### 创建 Amazon EC2 实例并复制数据
<a name="mariadb-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 实例，并使用以下命令安装最新更新和 MariaDB 客户端工具：

   ```
   sudo yum update -y
   sudo yum install mariadb1011-client-utils -y
   ```

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

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

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

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

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

通过在 Amazon EC2 实例所在的同一 AWS 区域 内创建 RDS for MariaDB 数据库实例，可以从 Amazon EC2 更快地导入数据库备份文件，此方式快于通过互联网导入。

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

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


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

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

1. 在包含您的 Amazon EC2 实例的 AWS 区域中创建数据库实例。按照[创建 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 格式，请使用以下命令：

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

     ```
     MariaDB [(none)]> create database database_name;
     MariaDB [(none)]> use database_name;
     ```

     然后，创建表。

     ```
     MariaDB [(none)]> source table1.sql
     MariaDB [(none)]> source table2.sql
     etc...
     ```

     然后，导入数据。

     ```
     MariaDB [(none)]> LOAD DATA LOCAL INFILE 'table1.txt' INTO TABLE table1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '0x0d0a';
     MariaDB [(none)]> LOAD DATA LOCAL INFILE 'table2.txt' INTO TABLE table2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '0x0d0a';
     etc...
     ```

     要提高性能，您可以从多个连接并行执行这些操作，以便同时创建并加载所有表。
**注意**  
如果您在最初转储表时已将任何数据格式化选项与 `mysqldump` 或 `mariadb-dump` 结合使用，则务必将相同的选项与 `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="mariadb-importing-data-reduced-downtime-replicate-data"></a>

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

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


对 Amazon RDS 数据库启动复制功能所需的权限受到限制且对 Amazon RDS 主用户不可用。因此，请使用相应的 Amazon RDS 存储过程：
+ [mysql.rds\$1set\$1external\$1master](mysql-stored-proc-replicating.md#mysql_rds_set_external_master) 
+ [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="mariadb-importing-data-reduced-downtime-start-replication"></a>

在任务 1 中，[当您设置复制选项时](#mariadb-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. 如果您使用 SQL 格式创建备份文件，并且外部实例不是 MariaDB 10.0.24 或更高版本，请通过运行以下命令查看该文件的内容：

   ```
   cat backup.sql
   ```

   该文件包括 `CHANGE MASTER TO` 注释，其中包含主日志文件名称和位置。在将 `--master-data` 选项与 `mysqldump` 结合使用时，此注释将包含在备份文件中。请注意 `MASTER_LOG_FILE` 和 `MASTER_LOG_POS` 的值。

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

   如果您使用分隔文本格式创建备份文件，并且外部实例不是 MariaDB 10.0.24 或更高版本，您应该已在任务 1 下[当您已创建现有数据库的备份副本时](#mariadb-importing-data-reduced-downtime-create-backup)的步骤 1 中获得二进制日志坐标。

   如果外部实例是 MariaDB 10.0.24 或更高版本，您应该已在任务 1 下[当您已创建现有数据库的备份副本时](#mariadb-importing-data-reduced-downtime-create-backup)的步骤 2 中获得作为复制起点的 GTID。

1. 将 Amazon RDS 数据库设置为副本。如果外部实例不是 MariaDB 10.0.24 或更高版本，请使用 [mysql.rds\$1set\$1external\$1master](mysql-stored-proc-replicating.md#mysql_rds_set_external_master) 存储过程以主用户身份连接到 Amazon RDS 数据库，并将源数据库标识为源复制实例。

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

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

   如果外部实例是 MariaDB 10.0.24 或更高版本，请使用 [mysql.rds\$1set\$1external\$1master\$1gtid](mysql_rds_set_external_master_gtid.md) 存储过程以主用户身份连接到 Amazon RDS 数据库，并将源数据库标识为源复制实例。使用您在任务 1 下[当您已创建现有数据库的备份副本](#mariadb-importing-data-reduced-downtime-create-backup)的步骤 2 中确定的 GTID。以下命令是一个示例：

   ```
   CALL mysql.rds_set_external_master_gtid ('source_server_ip_address', 3306, 'ReplicationUser', 'password', 'GTID', 1); 
   ```

   `source_server_ip_address` 是源复制实例的 IP 地址。当前不支持 EC2 私有 DNS 地址。
**注意**  
作为安全最佳实践，请指定除此处所示提示以外的凭证。

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 时，副本将与源复制实例保持同步。

   对于 MariaDB 10.5、10.6、10.11、11.4 或 11.8 数据库实例，请使用 [mysql.rds\$1replica\$1status](mysql_rds_replica_status.md) 存储过程而不是运行 MySQL 命令。

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

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

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

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


### 将活动应用程序重新导向到 MariaDB 数据库并停止复制
<a name="mariadb-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;
   ```

   对于 MariaDB 10.5、10.6、10.11、11.4 或 11.8 数据库实例，请使用 [mysql.rds\$1replica\$1status](mysql_rds_replica_status.md) 过程而不是运行 MySQL 命令。

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 数据库上运行以下使用 [mysql.rds\$1reset\$1external\$1master](mysql-stored-proc-replicating.md#mysql_rds_reset_external_master) 存储过程的命令，重置复制配置，使该实例不再被识别为副本：

   ```
   CALL mysql.rds_reset_external_master;
   ```

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

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

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

## 步骤 1：创建包含待加载数据的平面文件
<a name="mariadb-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](#mariadb-importing-data-any-source-load-data) 中加载数据时，必须从文件存在的相同位置调用 `mysql` Shell，或者在运行 `LOAD DATA LOCAL INFILE` 时使用文件的绝对路径。

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

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

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

## 步骤 3：创建数据库快照
<a name="mariadb-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="mariadb-importing-data-any-source-turn-off-automated-backups"></a>

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

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

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

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

运行 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="mariadb-importing-data-any-source-load-data"></a>

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

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

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

```
MariaDB [(none)]> 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` 语句的更多信息，请参阅 MariaDB 文档中的 [LOAD DATA INFILE](https://mariadb.com/docs/server/reference/sql-statements/data-manipulation/inserting-loading-data/load-data-into-tables-or-index/load-data-infile)。

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

如果您在[步骤 4](#mariadb-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
```