

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

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

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

您可以使用 SSL 对 MySQL-compatible 终端节点和复制实例之间的连接进行加密。有关在 MySQL-compatible终端节点上使用 SSL 的更多信息，请参阅[将 SSL 与 AWS Database Migration Service](CHAP_Security.SSL.md)。

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

您可以使用以下 MySQL-compatible 数据库作为目标 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-compatible 创建为 InnoDB 表。  
如果您需要在InnoDB以外的存储引擎中创建表，则可以在 MySQL-compatible 目标系统上手动创建表，然后使用**不执行任何操作**选项迁移该表。有关更多信息，请参阅 [Full-load 任务设置](CHAP_Tasks.CustomizingTasks.TaskSettings.FullLoad.md)。

有关使用 MySQL-compatible 数据库作为目标的更多详细信息 AWS DMS，请参阅以下各节。

**Topics**
+ [使用任何 MySQL-compatible 数据库作为目标 AWS Database Migration Service](#CHAP_Target.MySQL.Prerequisites)
+ [Aurora MySQL 8.4 目标的注意事项](#CHAP_Target.MySQL.AuroraMySQL84)
+ [使用 MySQL-compatible 数据库作为目标的限制 AWS Database Migration Service](#CHAP_Target.MySQL.Limitations)
+ [使用 MySQL-compatible 数据库作为目标时的终端节点设置 AWS DMS](#CHAP_Target.MySQL.ConnectionAttrib)
+ [MySQL 的目标数据类型](#CHAP_Target.MySQL.DataTypes)

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

在开始使用 MySQL-compatible 数据库作为目标之前 AWS DMS，请确保已完成以下先决条件：
+ 为其提供 AWS DMS 具有 MySQL-compatible 数据库 read/write 权限的用户帐户。要创建所需的权限，请运行以下命令。

  ```
  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-compatible 数据库满负荷期间禁用外键检查，可以在 AWS DMS 控制台的目标终端节点的 “**额外连接属性**” 部分中添加以下命令。

  ```
  Initstmt=SET FOREIGN_KEY_CHECKS=0;
  ```
+ 设置数据库参数 `local_infile = 1` 以启用 AWS DMS ，以便将数据加载到目标数据库。
+ 如果您使用 MySQL-specific 预迁移评估，请授予以下权限。

  ```
  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
  ```

## Aurora MySQL 8.4 目标的注意事项
<a name="CHAP_Target.MySQL.AuroraMySQL84"></a>

Aurora MySQL 8.4 引入了可能会影响 AWS DMS 目标终端节点连接的安全更改。在将 Aurora MySQL 目标升级到版本 8.4 之前，请查看以下内容。

**TLS 强制执行**

Aurora MySQL 8.4 `ON` 默认设置`require_secure_transport`为，这意味着所有连接都必须使用 TLS。如果您的 AWS DMS 目标终端节点连接到 Aurora MySQL 8.4，并且 SSL 模式设置为**无**，则连接将被拒绝。如果您的终端节点 SSL 模式设置为**无**，您将收到以下错误：`MySQL Error 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON`。**将端点 SSL 模式设置为 **verify-ca 或 verify-ful** l。**两种模式都需要 CA 证书。或者，`OFF`在 Aurora 集群参数组中设置`require_secure_transport`为，以允许未加密的连接。

**注意**  
Aurora MySQL 8.4 仅支持 TLS 1.2 的 GCM 密码套件。所有 CBC-mode 密码均已删除。 AWS DMS 对 MySQL 和 Aurora MySQL 终端节点使用 TLS 1.2，并将自动协商支持的 GCM 密码。如果您有自定义密码配置，请确认它们包含以下支持的密码之一： ECDHE-RSA-AES128-GCM-SHA256、、 ECDHE-RSA-AES256-GCM-SHA384或。 ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-ECDSA-AES256-GCM-SHA384

**注意**  
AWS DMS 不支持 MySQL 终端节点的 TLS 1.3。这不会影响与 Aurora MySQL 8.4 的连接，因为 Aurora MySQL 8.4 继续支持 TLS 1.2。

**身份验证（适用于 MySQL 的 Aurora MySQL 和 RDS 8.4）**

Aurora MySQL 8.4 将`default_authentication_plugin`参数替换为`authentication_policy`，默认为`*:caching_sha2_password`。升级后，现有数据库用户会保留其当前的身份验证插件。如果您在升级后创建新的 AWS DMS 终端节点用户，则除非您在集群参数组`*:mysql_native_password`中`authentication_policy`将其设置为，否则他们将`caching_sha2_password`默认使用。

**主用户密码重置**

升级到 Aurora MySQL 8.4 后，通过 AWS 管理控制台、CLI 或 Secrets Manager 轮换重置主用户密码会将主用户的身份验证插件设置为`authentication_policy`参数定义的默认值。如果设置`authentication_policy`为其默认值 (`*:caching_sha2_password`)，则在下次重置密码`caching_sha2_password`时，主用户的身份验证插件`mysql_native_password`将从变为。

如果您的 AWS DMS 目标端点使用主用户帐户，请在重置密码后验证连接。要避免更改身份验证插件，请执行以下任一操作：
+ `*:mysql_native_password`在重置密码之前，在集群参数组中设置为，或者 `authentication_policy`
+ 使用明确指定的身份验证插件创建专用 AWS DMS 端点用户（推荐）。例如：`CREATE USER 'dms_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';`

*有关 Aurora MySQL 8.4 安全变更的更多信息，请参阅[亚马逊 Aurora MySQL 的安全](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Security.html)性以及[亚马逊 Aurora 和 Secrets Manager 的密码管理](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-secrets-manager.html)。*有关身份验证插件已知问题的信息，请参阅 *Amazon RDS 用户指南*中的[身份验证插件](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.KnownIssuesAndLimitations.html#MySQL.Concepts.KnownIssuesAndLimitations.authentication-plugin)。

## 使用 MySQL-compatible 数据库作为目标的限制 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-compatible 目标加载数据时， AWS DMS 不会报告任务日志中的限制导致的错误，这些错误可能会导致重复的键错误或与记录数量不匹配。这是由 MySQL 使用 `LOAD DATA` 命令处理本地数据的方式造成的。务必在完全加载阶段执行以下操作：
  + 禁用限制
  + 使用 AWS DMS 验证来确保数据的一致性。
+ 当您将列的值更新为其现有值时， MySQL-compatible数据库会返回`0 rows affected`警告。尽管此行为在技术上没有错误，但它与其他数据库引擎应对这种情况的方式不同。例如，Oracle 执行一个行的更新。对于 MySQL-compatible 数据库，在 awsdms\_apply\_exceptions 控制表中 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-compatible 数据库作为目标时的终端节点设置 AWS DMS
<a name="CHAP_Target.MySQL.ConnectionAttrib"></a>

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

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


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

您也可以使用额外的连接属性来配置 MySQL-compatible 目标数据库。

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


| Name | 说明 | 
| --- | --- | 
| `Initstmt=SET FOREIGN_KEY_CHECKS=0;` | 禁用外键检查。<br />示例：`--extra-connection-attributes "Initstmt=SET FOREIGN_KEY_CHECKS=0;"` | 
| `Initstmt=SET time_zone` | 指定目标 MySQL-compatible 数据库的时区。<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 数据库目标数据类型 AWS DMS 以及 AWS DMS 数据类型的默认映射。

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


|  AWS 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 支持)。 | 