我可以在迁移的哪个阶段使用 AWS Database Migration Service (AWS DMS) 向目标数据库添加二级对象? 另外,我可以使用哪些任务设置来在目标数据库上创建二级对象?
简短描述
AWS DMS 使用 TargetTablePrepMode 选项在目标数据库上创建表。当 AWS DMS 创建目标表时,它只迁移将数据有效迁移到目标所需的对象。例如,AWS DMS 会创建表、主键,在某些情况下还会创建唯一索引。但是,它不会创建二级索引、非主键约束、数据默认值或用户账户。有关更多信息,请参阅缺少外键和二级索引。
如果您在迁移之前于目标系统上手动创建表,则最佳实践是在迁移开始之前删除二级对象(如二级索引)。
注意:这不适用于仅限变更数据捕获 (CDC) 的任务。
因此,为了确保迁移成功并提高任务性能,了解何时创建二级对象非常重要。根据任务使用的迁移方法,时机会有所不同:
- 仅满负载(迁移现有数据)
- 满负载和 CDC(迁移现有数据和复制正在进行的更改)
- CDC(仅复制数据更改)
解决方案
仅满负载
对于仅满负载任务,最佳实践是在迁移开始之前删除主键和所有二级对象。在满负载完成之前,请勿创建这些对象。如果在满负载期间目标数据库上有二级对象,则可能会出现额外的维护开销。
如果目标上有外键,这可能会导致任务失败。发生这种情况的原因是,除非您在表映射中手动指定,否则任务会以非特定的顺序将表组加载到一起。
同样,如果插入、更新或删除触发器存在于目标数据库中,则可能会导致错误。例如,由先前加载表上的插入触发器触发的行插入可能会导致重复行。其他类型的触发器也会影响性能,因为它们会增加处理量。
满负载和 CDC
对于满负载和 CDC 任务,最佳实践是在迁移开始之前删除所有二级对象。但是,必须在迁移的不同阶段对目标数据库应用二级对象。
审查满负载和 CDC 任务迁移的阶段,以及在哪个阶段应用特定的二级对象:
- 现有数据的满负载 - 在任务完成满负载后和应用捕获的缓存更改之前添加二级索引。
- 缓存更改的应用 - 在任务应用缓存的更改后添加外键(参照完整性约束)。
- 持续复制 - 在迁移完成后和应用程序割接之前创建触发器。
在进行满负载期间,您对正在加载的表执行的任何更改都将缓存。这些缓存的更改将在表的满负载完成时应用。满负载完成并应用缓存的更改后,目标表将保持事务一致性。然后,AWS DMS 将开始正在进行的复制阶段。有关此方面的更多信息,请参阅 AWS DMS 的简要视图。
要在迁移期间停止任务,请使用以下任务设置:
- 在应用缓存的更改之前,使用 StopTaskCachedChangesNotApplied 停止任务。
- 在应用缓存的更改后,使用 StopTaskCachedChangesApplied 停止任务。
**注意:**您可以使用 AWS 命令行界面 (AWS CLI) 同时启用 StopTaskCachedChangesNotApplied 和 StopTaskCachedChangesApplied。如果在运行 AWS CLI 命令时收到错误,请确保您使用的 AWS CLI 为最新版本。
仅限 CDC 的任务
对于仅限 CDC 的任务,可以在迁移之前于目标数据库上创建二级索引和外键。然后,在迁移完成后和应用程序割接之前,在目标上创建触发器。
相关信息
创建任务
满负载任务设置