我在 AWS RDS 上有一个未分区的 PostgreSQL 表
A
。我想将数据迁移到由 B
分区的 hash(user_id)
。
表
A
没有任何PK或唯一索引。
我使用 AWS DMS 来执行此任务。 DMS 提供带有 CDC 的满载或使用逻辑复制的持续复制。
对于 Postgres 来说,逻辑复制需要 PK 或唯一索引。
因为我有一个分区表,所以我必须有复合 PK/Unqique 索引,它总是有
user_id
作为其中的一部分,我想避免这种情况。
我正在考虑在
A
上创建一个身份列,并在 B
上创建相同的身份列。
但是,我不确定
Identity Column
是否适用于逻辑复制。
这是表格,
CREATE TABLE A_source (
user_id text NULL,
agency text NULL,
"location" text NULL,
id bigint generated always as identity
);
CREATE TABLE B_target (
user_id text NULL,
agency text NULL,
"location" text NULL,
id bigint generated always as identity
)
PARTITION BY HASH (user_id);
CREATE TABLE B_target_1 PARTITION OF B_target
FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE B_target_2 PARTITION OF B_target
FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE B_target_3 PARTITION OF B_target
FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE B_target_4 PARTITION OF B_target
FOR VALUES WITH (MODULUS 4, REMAINDER 3);
是的,身份列可以用作 postgres 中逻辑复制的主列。可以在源表和目标表中创建标识列。尝试使用此代码;
-- Source Table A
CREATE TABLE A_source (
user_id text NULL,
agency text NULL,
"location" text NULL,
id bigint generated always as identity
);
-- Target Table B (Partitioned)
CREATE TABLE B_target (
user_id text NULL,
agency text NULL,
"location" text NULL,
id bigint generated always as identity
) PARTITION BY HASH (user_id);
为了数据完整性,请确保每个分区内的标识列值是不同的。使用 AWS DMS 配置逻辑复制时,标识列应包含在复制过程中。