PostgreSQL 中的一个 Identity 列足以实现逻辑复制吗?

问题描述 投票:0回答:1

我在 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);
postgresql database-replication aws-dms
1个回答
0
投票

是的,身份列可以用作 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 配置逻辑复制时,标识列应包含在复制过程中。

© www.soinside.com 2019 - 2024. All rights reserved.