

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

# 使用与 MySQL 兼容的数据库作为目标 Amazon Database Migration Service
<a name="CHAP_Target.MySQL"></a>

您可以使用任何支持的源数据引擎将数据迁移到任何与 MyS Amazon DMS QL 兼容的数据库。 Amazon DMS 如果您要迁移到与 MySQL 兼容的本地数据库，则 Amazon DMS 需要您的源引擎位于生态系统中。 Amazon 引擎可以安装在 Amazon托管服务上，例如亚马逊 RDS、Amazon Aurora 或 Amazon S3。或者，该引擎也可以位于 Amazon EC2 上的自管理数据库中。

您可以使用 SSL 来加密 MySQL 兼容终端节点与复制实例之间的连接。有关将 SSL 用于 MySQL 兼容终端节点的更多信息，请参阅[将 SSL 与 Amazon Database Migration Service](CHAP_Security.SSL.md)。

有关 Amazon DMS 支持作为目标的 MySQL 版本的信息，请参阅[的目标 Amazon DMS](CHAP_Introduction.Targets.md)。

您可以使用以下与 MySQL 兼容的数据库作为目标： Amazon DMS
+ MySQL Community Edition
+ MySQL Standard Edition
+ MySQL Enterprise Edition
+ MySQL Cluster Carrier Grade Edition
+ MariaDB Community Edition
+ MariaDB Enterprise Edition
+ MariaDB Column Store
+ Amazon Aurora MySQL

**注意**  
无论使用什么源存储引擎（MyISAM、MEMORY 等），默认情况下， Amazon DMS 都会创建与 MySQL 兼容的目标表作为 InnoDB 表。  
如果您需要 InnoDB 之外的存储引擎中的表，则可以在与 MySQL 兼容的目标上手动创建表，然后使用 **Do nothing (不执行任何操作)** 选项来迁移表。有关更多信息，请参阅 [完全加载任务设置](CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.md)。

有关将与 MySQL 兼容的数据库作为 Amazon DMS的目标的更多详细信息，请参阅以下章节。

