

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

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

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

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

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

您可以使用以下与 MySQL 兼容的数据库作为目标： AWS 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 等），默认情况下， AWS DMS 都会创建与 MySQL 兼容的目标表作为 InnoDB 表。  
如果您需要 InnoDB 之外的存储引擎中的表，则可以在与 MySQL 兼容的目标上手动创建表，然后使用 **Do nothing (不执行任何操作)** 选项来迁移表。有关更多信息，请参阅 [完全加载任务设置](CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.md)。

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

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

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

在使用与 MySQL 兼容的数据库作为 AWS DMS的目标之前，请确保完成以下先决条件：
+ 提供一个有权 AWS 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 的数据库禁用外键检查，可以在目标端点的 AWS DMS 控制台的 “**额外连接属性**” 部分中添加以下命令。

  ```
  Initstmt=SET FOREIGN_KEY_CHECKS=0;
  ```
+ 设置数据库参数 `local_infile = 1` 以启用 AWS 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 兼容的数据库作为目标的限制 AWS Database Migration Service
<a name="CHAP_Target.MySQL.Limitations"></a>

使用 MySQL 数据库作为目标时， AWS DMS 不支持以下内容：
+ 数据定义语言 (DDL) 语句 TRUNCATE PARTITION、DROP TABLE 和 RENAME TABLE。
+ 使用 `ALTER TABLE table_name ADD COLUMN column_name` 语句将列添加到表的开头或中间。
+ 在满载任务中将数据加载到兼容 MySQL 的目标时， AWS DMS 不会报告任务日志中的限制导致的错误，这些错误可能会导致重复的键错误或与记录数量不匹配。这是由 MySQL 使用 `LOAD DATA` 命令处理本地数据的方式造成的。务必在完全加载阶段执行以下操作：
  + 禁用限制
  + 使用 AWS DMS 验证来确保数据的一致性。
+ 当您将列值更新为其现有值时，与 MySQL 兼容的数据库会返回 `0 rows affected` 警告。尽管此行为在技术上没有错误，但它与其他数据库引擎应对这种情况的方式不同。例如，Oracle 执行一个行的更新。对于与 MySQL 兼容的数据库，在 awsdms\$1apply\$1exceptions 控制表中 AWS 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.aws.amazon.com//AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.html)。
+ AWS DMS 不支持使用适用于 Aurora 或 Amazon RDS 的读取器终端节点，除非实例处于可写模式，即`read_only`和`innodb_read_only`参数设置为`0`或`OFF`。有关使用 Amazon RDS 和 Aurora 作为目标的更多信息，请参见以下内容：
  +  [确定您连接到的数据库实例](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.BestPractices.html#AuroraMySQL.BestPractices.DeterminePrimaryInstanceConnection) 
  +  [使用 MySQL 更新只读副本](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_MySQL.Replication.ReadReplicas.html#USER_MySQL.Replication.ReadReplicas.Updates) 
+ 复制 TIME 数据类型时，不会复制时间值的小数部分。
+ 使用额外连接属性 `loadUsingCSV=false` 复制 TIME 数据类型时，时间值上限为范围 `[00:00:00, 23:59:59]`。

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

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

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/dms/latest/userguide/CHAP_Target.MySQL.html)

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

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

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/dms/latest/userguide/CHAP_Target.MySQL.html)

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

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

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

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


|  AWS DMS 数据类型  |  MySQL 数据类型  | 
| --- | --- | 
|  BOOLEAN  |  BOOLEAN  | 
|  BYTES  |  如果长度介于 1 和 65535 之间，请使用 VARBINARY (length)。 如果长度介于 65536 和 2147483647 之间，请使用 LONGLOB。  | 
|  DATE  |  DATE  | 
|  TIME  |  TIME  | 
|  TIMESTAMP  |  “如果小数位数 => 0 且 <= 6，请使用 DATETIME (Scale) 如果小数位数 => 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)。 如果长度介于 21846 和 2147483647 之间，请使用 LONGTEXT。  | 
|  UINT1  |  UNSIGNED TINYINT  | 
|  UINT2  |  UNSIGNED SMALLINT  | 
|  UINT4  |  UNSIGNED INTEGER  | 
|  UINT8  |  UNSIGNED BIGINT  | 
|  WSTRING  |  如果长度介于 1 和 32767 之间，请使用 VARCHAR (length)。 如果长度介于 32768 和 2147483647 之间，请使用 LONGTEXT。  | 
|  BLOB  |  如果长度介于 1 和 65535 之间，请使用 BLOB。 如果长度介于 65536 和 2147483647 之间，请使用 LONGBLOB。 如果长度为 0，请使用 LONGBLOB (完全 LOB 支持)。  | 
|  NCLOB  |  如果长度介于 1 和 65535 之间，请使用 TEXT。 如果长度介于 65536 和 2147483647 之间，请将 LONGTEXT 与 ucs2 一起用于 CHARACTER SET。 如果长度为 0，请将 LONGTEXT (完全 LOB 支持) 与 ucs2 一起用于 CHARACTER SET。  | 
|  CLOB  |  如果长度介于 1 和 65535 之间，请使用 TEXT。 如果长度介于 65,536 和 2147483647 之间，请使用 LONGTEXT。 如果长度为 0，请使用 LONGTEXT (完全 LOB 支持)。  | 