使用 AWS DMS 将源 RDS MySQL 数据库迁移到目标 RDS MySQL 数据库时,应遵循哪些最佳实践?
我有一个 MySQL 数据库,我想使用 AWS Database Migration Service (AWS DMS) 迁移到 Amazon Relational Database Service (Amazon RDS) for MySQL 服务。我可以使用哪些最佳实践来优化源 MySQL 数据库和目标 MySQL 数据库之间的迁移?
简短描述
使用 AWS DMS,您可以将数据从源数据存储迁移到目标数据存储。这两个数据存储称为端点。您可以在使用相同数据库引擎的源端点和目标端点之间进行迁移,例如从一个 MySQL 数据库迁移到另一个 MySQL 数据库。
尽管 AWS DMS 创建目标架构对象,但它只创建从源有效迁移数据所需的最小量对象。因此,AWS DMS 会创建表、主键,以及在某些情况下创建唯一索引,但不会创建二级索引、非主键约束和数据默认值等对象。有关 AWS DMS 迁移的内容的更多信息,请参阅 AWS DMS 的简要视图。
迁移前在目标数据库上预先创建表
要保留默认数据定义,请于迁移之前在目标数据库上预先创建表。根据要执行的迁移类型,使用以下方法之一:
- 对于如 MySQL 到 MySQL 这样的同构迁移,请使用本机数据库引擎实用程序(如 mysqldump)导出表定义。然后,将这些表定义导入目标,而不包含数据。创建表定义后,使用将目标表准备模式设置为 TRUNCATE_BEFORE_LOAD 的 AWS DMS 任务来加载数据。
- 对于跨不同数据库引擎的迁移,请使用 AWS Schema Conversion Tool (AWS SCT)。您也可以将此方法用于同构数据库。AWS SCT 连接到源数据库和目标数据库,然后将现有数据库架构从一个数据库引擎转换为另一个数据库引擎。您可以使用 AWS SCT 在目标数据库上预先创建保留默认数据定义的表。然后,使用将目标表准备模式设置为 TRUNCATE_BEFORE_LOAD 的 AWS DMS 任务来加载数据。有关更多信息,请参阅使用 AWS SCT 转换架构。
解决方案
遵循 MySQL 到 MySQL AWS DMS 迁移的最佳实践
将数据从 MySQL 源数据库迁移到 MySQL 目标数据库时,请使用这些最佳实践。
- 迁移期间关闭目标数据库上的备份和特定于数据库的日志(例如二进制、常规和审计)。如果需要,可以再次打开这些日志以解决问题。
- 迁移期间关闭目标数据库上的触发器、其他 cron 作业和事件计划程序。
- 执行 AWS DMS 迁移时,请避免在目标 Amazon RDS 数据库上使用多可用区。
- 执行迁移时,请避免将任何其他外部客户端流量应用到目标数据库。
- 为您的 AWS DMS 复制实例、源数据库和目标数据库预置所需的 CPU、内存、存储和 IOPS,以避免迁移期间出现资源争用。
- 在开始迁移之前,以使用 AWS DMS 变更数据捕获 (CDC) 的先决条件配置源数据库。
- 使用优化的 LOB 设置,例如有限 LOB 和内联 LOB 进行迁移。
- 如果源数据库包含许多工作负载繁重的表,请将这些表拆分为多个任务。根据表在源数据库中的大小、应用程序流量模式以及是否存在 LOB 列来拆分表。如果表有许多 LOB(TEXT 或 JSON)列,且源上的写入流量很高,则为该表创建单独的任务。事务一致性在任务中得到维护,因此重点是单独任务中的表不参与常见事务。
- 对大量源表使用并行满负载机制以缩短迁移时间。有关更多信息,请参阅对选定的表、视图和集合使用并行负载。
- 在满负载迁移期间关闭目标表上的外键约束。
- 在开始复制的 CDC 阶段之前,在目标数据库上添加二级索引。
- Amazon RDS 主用户没有默认架构表的删除和重新创建权限。因此,请避免使用 AWS DMS 从源迁移默认数据库或架构表。
- 请查看有关使用 AWS DMS 将数据从 MySQL 迁移到 MySQL 的文档,了解 AWS DMS 可以成功迁移哪些类型数据的信息。
- 在使用批量应用 CDC 方法之前,使用默认的事务 CDC 应用测试您的工作负载。有关更多信息,请参阅如何使用 DMS 批量应用功能来提高 CDC 复制性能?
- 在开始生产迁移之前,请在任何其他 QA/DEV 数据库环境中使用相同的生产数据测试迁移。进行生产迁移时,请确保使用相同的 AWS DMS 配置。
有关更多信息,请参阅提高 AWS DMS 迁移的性能。
对源数据库和目标数据库使用建议的配置和方法
1.在目标 MySQL/PostgreSQL 数据库上手动预先创建表 DDL。然后,创建将目标准备模式设置为 DO_DOTHING”/“TRUNCATE” 的 AWS DMS 任务,以便仅迁移数据。
运行以下命令以创建不包含源 MySQL 数据库数据的转储:
mysqldump -h yourhostnameorIP -u root -p --no-data --skip-triggers --single-transaction --dbname > schema.sql
此命令从源中转储 DDL 结构,不包含任何数据。
接下来,运行以下命令以恢复目标上的 DDL 结构:
mysql -u user -p -h yourhostnameorIP database_name < schema.sql
或者,您可以允许 AWS DMS 使用 DROP AND CREATE 目标准备模式在目标上创建表。然后,在恢复 CDC 阶段的任务之前,跳到步骤 3 更改表并添加缺失的对象(如二级索引)。
**注意:**默认情况下,AWS DMS 仅使用主键或唯一键在目标上创建表。它不会将任何其他对象迁移到目标 MySQL 数据库。
2.在满负载期间,AWS DMS 不会识别外键关系表。它随机加载数据,因此,如果目标数据库启用了外键检查,则表加载可能会失败。在目标 MySQL 端点上使用此额外连接属性 (ECA) 关闭 AWS DMS 会话的外键检查。
initstmt=SET FOREIGN_KEY_CHECKS=0;
有关更多信息,请参阅使用兼容 MySQL 的数据库作为 AWS DMS 目标时的额外连接属性。
3.在 JSON 设置中,将应用缓存更改前停止任务设置为 true,并在应用缓存更改后将停止任务设置为 true。
"FullLoadSettings": { "TargetTablePrepMode": "TRUNCATE_BEFORE_LOAD" "CreatePkAfterFullLoad": false, "TransactionConsistencyTimeout": 600, "MaxFullLoadSubTasks": 8, "StopTaskCachedChangesNotApplied": true, <--- set this to true "StopTaskCachedChangesApplied": true, <--- set this to true "CommitRate": 50000, }
满负载完成后和应用缓存的更改之前,任务将停止。任务停止时,在目标上创建主键索引和二级索引。
接下来,继续执行该任务,因为该任务在应用缓存的更改后会再次停止。然后,使用 AWS DMS 验证输出或手动验证验证迁移的数据,然后再次恢复 CDC 复制阶段的任务。通过完成此步骤,您可以确定任何问题并在恢复 CDC 复制之前解决这些问题。
4. 在“任务满负载”设置中,调整 commitRate 设置以加快从源中提取数据的速率。默认值为 10000,因此在从源表迁移大量数据时请调整此设置。
CommitRate=50000
注意:将 commitRate 更改为更高的值可能会影响性能,因此请确保监控复制实例并具有足够的内存。
5. 在目标端点上添加此 ECA,以指定用于将数据传输到目标 MySQL 的任何 .csv 文件的最大大小(以 KB 为单位)。默认值为 32,768 KB (32 MB),有效值范围为 1–1,048,576 KB(最大 1.1 GB)。
maxFileSize=250000;
注意:当您使用目标实例(如 MySQL、Aurora 或 MariaDB)进行满负载时,请使用此选项允许 AWS DMS 在后台创建 .csv 文件,以便将数据加载到目标实例中。请使用介于 32 MB 和 1 GB 之间的值。但是,也要考虑目标实例可以处理多少量。如果您有多个任务正在加载 1 GB 的 .csv 文件,这可能会导致目标实例的开销。确保在目标位置有具备高计算能力的实例。
6. 使用有限 LOB 或内联 LOB 设置以获得更理想的性能。
**有限 LOB 模式:**使用有限 LOB 模式时,您可以指定 LOB 列数据的最大大小。这样将允许 AWS DMS 预分配资源,然后批量应用 LOB。如果 LOB 列的大小超过您在任务中指定的大小,则 AWS DMS 将会截断数据。然后发送警告到 AWS DMS 日志文件。使用有限 LOB 模式可以提高性能—然而,在运行任务之前,您必须确定源上数据的最大 LOB 大小。然后,指定最大 LOB 大小参数。最佳实践是确保您向复制实例分配了足够的内存以处理该任务。
**内联 LOB 模式:**使用内联 LOB 模式时,您可以通过复制小 LOB 和大 LOB 来迁移 LOB,而不会截断数据或降低任务的速度。首先指定 InlineLobMaxSize 参数的值。仅在“全 LOB 模式”设置为 true 时才可以指定此参数的值。AWS DMS 任务会内联传输小 LOB,这种方式更为高效。然后 AWS DMS 会查询源表,以迁移超过全 LOB 模式中指定大小的 LOB。但请注意,内联 LOB 模式仅在满负载阶段工作。
注意:在为任务指定任务设置时,您必须设置 InlineLobMaxSize。
运行这些查询以检查 LOB 大小,然后填充最大 LOB 大小。
列出具有 LOB 列的表:
select tab.table_name, count(*) as columns from information_schema.tables as tab inner join information_schema.columns as col on col.table_schema = tab.table_schema and col.table_name = tab.table_name and col.data_type in ('blob', 'mediumblob', 'longblob', 'text', 'mediumtext', 'longtext') where tab.table_schema = 'your database name'. <---- enter database name here and tab.table_type = 'BASE TABLE' group by tab.table_name order by tab.table_name;
检查 LOB 列的大小:
Select (max(length (<COL_NAME>))/(1024)) as “size in KB” from <TABLE_NAME>;
检查所有表的 LOB 列大小,然后以“最大 LOB 大小 (K)”填充最大大小。
使用值大于 63 KB 的“最大 LOB 大小 (K)”选项会影响配置为在限制 LOB 模式下运行的满负载的性能。在满负载期间,AWS DMS 通过将“最大 LOB 大小 (K)”值乘以提交速率来分配内存。然后,将乘积乘以 LOB 列的数量。
当 AWS DMS 无法预先分配该内存时,AWS DMS 将开始消耗交换内存。这会影响满负载的性能。因此,如果您在使用有限 LOB 模式时遇到性能问题,请降低提交率,直到达到可接受的性能水平。或者,在首先检查表的 LOB 分布后,考虑对受支持的端点使用内联 LOB 模式。
有关更多信息,请参阅在 AWS DMS 任务中为源数据库设置 LOB 支持。
相关信息
相关内容
- 已提问 3 个月前lg...
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 年前