本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
将与 MySQL 兼容的数据库作为 AWS DMS 源
你可以使用 Database Migration Service 从任何兼容 MySQL 的数据库(MySQL、MariaDB 或 Amazon Aurora MySQL)迁移数据。AWS
有关AWS DMS支持作为源的 MySQL 版本的信息,请参阅的来源 AWS DMS。
您可以使用 SSL 来加密 MySQL 兼容终端节点与复制实例之间的连接。有关将 SSL 用于 MySQL 兼容终端节点的更多信息,请参阅将 SSL 与 AWS Database Migration Service。
在以下各节中,“自我管理” 一词适用于安装在本地或 Amazon EC2 上的任何数据库。术语“AWS 托管”适用于 Amazon RDS、Amazon Aurora 或 Amazon S3 上的任何数据库。
有关使用与 MySQL 兼容的数据库和的更多详细信息AWS DMS,请参阅以下各节。
主题
注意
配置 AWS Database Migration Service (AWS DMS) 映射规则时,请务必避免对数据库或架构名称使用通配符 (%)。相反,您必须仅明确指定需要进行迁移的用户创建数据库。使用通配符包括迁移过程中的所有数据库,包括目标实例上不需要的系统数据库。由于 MySQL Amazon RDS 主用户缺乏将数据导入目标系统数据库的必要权限,因此尝试迁移这些系统数据库会失败。
使用 AWS DMS 从 MySQL 迁移到 MySQL。
对于异构迁移,即从 MySQL 以外的数据库引擎迁移到 MySQL 数据库,几乎AWS DMS总是最好的迁移工具。但是,对于同构迁移,即从 MySQL 数据库迁移到 MySQL 数据库,我们建议您使用同构数据迁移项目。与 AWS DMS 相比,同构数据迁移使用原生数据库工具来提供更好的数据迁移性能和准确性。
使用任何与 MySQL 兼容的数据库作为源 AWS DMS
在开始使用 MySQL 数据库作为源之前AWS DMS,请确保满足以下先决条件。这些先决条件适用于自行管理或由管理的AWS来源。
您必须拥有一个AWS DMS具有复制管理员角色的帐户。该角色需要以下权限:
-
REPLICATION CLIENT – 仅 CDC 任务需要此权限。换句话说, full-load-only任务不需要此权限。
-
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
如果参数 BatchEnable 为 true,则需要授予:
grant create temporary tables on `<schema>`.* to <dms_user>;
使用自管理的 MySQL 兼容数据库作为源 AWS DMS
您可以使用以下与 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) 文件中配置以下参数。
参数 |
值 |
|---|---|
|
将该参数设置为 1 或更大的值。 |
|
设置二进制日志文件的路径,例如 |
|
将该参数设置为 |
|
将该参数设置为 1 或更大的值。为防止过度使用磁盘空间,我们建议您不要使用默认值 0。 |
|
对于 DMS 版本 3.4.7 或之前的版本,请将此参数设置为 |
|
将该参数设置为 |
|
如果您使用 MySQL 或 MariaDB 只读副本作为源,请将此参数设置为 |
如果您使用 MySQL 或 MariaDB 只读副本作为 DMS 迁移任务的源,并使用迁移现有数据并复制持续更改模式,则可能会丢失数据。在以下情况下,无论是在完全加载期间还是 CDC 期间,DMS 都不会写入事务:
在 DMS 任务开始之前,事务已提交到主实例。
由于主实例和副本之间存在延迟,直到 DMS 任务开始后,事务才提交到副本。
主实例和副本之间的延迟时间越长,数据丢失的可能性就越大。
如果您的源使用了 NDB(集群式)数据库引擎,则必须配置以下参数以对使用该存储引擎的表启用 CDC。请在 MySQL 的 my.ini (Windows) 或 my.cnf (UNIX) 文件中添加这些更改。
参数 |
值 |
|---|---|
|
将该参数设置为 |
|
将该参数设置为 |
|
将该参数设置为 |
使用AWS托管的 MySQL 兼容数据库作为源 AWS DMS
您可以使用以下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 用户指南》中的使用自动备份。
有关为 Amazon RDS for MySQL 数据库设置二进制日志记录的更多信息,请参阅《Amazon RDS 用户指南》中的设置二进制日志记录格式。
有关为 Aurora MySQL 集群设置二进制日志记录的更多信息,请参阅如何为 Amazon Aurora MySQL 集群开启二进制日志记录?
。 -
如果您计划使用 CDC,请启用二进制日志记录。有关为 Amazon RDS for MySQL 数据库设置二进制日志记录的更多信息,请参阅《Amazon RDS 用户指南》中的设置二进制日志记录格式。
-
确保二进制日志可供使用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 用户指南》中的使用自动备份。 -
如果您使用 Amazon RDS MySQL 或 Amazon RDS MariaDB 只读副本作为源,请在只读副本上启用备份,并确保
log_slave_updates参数设置为TRUE。
使用 MySQL 数据库作为源代码的限制 AWS DMS
使用 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语句将列添加到表的开头 (FIRST) 或中间 (AFTER)。列始终添加到表的末尾。table_nameADD COLUMNcolumn_name -
当表名称包含大写和小写字符且源引擎托管于包含不区分大小写的文件名的操作系统上时,CDC 不受支持。一个示例是使用 HFS+ 的 Microsoft Windows 或 OS X。
-
您可以使用 Aurora MySQL 兼容版 Serverless v1 进行完全加载,但不能将其用于 CDC。这是因为您无法为 MySQL 启用先决条件。有关更多信息,请参阅参数组和 Aurora Serverless v1。
Aurora MySQL 兼容版 Serverless v2 支持 CDC。
-
列上的 AUTO_INCREMENT 属性不会迁移到目标数据库列。
-
当二进制日志未存储在标准块存储上时,不支持捕获更改。例如,当二进制日志存储在 Amazon S3 中时,CDC 不起作用。
-
AWS DMS默认使用InnoDB存储引擎创建目标表。如果您需要使用 InnoDB 之外的存储引擎,则必须手动创建该表并使用 Do nothing (不执行任何操作) 模式迁移到该表。
-
除非您的 DMS 迁移任务模式为 “迁移现有数据 — 仅限满载”,AWS DMS否则您不能使用 Aurora MySQL 副本作为源。
-
如果与 MySQL 兼容的源在完全加载期间停止,AWS DMS 任务不会停止,但会出现错误。该任务将成功结束,但目标可能与源不同步。如果发生这种情况,请重新启动该任务或重新加载受影响的表。
-
在列值的一部分上创建的索引不会迁移。例如,索引 CREATE INDEX first_ten_chars 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 事务
-
AWS DMS不 GTIDs 用于复制,即使源数据包含复制也是如此。
-
AWS DMS不支持 Aurora MySQL 增强型二进制日志。
-
AWS DMS不支持二进制日志事务压缩。
-
AWS DMS不会在使用 InnoDB 存储引擎的 MySQL 数据库的 “删除级联” 和 “更新时级联” 事件进行传播。对于这些事件,MySQL 不会生成二进制日志事件来反映子表上的级联操作。因此,AWS DMS无法将相应的更改复制到子表。有关更多信息,请参阅 索引、外键或级联更新内容或删除内容未迁移。
-
AWS DMS不捕获对计算(
VIRTUAL和GENERATED ALWAYS)列的更改。要解决此限制,请执行以下操作之一:在目标数据库中预先创建目标表,然后使用
DO_NOTHING或TRUNCATE_BEFORE_LOAD完全加载任务设置创建 AWS DMS 任务。添加转换规则以从任务范围中移除计算列。有关转换规则的信息,请参阅 转换规则和操作。
-
由于 MySQL 的内部限制,AWS DMS可以处理 BINLOGs 不超过 4GB 的大小。 BINLOGs 大于 4GB 可能会导致 DMS 任务失败或其他不可预测的行为。您必须减小交易大小以避免 BINLOGs 超过 4GB。
-
AWS DMS不支持架构、表和列名中的反引号 (
`') 或单引号 ()。 -
AWS DMS不会迁移源数据库中不可见列的数据。要将这些列纳入迁移范围内,请使用 ALTER TABLE 语句使这些列可见。
支持 XA 事务
扩展架构(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
您可以使用端点设置来配置 MySQL 源数据库,这与使用额外连接属性类似。您可以在使用AWS DMS控制台创建源端点时指定设置,或者使用中带有 --my-sql-settings '{" JSON 语法的EndpointSetting":
"value", ...}'create-endpointAWS CLI命令来指定设置。
下表显示了将 MySQL 用作源时您可以使用的端点设置。
| Name | 说明 |
|---|---|
|
|
使用此额外连接属性(ECA)设置 MySQL 实例的端点连接超时时间(以秒为单位)。默认值为 10 秒。ECA 示例: |
EventsPollInterval |
指定在数据库处于空闲状态时在二进制日志中查看新更改/事件的频率。 默认值:5 有效值:1-60 示例: 在示例中,每五秒钟AWS DMS检查一次二进制日志中的更改。 |
ExecuteTimeout |
对于 3.4.7 及更高AWS DMS版本,设置 MySQL 源端点的客户端语句超时时间,以秒为单位。 默认值:60 示例: |
ServerTimezone |
指定源 MySQL 数据库的时区。 示例: |
AfterConnectScript |
指定要在AWS DMS连接到端点后立即运行的脚本。无论 SQL 语句是否成功,迁移任务都会继续运行。 有效值:一个或多个有效的 SQL 语句 (用分号分隔)。 示例: |
CleanSourceMetadataOnMismatch
|
出现不匹配情况时在复制实例上清除并重新创建表元数据信息。例如,对表运行更改 DDL 可能会产生有关在复制实例中缓存的表的不同信息。布尔值。 默认值: 示例: |
skipTableSuspensionForPartitionDdl
|
AWS DMS不支持 MySQL 分区表的 DDL 更改。对于 3.4.6 及更高AWS DMS版本,将此设置为在 CDC 期间更改分区 DDL 时会 默认值: 示例: |
IgnoreOpenXaTransactionsCheck
|
对于 3.5.0 及更高AWS DMS版本,指定任务在启动时是否应忽略打开的 XA 事务。如果您的源有 XA 事务,则将此项设置为 默认值: 示例: |
MySQL 的源数据类型
下表显示了使用时支持的 MySQL 数据库源数据类型AWS DMS以及AWS DMS数据类型的默认映射。
有关如何查看目标中映射的数据类型的信息,请参阅有关所使用的目标终端节点的部分。
有关AWS DMS数据类型的更多信息,请参见AWS Database Migration Service 的数据类型。
|
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 列时,时间在目标上保持不变。它不会转换为 UTC。 |
|
TIME |
string |
|
TIMESTAMP |
DATETIME 复制 TIMESTAMP 列时,目标上的时间会转换为 UTC。 |
|
YEAR |
INT2 |
|
DOUBLE |
REAL8 |
|
FLOAT |
REAL(DOUBLE) 如果 FLOAT 值不在以下范围内,请使用转换将 FLOAT 映射到 STRING。有关转换的更多信息,请参阅 转换规则和操作。 支持的 FLOAT 范围是 -1.79E+308 到 -2.23E-308、0 以及 2.23E-308 到 1.79E+308 |
|
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 () 这 |
|
SET |
WSTRING () 这里 |
|
JSON |
CLOB |
注意
在某些情况下,您可以使用“零”值(即 0000-00-00)来指定 DATETIME 和 TIMESTAMP 数据类型。如果这样做,请确保复制任务中的目标数据库支持 DATETIME 和 TIMESTAMP 数据类型的“零”值。否则,这些值在目标上将被记录为 null。