如何在 AWS DMS 任务中迁移没有主键的表以进行 CDC 复制和验证?
当我使用没有主键的表时,我在执行更改数据捕获 (CDC) 复制和验证的 AWS Database Migration Service (AWS DMS) 任务时遇到了问题。
解决方法
迁移 Oracle 源表
如果您迁移的 Oracle 源表没有主键,则必须启用补充日志记录以捕获 CDC 操作的列数据。
在表级别配置补充日志记录之前,请运行以下命令在 Oracle 源数据库上启用数据库级补充日志记录:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
确认您对要迁移的表具有 ALTER 权限。
要授予权限,请运行以下命令:
GRANT ALTER ANY TABLE to dms_user
要在表中的列子集上添加补充日志记录并包含唯一索引,请运行以下命令:
ALTER TABLE table_name ADD SUPPLEMENTAL LOG GROUP example_log_group (UniqueIndexColumn1, UniqueIndexColumn2) ALWAYS;
**注意:**将 table_name 替换为您的表名,将 example_log_group 替换为您的日志组名称,将 UniqueIndexColumn1 和 UniqueIndexColumn2 替换为您的唯一索引列名称。
要为表列添加补充日志记录,请运行以下命令:
ALTER TABLE table_name ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
**注意:**如果您在表上启用 (ALL) COLUMNS 补充日志记录,则无需为该表添加补充日志记录。
要让 AWS DMS 自动管理补充日志记录,请运行以下命令向 Oracle 源端点配置添加额外连接属性 (ECA):
addSupplementalLogging=true ;
迁移 SQL Server 源表
要捕获没有主键的 Microsoft SQL Server 表的更改,必须在数据库级别为每个表激活 MS-CDC。如果您没有为数据库配置 MS-REPLICATION 或 MS-CDC,则 AWS DMS 仅捕获 INSERT/DELETE DML 事件。
要在 SQL Server 数据库上查找没有主键或唯一键的表,请运行以下 SQL 查询:
USE [DBname] SELECT SCHEMA_NAME(schema_id) AS schema_name, name AS table_name FROM sys.tables WHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') = 0 AND OBJECTPROPERTY(object_id, 'TableHasUniqueCnst') = 0 ORDER BY schema_name, table_name;
**注意:**将 DBname 替换为您的数据库名称,将 schema_id 替换为您的架构 ID,将 schema_name 替换为您的架构名称。此外,将 table_name 替换为您的表名,将 object_id 替换为您的对象 ID。
如果您没有使用只读副本,那么 AWS DMS 版本 3.4.7 及更高版本会自动为您的数据库和表配置 MS-CDC。
迁移 PostgreSQL 源表
对于没有主键的 PostgreSQL 源表,请将 REPLICA IDENTITY 表级参数设置为 FULL,然后捕获必要的行信息。在将 REPLICA IDENTITY 设置为 FULL 之前,最佳做法是查看您的要求,因为该参数会生成额外的预写日志记录 (WAL) 条目。
或者,您可以在 PostgreSQL 数据库上运行以下 SQL 查询:
ALTER TABLE schema_name.table_name REPLICA IDENTITY FULL;
**注意:**将 schema_name 替换为您的架构名称,将 table_name 替换为您的表名。
AWS DMS 支持将 REPLICA IDENTITY 设置为 FULL 并使用逻辑解码插件,但不支持 pglogical 插件。有关该参数的更多信息,请参阅 PostgreSQL 网站上的 REPLICA IDENTITY。
迁移 MySQL 源表
没有主键或唯一索引的 MySQL 源表可能会导致 CDC 复制速度缓慢或 CDC 故障。为防止这些问题,请向 MySQL 源表添加主键或唯一索引。
要添加主键,请运行以下命令:
ALTER TABLE table_name ADD COLUMN id BIGINT AUTO_INCREMENT PRIMARY KEY;
**注意:**将 table_name 替换为您的表名。
要添加唯一索引,请运行以下命令:
CREATE UNIQUE INDEX idx_unique ON table_name (column1, column2);
**注意:**将 idx_unique 替换为您的唯一 ID,将 table_name 替换为您的表名。
排查验证错误
有效主键或唯一索引
AWS DMS 任务验证要求源表和目标表上都具备有效主键或唯一索引。如果 AWS DMS 无法识别键,则验证失败,您会收到以下错误消息:
"No eligible primary/unique key found."
要解决此问题,请在表中创建主键或添加唯一索引约束。
要创建主键,请运行以下命令:
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
**注意:**将 table_name 替换为您的表名,将 column_name 替换为您的列名。
要添加唯一索引约束,请运行以下命令:
ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (column_name);
**注意:**将 table_name 替换为您的表名,将 column_name 替换为您的列名。
如果您无法添加主键或唯一索引,则创建一个新的仅验证任务,该任务仅包含带有主键的表。使用表映射来显式选择具有有效主键的表。
JSON 示例:
{ "rules": [ { "rule-type": "selection", "rule-id": "1", "rule-name": "select-tables-with-pk", "object-locator": { "schema-name": "your_schema", "table-name": "table_with_pk" }, "rule-action": "include" } ] }
**注意:**将 your_schema 替换为您的架构名称。
或者,您可以对没有主键的表手动执行验证。要比较源和目标之间的行数或校验和,请使用自定义 SQL 查询。
分区表
如果您将分区表迁移到 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版,请确保在唯一索引中包含分区键列。PostgreSQL 不支持全局唯一索引。要在分区之间强制唯一性,请确保将分区键设置为唯一约束的一部分。如果唯一索引不包含分区列,则 AWS DMS 验证失败,您会收到以下错误消息:
"No eligible primary/unique key found"
要使用分区列创建唯一索引,请运行以下命令:
CREATE UNIQUE INDEX index_name ON schema.table_name (unique_column1, unique_column2, partition_key_column);
**注意:**将 index_name 替换为您的索引名称,将 schema 替换为您的架构名称,将 table_name 替换为您的表名,将 unique_column1、unique_column2、partition_key_column 替换为您的列名。
- 语言
- 中文 (简体)
