跳至内容

如何在 AWS DMS 任务中迁移没有主键的表以进行 CDC 复制和验证?

2 分钟阅读
0

当我使用没有主键的表时,我在执行更改数据捕获 (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 替换为您的日志组名称,将 UniqueIndexColumn1UniqueIndexColumn2 替换为您的唯一索引列名称。

要为表列添加补充日志记录,请运行以下命令:

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-REPLICATIONMS-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_column1unique_column2partition_key_column 替换为您的列名。

AWS 官方已更新 7 个月前