**Topics**
+ [使用任何与 MySQL 兼容的数据库作为目标 Amazon Database Migration Service](#CHAP_Target.MySQL.Prerequisites)
+ [使用与 MySQL 兼容的数据库作为目标的限制 Amazon Database Migration Service](#CHAP_Target.MySQL.Limitations)
+ [使用与 MySQL 兼容的数据库作为目标时的终端节点设置 Amazon DMS](#CHAP_Target.MySQL.ConnectionAttrib)
+ [MySQL 的目标数据类型](#CHAP_Target.MySQL.DataTypes)

## 使用任何与 MySQL 兼容的数据库作为目标 Amazon Database Migration Service
<a name="CHAP_Target.MySQL.Prerequisites"></a>

在使用与 MySQL 兼容的数据库作为 Amazon DMS的目标之前，请确保完成以下先决条件：
+ 提供一个有权 Amazon DMS 访问 MySQ read/write L 兼容数据库的用户帐户。要创建所需的权限，请运行以下命令。

  ```
  CREATE USER '<user acct>'@'%' IDENTIFIED BY '<user password>';
  GRANT ALTER, CREATE, DROP, INDEX, INSERT, UPDATE, DELETE, SELECT, CREATE TEMPORARY TABLES  ON <schema>.* TO 
  '<user acct>'@'%';
  GRANT ALL PRIVILEGES ON awsdms_control.* TO '<user acct>'@'%';
  ```
+ 在完全加载迁移阶段，您必须禁用目标表上的外键。要在满负荷期间对兼容 MySQL 的数据库禁用外键检查，可以在目标端点的 Amazon DMS 控制台的 “**额外连接属性**” 部分中添加以下命令。

  ```
  Initstmt=SET FOREIGN_KEY_CHECKS=0;
  ```
+ 设置数据库参数 `local_infile = 1` 以启用 Amazon DMS ，以便将数据加载到目标数据库。
+ 如果您使用 MySQL 特定的迁移前评测功能，请授予以下权限。

  ```
  grant select on mysql.user to <dms_user>;
  grant select on mysql.db to <dms_user>;
  grant select on mysql.tables_priv to <dms_user>;
  grant select on mysql.role_edges to <dms_user>  #only for MySQL version 8.0.11 and higher
  ```

## 使用与 MySQL 兼容的数据库作为目标的限制 Amazon Database Migration Service
<a name="CHAP_Target.MySQL.Limitations"></a>

使用 MySQL 数据库作为目标时， Amazon DMS 不支持以下内容：
+ 数据定义语言 (DDL) 语句 TRUNCATE PARTITION、DROP TABLE 和 RENAME TABLE。
+ 使用 `ALTER TABLE {{table_name}} ADD COLUMN {{column_name}}` 语句将列添加到表的开头或中间。
+ 在满载任务中将数据加载到兼容 MySQL 的目标时， Amazon DMS 不会报告任务日志中的限制导致的错误，这些错误可能会导致重复的键错误或与记录数量不匹配。这是由 MySQL 使用 `LOAD DATA` 命令处理本地数据的方式造成的。务必在完全加载阶段执行以下操作：
  + 禁用限制
  + 使用 Amazon DMS 验证来确保数据的一致性。
+ 当您将列值更新为其现有值时，与 MySQL 兼容的数据库会返回 `0 rows affected` 警告。尽管此行为在技术上没有错误，但它与其他数据库引擎应对这种情况的方式不同。例如，Oracle 执行一个行的更新。对于与 MySQL 兼容的数据库，在 awsdms\_apply\_exceptions 控制表中 Amazon DMS 生成一个条目并记录以下警告。

  ```
  Some changes from the source database had no impact when applied to
  the target database. See awsdms_apply_exceptions table for details.
  ```
+ Aurora Serverless 可用作 Amazon Aurora 版本 2 的目标，且与 MySQL 版本 5.7 兼容。（选择 Aurora MySQL 版本 2.07.1 以便能够使用 Aurora Serverless，且与 MySQL 5.7 兼容。） 有关 Aurora Serverless 的更多信息，请参阅《Amazon Aurora 用户指南》**中的[使用 Aurora Serverless v2](https://docs.amazonaws.cn//AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html)。
+ Amazon DMS 不支持使用适用于 Aurora 或 Amazon RDS 的读取器终端节点，除非实例处于可写模式，即`read_only`和`innodb_read_only`参数设置为`0`或`OFF`。有关使用 Amazon RDS 和 Aurora 作为目标的更多信息，请参见以下内容：
  +  [确定您连接到的数据库实例](https://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.BestPractices.html#AuroraMySQL.BestPractices.DeterminePrimaryInstanceConnection) 
  +  [使用 MySQL 更新只读副本](https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/USER_MySQL.Replication.ReadReplicas.html#USER_MySQL.Replication.ReadReplicas.Updates) 
+ 复制 TIME 数据类型时，不会复制时间值的小数部分。
+ 使用额外连接属性 `loadUsingCSV=false` 复制 TIME 数据类型时，时间值上限为范围 `[00:00:00, 23:59:59]`。

## 使用与 MySQL 兼容的数据库作为目标时的终端节点设置 Amazon DMS
<a name="CHAP_Target.MySQL.ConnectionAttrib"></a>

您可以使用端点设置来配置与 MySQL 兼容的目标数据库，这与使用额外连接属性类似。您可以在使用 Amazon DMS 控制台创建目标端点时指定设置，或者使用中的`create-endpoint`命令和 `--my-sql-settings '{"{{EndpointSetting"}}: {{"value"}}, {{...}}}'` JSON 语法。[Amazon CLI](https://docs.amazonaws.cn/cli/latest/reference/dms/index.html)

下表显示了您可以配合使用 MySQL 作为目标的端点设置。


| Name | 说明 | 
| --- | --- | 
| `ConnectionTimeout` | 使用此额外连接属性（ECA）设置 MySQL 实例的端点连接超时时间（以秒为单位）。默认值为 10 秒。ECA 示例：`ConnectionTimeout=30`。 | 
| ` TargetDbType` | 指定将目标上的源表迁移到的位置 (单个数据库或多个数据库)。如果指定`SPECIFIC_DATABASE`，则需要在使用 Amazon CLI 或时指定数据库名称 Amazon Web Services 管理控制台。<br />默认值：`MULTIPLE_DATABASES`<br />有效值：{`SPECIFIC_DATABASE`、`MULTIPLE_DATABASES`} <br />示例：`--my-sql-settings '{"TargetDbType": "MULTIPLE_DATABASES"}'` | 
| `ParallelLoadThreads` | 改进了将数据加载到与 MySQL 兼容的目标数据库时的性能。指定用于将数据加载到与 MySQL 兼容的目标数据库中的线程的数目。设置大量线程可能会对数据库性能产生不利影响，因为每个线程均需要一个单独的连接。<br />默认值：1 <br />有效值：1-5 <br />示例：`--my-sql-settings '{"ParallelLoadThreads": 1}'` | 
| `AfterConnectScript` | 指定脚本在 Amazon DMS 连接到终端节点后立即运行。<br />例如，您可以指定与 MySQL 兼容的目标应将收到的语句转换为 latin1 字符集，该字符集是数据库的默认编入字符集。从 UTF8 客户端转换时，此参数通常可以提高性能。<br />示例：`--my-sql-settings '{"AfterConnectScript": "SET character_set_connection='latin1'"}'` | 
| `MaxFileSize` | 指定用于将数据传输到与 MySQL 兼容的数据库的任何 .csv 文件的最大大小（以 KB 为单位）。<br />默认值：32768 KB（32 MB）<br />有效值：1–1048576<br />`--my-sql-settings '{"MaxFileSize": 512}'` | 

您也可以使用额外的连接属性配置与 MySQL 兼容的目标数据库。

下表显示了将 MySQL 作为目标时可以使用的额外连接属性。


| Name | 说明 | 
| --- | --- | 
| `Initstmt=SET FOREIGN_KEY_CHECKS=0;` | 禁用外键检查。<br />示例：`--extra-connection-attributes "Initstmt=SET FOREIGN_KEY_CHECKS=0;"` | 
| `Initstmt=SET time_zone` | 指定与 MySQL 兼容的目标数据库的时区。<br />默认值：UTC <br />有效值：目标 MySQL 数据库中可用的时区名称。<br />示例：`--extra-connection-attributes "Initstmt=SET time_zone={{US/Pacific}};"` | 

或者，您可以使用 `--my-sql-settings` 命令的 `AfterConnectScript` 参数来禁用外键检查并为数据库指定时区。

## MySQL 的目标数据类型
<a name="CHAP_Target.MySQL.DataTypes"></a>

下表显示了使用时支持的 MySQL 数据库目标数据类型 Amazon DMS 以及 Amazon DMS 数据类型的默认映射。

有关 Amazon DMS 数据类型的更多信息，请参见[Amazon Database Migration Service 的数据类型](CHAP_Reference.DataTypes.md)。


|  Amazon DMS 数据类型  |  MySQL 数据类型  | 
| --- | --- | 
| BOOLEAN | BOOLEAN | 
| BYTES | 如果长度介于 1 和 65535 之间，请使用 VARBINARY (length)。<br />如果长度介于 65536 和 2147483647 之间，请使用 LONGLOB。 | 
| DATE | DATE | 
| TIME | TIME | 
| TIMESTAMP | “如果小数位数 => 0 且 <= 6，请使用 DATETIME (Scale)<br />如果小数位数 => 7 且 <= 9，请使用 VARCHAR (37)” | 
| INT1 | TINYINT | 
| INT2 | SMALLINT | 
| INT4 | INTEGER | 
| INT8 | BIGINT | 
| NUMERIC | DECIMAL (p,s) | 
| REAL4 | FLOAT | 
| REAL8 | DOUBLE PRECISION | 
| string | 如果长度介于 1 和 21845 之间，请使用 VARCHAR (length)。<br />如果长度介于 21846 和 2147483647 之间，请使用 LONGTEXT。 | 
| UINT1 | UNSIGNED TINYINT | 
| UINT2 | UNSIGNED SMALLINT | 
| UINT4 | UNSIGNED INTEGER | 
| UINT8 | UNSIGNED BIGINT | 
| WSTRING | 如果长度介于 1 和 32767 之间，请使用 VARCHAR (length)。<br />如果长度介于 32768 和 2147483647 之间，请使用 LONGTEXT。 | 
| BLOB | 如果长度介于 1 和 65535 之间，请使用 BLOB。<br />如果长度介于 65536 和 2147483647 之间，请使用 LONGBLOB。<br />如果长度为 0，请使用 LONGBLOB (完全 LOB 支持)。 | 
| NCLOB | 如果长度介于 1 和 65535 之间，请使用 TEXT。<br />如果长度介于 65536 和 2147483647 之间，请将 LONGTEXT 与 ucs2 一起用于 CHARACTER SET。<br />如果长度为 0，请将 LONGTEXT (完全 LOB 支持) 与 ucs2 一起用于 CHARACTER SET。 | 
| CLOB | 如果长度介于 1 和 65535 之间，请使用 TEXT。<br />如果长度介于 65,536 和 2147483647 之间，请使用 LONGTEXT。<br />如果长度为 0，请使用 LONGTEXT (完全 LOB 支持)。 | 