

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

# 使用与 MySQL 兼容的数据库作为源 AWS DMS
<a name="CHAP_Source.MySQL"></a>

你可以使用 Database Migration Service 从任何兼容 MySQL 的数据库（MySQL、MariaDB 或 Amazon Aurora MySQL）迁移数据。 AWS 

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

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

在以下各节中，术语“自管理”适用于在本地安装或在 Amazon EC2 上安装的任何数据库。术语“AWS托管”适用于 Amazon RDS、Amazon Aurora 或 Amazon S3 上的任何数据库。

有关使用与 MySQL 兼容的数据库和的更多详细信息 AWS DMS，请参阅以下章节。

**Topics**
+ [使用从 MySQL 迁移到 MySQL AWS DMS](#CHAP_Source.MySQL.Homogeneous)
+ [使用任何与 MySQL 兼容的数据库作为源 AWS DMS](#CHAP_Source.MySQL.Prerequisites)
+ [使用自管理的 MySQL 兼容数据库作为源 AWS DMS](#CHAP_Source.MySQL.CustomerManaged)
+ [使用 AWS托管的 MySQL 兼容数据库作为源 AWS DMS](#CHAP_Source.MySQL.AmazonManaged)
+ [使用 MySQL 数据库作为源代码的限制 AWS DMS](#CHAP_Source.MySQL.Limitations)
+ [支持 XA 事务](#CHAP_Source.MySQL.XA)
+ [使用 MySQL 作为来源时的端点设置 AWS DMS](#CHAP_Source.MySQL.ConnectionAttrib)
+ [MySQL 的源数据类型](#CHAP_Source.MySQL.DataTypes)

**注意**  
配置 AWS Database Migration Service (AWS DMS) 映射规则时，请务必避免对数据库或架构名称使用通配符 (%)。相反，您必须仅明确指定需要进行迁移的用户创建数据库。使用通配符包括迁移过程中的所有数据库，包括目标实例上不需要的系统数据库。由于 MySQL Amazon RDS 主用户缺乏将数据导入目标系统数据库的必要权限，因此尝试迁移这些系统数据库会失败。

## 使用从 MySQL 迁移到 MySQL AWS DMS
<a name="CHAP_Source.MySQL.Homogeneous"></a>

对于异构迁移，从MySQL以外的数据库引擎迁移到MySQL数据库，几乎 AWS DMS 总是最好的迁移工具。但是，对于同构迁移，即从 MySQL 数据库迁移到 MySQL 数据库，我们建议您使用同构数据迁移项目。与 AWS DMS相比，同构数据迁移使用原生数据库工具来提供更好的数据迁移性能和准确性。

## 使用任何与 MySQL 兼容的数据库作为源 AWS DMS
<a name="CHAP_Source.MySQL.Prerequisites"></a>

在开始使用 MySQL 数据库作为源之前 AWS DMS，请确保满足以下先决条件。这些先决条件适用于自行管理或由管理的 AWS来源。

您必须拥有一个 AWS DMS 具有复制管理员角色的帐户。该角色需要以下权限：
+ **REPLICATION CLIENT** – 仅 CDC 任务需要此权限。换句话说， full-load-only任务不需要此权限。
**注意**  
对于 MariaDB 版本 10.5.2\$1，你可以使用 BINLOG MONITOR，它是复制客户端的替代品。
+ **REPLICATION SLAVE** – 仅 CDC 任务需要此权限。换句话说， full-load-only任务不需要此权限。
+ **SUPER** - 仅 MySQL 5.6.6 之前的版本需要此权限。

 AWS DMS 用户还必须对指定用于复制的源表具有 SELECT 权限。

如果您使用特定于 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
grant select on performance_schema.replication_connection_status to <dms_user>;  #Required for primary instance validation - MySQL version 5.7 and higher only
```

如果您使用的是 RDS 源并计划运行特定于 MySQL 的预迁移评估，请添加以下权限：

```
grant select on mysql.rds_configuration to <dms_user>;  #Required for binary log retention check
```

如果参数 `BatchEnable` 为 `true`，则需要授予：

```
grant create temporary tables on `<schema>`.* to <dms_user>;
```

## 使用自管理的 MySQL 兼容数据库作为源 AWS DMS
<a name="CHAP_Source.MySQL.CustomerManaged"></a>

您可以使用以下与 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

要使用 CDC，请确保启用二进制日志记录。要启用二进制日志记录，则必须在 MySQL 的 `my.ini` (Windows) 或 `my.cnf` (UNIX) 文件中配置以下参数。


| 参数 | 值 | 
| --- | --- | 
| `server_id` | 将该参数设置为 1 或更大的值。 | 
| `log-bin` | 设置二进制日志文件的路径，例如 `log-bin=E:\MySql_Logs\BinLog`。请勿包含文件扩展名。 | 
| `binlog_format` | 将该参数设置为 `ROW`。我们建议在复制期间使用此设置，因为在某些情况下，如果 `binlog_format` 设置为 `STATEMENT`，那么在将数据复制到目标时可能会导致不一致。如果 `binlog_format` 设置为 `MIXED`，数据库引擎还会向目标写入类似的不一致数据，因为数据库引擎会自动切换到基于 `STATEMENT` 的日志记录，这可能导致在目标数据库上写入不一致的数据。 | 
| `expire_logs_days` | 将该参数设置为 1 或更大的值。为防止过度使用磁盘空间，我们建议您不要使用默认值 0。 | 
| `binlog_checksum` | 对于 DMS 版本 3.4.7 或之前的版本，请将此参数设置为 `NONE`。 | 
| `binlog_row_image` | 将该参数设置为 `FULL`。 | 
| `log_slave_updates` | 如果您使用 MySQL 或 MariaDB 只读副本作为源，请将此参数设置为 `TRUE`。 | 

如果您使用 MySQL 或 MariaDB 只读副本作为 DMS 迁移任务的源，并使用**迁移现有数据并复制持续更改**模式，则可能会丢失数据。在以下情况下，无论是在完全加载期间还是 CDC 期间，DMS 都不会写入事务：
+ 在 DMS 任务开始之前，事务已提交到主实例。
+ 由于主实例和副本之间存在延迟，直到 DMS 任务开始后，事务才提交到副本。

主实例和副本之间的延迟时间越长，数据丢失的可能性就越大。

如果您的源使用了 NDB（集群式）数据库引擎，则必须配置以下参数以对使用该存储引擎的表启用 CDC。请在 MySQL 的 `my.ini` (Windows) 或 `my.cnf` (UNIX) 文件中添加这些更改。


| 参数 | 值 | 
| --- | --- | 
| `ndb_log_bin` | 将该参数设置为 `ON`。此值确保在集群表中进行的更改保存到二进制日志。 | 
| `ndb_log_update_as_write` | 将该参数设置为 `OFF`。此值可以防止将 UPDATE 语句作为 INSERT 语句写入二进制日志。 | 
| `ndb_log_updated_only` | 将该参数设置为 `OFF`。此值可确保二进制日志包含整个行而不仅仅是更改的列。 | 

## 使用 AWS托管的 MySQL 兼容数据库作为源 AWS DMS
<a name="CHAP_Source.MySQL.AmazonManaged"></a>

您可以使用以下 AWS托管的 MySQL 兼容数据库作为源： AWS DMS
+ MySQL Community Edition
+ MariaDB Community Edition
+ Amazon Aurora MySQL 兼容版

使用与 AWS托管的 MySQL 兼容数据库作为源时 AWS DMS，请确保您满足以下使用 CDC 的先决条件：
+ 要为 RDS for MySQL 和 RDS for MariaDB 启用二进制日志，请在实例级别启用自动备份。要为 Aurora MySQL 集群启用二进制日志，请更改参数组中的变量 `binlog_format`。

  有关设置自动备份的更多信息，请参阅《Amazon RDS 用户指南》中的[使用自动备份](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html)**。

  有关为 Amazon RDS for MySQL 数据库设置二进制日志记录的更多信息，请参阅《Amazon RDS 用户指南》中的[设置二进制日志记录格式](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.MySQL.BinaryFormat.html)**。

  有关为 Aurora MySQL 集群设置二进制日志记录的更多信息，请参阅[如何为 Amazon Aurora MySQL 集群开启二进制日志记录？](https://aws.amazon.com/premiumsupport/knowledge-center/enable-binary-logging-aurora/)。
+ 如果您计划使用 CDC，请启用二进制日志记录。有关为 Amazon RDS for MySQL 数据库设置二进制日志记录的更多信息，请参阅《Amazon RDS 用户指南》中的[设置二进制日志记录格式](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.MySQL.BinaryFormat.html)**。
+ 确保二进制日志可供使用 AWS DMS。由于与 AWS MySQL 兼容的数据库会尽快清除二进制日志，因此您应该延长日志的可用时间。例如，要将日志保留时间延长至 24 小时，请运行以下命令。

  ```
   call mysql.rds_set_configuration('binlog retention hours', 24);
  ```
+ 将 `binlog_format` 参数设置为 `"ROW"`。
**注意**  
在 MySQL 或 MariaDB 上，`binlog_format` 是一个动态参数，因此您不必重新启动即可使新值生效。但是，新值仅适用于新会话。如果您出于复制目的将 `binlog_format` 切换为 `ROW`，则如果这些会话在您更改值之前已启动，则数据库仍可以使用 `MIXED` 格式创建后续的二进制日志。这可能会 AWS DMS 阻止正确捕获源数据库上的所有更改。更改 MariaDB 或 MySQL 数据库的 `binlog_format` 设置时，请务必重新启动数据库以关闭所有现有会话，或者重新启动任何执行 DML（Data Manipulation Language，数据操作语言）操作的应用程序。将`binlog_format`参数更改为后强制数据库重新启动所有会话`ROW`将确保您的数据库使用正确的格式写入所有后续的源数据库更改，以便 AWS DMS 可以正确捕获这些更改。
+ 将 `binlog_row_image` 参数设置为 `"Full"`。
+ 对于 DMS 版本 3.4.7 或之前的版本，请将 `binlog_checksum` 参数设置为 `"NONE"`。有关在 Amazon RDS MySQL 中设置参数的更多信息，请参阅《Amazon RDS 用户指南》中的[使用自动备份](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithAutomatedBackups.html)**。
+ 如果您使用 Amazon RDS MySQL 或 Amazon RDS MariaDB 只读副本作为源，请在只读副本上启用备份，并确保 `log_slave_updates` 参数设置为 `TRUE`。

## 使用 MySQL 数据库作为源代码的限制 AWS DMS
<a name="CHAP_Source.MySQL.Limitations"></a>

使用 MySQL 数据库作为源时，请考虑以下事项：
+  Amazon RDS MySQL 5.5 或更低版本不支持更改数据捕获（CDC）。对于 Amazon RDS MySQL，您必须使用版本 5.6、5.7 或 8.0 才能启用 CDC。自管理 MySQL 5.5 源支持 CDC。
+ 对于 CDC，`CREATE TABLE`、`ADD COLUMN` 和 `DROP COLUMN` 更改列数据类型，并支持 `renaming a column`。但是，不支持 `DROP TABLE`、`RENAME TABLE` 和对其他属性（例如列默认值、列可为 null 值、字符集等）进行更新。
+  对于源上的分区表，当您将**目标表准备模式设置为 “在目标****上删除表**” 时，将 AWS DMS 创建一个在 MySQL 目标上没有任何分区的简单表。要将分区表迁移到目标上的分区表，请预先在目标 MySQL 数据库创建分区表。
+  关系目标不支持使用`ALTER TABLE table_name ADD COLUMN column_name`语句将列添加到表的开头 (FIRST) 或中间 (AFTER)。列始终添加到表的末尾。当目标是 Amazon S3 或 Amazon Kinesis Data Streams 时，支持使用 FIRST 或 AFTER 添加列。
+ 当表名称包含大写和小写字符且源引擎托管于包含不区分大小写的文件名的操作系统上时，CDC 不受支持。一个示例是使用 HFS\$1 的 Microsoft Windows 或 OS X。
+ 您可以使用 Aurora MySQL 兼容版 Serverless v1 进行完全加载，但不能将其用于 CDC。这是因为您无法为 MySQL 启用先决条件。有关更多信息，请参阅[参数组和 Aurora Serverless v1](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.how-it-works.html#aurora-serverless.parameter-groups)。

  Aurora MySQL 兼容版 Serverless v2 支持 CDC。
+  列上的 AUTO\$1INCREMENT 属性不会迁移到目标数据库列。
+  当二进制日志未存储在标准块存储上时，不支持捕获更改。例如，当二进制日志存储在 Amazon S3 中时，CDC 不起作用。
+  AWS DMS 默认使用InnoDB存储引擎创建目标表。如果您需要使用 InnoDB 之外的存储引擎，则必须手动创建该表并使用 [Do nothing (不执行任何操作)](https://docs.aws.amazon.com/dms/latest/userguide/CHAP_GettingStarted.html) 模式迁移到该表。
+ 除非您的 DMS 迁移任务模式为 “迁移**现有数据** — 仅限满载”， AWS DMS 否则您不能使用 Aurora MySQL 副本作为源。
+  如果与 MySQL 兼容的源在完全加载期间停止， AWS DMS 任务不会停止，但会出现错误。该任务将成功结束，但目标可能与源不同步。如果发生这种情况，请重新启动该任务或重新加载受影响的表。
+  在列值的一部分上创建的索引不会迁移。例如，索引 CREATE INDEX first\$1ten\$1chars ON customer (名称 (10)) 不在目标上创建。
+ 在某些情况下，任务被配置为不复制 LOBs（任务设置中的 SupportLobs “” 为 false 或者在任务控制台中选择了 “**不包含 LOB” 列**）。在这些情况下， AWS DMS 不会将任何 MEDIUMBLOB、LONGBLOB、MEDIUMTEXT 和 LONGTEXT 列迁移到目标。

  BLOB、TINYBLOB、TEXT 和 TINYTEXT 列不会受到影响且将迁移到目标。
+ MariaDB 源数据库和目标数据库不支持临时数据表或系统版本控制表。
+ 如果在两个 Amazon RDS Aurora MySQL 集群之间迁移，则 RDS Aurora MySQL 源终端节点必须是 read/write 实例，而不是副本实例。
+ AWS DMS 目前不支持 MariaDB 的视图迁移。
+ AWS DMS 不支持 MySQL 分区表的 DDL 更改。要跳过 CDC 期间因分区 DDL 更改而暂停表的情况，请将 `skipTableSuspensionForPartitionDdl` 设置为 `true`。
+ AWS DMS 仅支持 3.5.0 及更高版本中的 XA 事务。以前的版本不支持 XA 事务。 AWS DMS 在 MariaDB 10.6 或更高版本中不支持 XA 事务。有关更多信息，请参阅以下内容。[支持 XA 事务](#CHAP_Source.MySQL.XA)
+ AWS DMS 不 GTIDs 用于复制，即使源数据包含复制。
+ AWS DMS 不支持 Aurora MySQL 增强型二进制日志。
+ AWS DMS 不支持二进制日志事务压缩。
+ AWS DMS 不会在使用 InnoDB 存储引擎的 MySQL 数据库的 “删除级联” 和 “更新时级联” 事件进行传播。对于这些事件，MySQL 不会生成二进制日志事件来反映子表上的级联操作。因此， AWS DMS 无法将相应的更改复制到子表。有关更多信息，请参阅 [索引、外键或级联更新内容或删除内容未迁移](CHAP_Troubleshooting.md#CHAP_Troubleshooting.MySQL.FKsAndIndexes)。
+ AWS DMS 不捕获对计算（`VIRTUAL`和`GENERATED ALWAYS`）列的更改。要解决此限制，请执行以下操作之一：
  + 在目标数据库中预先创建目标表，然后使用 `DO_NOTHING` 或 `TRUNCATE_BEFORE_LOAD` 完全加载任务设置创建 AWS DMS 任务。
  + 添加转换规则以从任务范围中移除计算列。有关转换规则的信息，请参阅[转换规则和操作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。
+ 由于 MySQL 的内部限制， AWS DMS 可以处理 BINLOGs 不超过 4GB 的大小。 BINLOGs 大于 4GB 可能会导致 DMS 任务失败或其他不可预测的行为。您必须减小交易大小以避免 BINLOGs 超过 4GB。
+ AWS DMS 不支持架构、表和列名中的反引号 (````'`) 或单引号 ()。
+ AWS DMS 不会迁移源数据库中不可见列的数据。要将这些列纳入迁移范围内，请使用 ALTER TABLE 语句使这些列可见。

## 支持 XA 事务
<a name="CHAP_Source.MySQL.XA"></a>

扩展架构（XA）事务用于将来自多个事务资源的一系列操作，分组为单个可靠的全局事务。XA 事务使用两阶段提交协议。通常，在有未处理的 XA 事务时捕获更改可能会导致数据丢失。如果您的数据库不使用 XA 事务，则可以使用默认值 `TRUE` 忽略此权限和配置 `IgnoreOpenXaTransactionsCheck`。要开始从具有 XA 事务的源进行复制，请执行以下操作：
+ 确保终 AWS DMS 端用户具有以下权限：

  ```
  grant XA_RECOVER_ADMIN on *.* to 'userName'@'%';
  ```
+ 将端点设置 `IgnoreOpenXaTransactionsCheck` 设置为 `false`。

**注意**  
AWS DMS 不支持 MariaDB 源数据库 10.6 或更高版本上的 XA 事务。

## 使用 MySQL 作为来源时的端点设置 AWS DMS
<a name="CHAP_Source.MySQL.ConnectionAttrib"></a>

您可以使用端点设置来配置 MySQL 源数据库，这与使用额外连接属性类似。您可以在使用 AWS DMS 控制台创建源端点时指定设置，或者使用中带有 `--my-sql-settings '{"EndpointSetting": "value", ...}'` JSON 语法的`create-endpoint`[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_Source.MySQL.html)

## MySQL 的源数据类型
<a name="CHAP_Source.MySQL.DataTypes"></a>

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

有关如何查看目标中映射的数据类型的信息，请参阅有关所使用的目标终端节点的部分。

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


|  MySQL 数据类型  |  AWS DMS 数据类型  | 
| --- | --- | 
|  INT  |  INT4  | 
|  BIGINT  |  INT8  | 
|  MEDIUMINT  |  INT4  | 
|  TINYINT  |  INT1  | 
|  SMALLINT  |  INT2  | 
|  UNSIGNED TINYINT  |  UINT1  | 
|  UNSIGNED SMALLINT  |  UINT2  | 
|  UNSIGNED MEDIUMINT  |  UINT4  | 
|  UNSIGNED INT  |  UINT4  | 
|  UNSIGNED BIGINT  |  UINT8  | 
|  DECIMAL(10)  |  NUMERIC (10,0)  | 
|  BINARY  |  BYTES(1)  | 
|  BIT  |  BOOLEAN  | 
|  BIT(64)  |  BYTES(8)  | 
|  BLOB  |  BYTES(65535)  | 
|  LONGBLOB  |  BLOB  | 
|  MEDIUMBLOB  |  BLOB  | 
|  TINYBLOB  |  BYTES(255)  | 
|  DATE  |  DATE  | 
|  DATETIME  |  DATETIME 不带括号值的 DATETIME 复制时不包括毫秒。括号值为 1 到 5 的 DATETIME（例如 `DATETIME(5)`）在复制时包括毫秒。 复制 DATETIME 列时，时间在目标上保持不变。它不会转换为 UTC。  | 
|  TIME  |  string  | 
|  TIMESTAMP  |  DATETIME 复制 TIMESTAMP 列时，目标上的时间会转换为 UTC。  | 
|  YEAR  |  INT2  | 
|  DOUBLE  |  REAL8  | 
|  FLOAT  |  REAL(DOUBLE) 如果 FLOAT 值不在以下范围内，请使用转换将 FLOAT 映射到 STRING。有关转换的更多信息，请参阅 [转换规则和操作](CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Transformations.md)。 支持的 FLOAT 范围是 -1.79E\$1308 到 -2.23E-308、0 以及 2.23E-308 到 1.79E\$1308  | 
|  VARCHAR(45)  |  WSTRING (45)  | 
|  VARCHAR(2000)  |  WSTRING (2000)  | 
|  VARCHAR(4000)  |  WSTRING (4000)  | 
|  VARBINARY (4000)  |  BYTES (4000)  | 
|  VARBINARY (2000)  |  BYTES (2000)  | 
|  CHAR  |  WSTRING  | 
|  TEXT  |  WSTRING  | 
|  LONGTEXT  |  NCLOB  | 
|  MEDIUMTEXT  |  NCLOB  | 
|  TINYTEXT  |  WSTRING(255)  | 
|  GEOMETRY  |  BLOB  | 
|  POINT  |  BLOB  | 
|  LINESTRING  |  BLOB  | 
|  POLYGON  |  BLOB  | 
|  MULTIPOINT  |  BLOB  | 
|  MULTILINESTRING  |  BLOB  | 
|  MULTIPOLYGON  |  BLOB  | 
|  GEOMETRYCOLLECTION  |  BLOB  | 
|  ENUM  |  WSTRING () *length* 这*length*是 ENUM 中最长值的长度。  | 
|  SET  |  WSTRING () *length* 这里*length*是 SET 中所有值的总长度，包括逗号。  | 
|  JSON  |  CLOB  | 

**注意**  
在某些情况下，您可以使用“零”值（即 0000-00-00）来指定 DATETIME 和 TIMESTAMP 数据类型。如果这样做，请确保复制任务中的目标数据库支持 DATETIME 和 TIMESTAMP 数据类型的“零”值。否则，这些值在目标上将被记录为 null。