【问题标题】:PostgreSQL 10 Logical Replication: Double entries or primary key conflictPostgreSQL 10 逻辑复制:双重条目或主键冲突
【发布时间】:2018-11-17 11:35:03
【问题描述】:

我已经使用 PostgreSQL 10 构建了一个主 -> 从设置,以将某些特定表中的数据同步到从机,这是公共系统。现在在整个过程中,我遇到了一些奇怪的行为:有些表根本不同步。

查看 PostgreSQL 日志我遇到了这些错误消息:

2018-06-07 15:28:30.163 CEST [4134] LOG:  worker process: logical replication worker for subscription 18249 sync 17956 (PID 6706) exited with exit code 1

2018-06-07 15:28:30.183 CEST [6707] ERROR:  duplicate key value violates unique constraint "producttext_pk"

2018-06-07 15:28:30.183 CEST [6707] DETAIL:  Key (id)=(100) already exists.

2018-06-07 15:28:30.183 CEST [6707] CONTEXT:  COPY producttext, line 1

为了进一步分析,我在从机上删除了这个表的主键,在这种情况下,错误不再发生,但是现在我在表中得到了重复的条目。

防止重复条目的唯一方法是设置主键,但是同步将无法工作,因为它一直在恰好循环四个表,永远不会移动到其余的表。

我已经检查了角色和所有者,并且设置正确。如前所述,如果没有主键,一切都会同步,不会引发错误,但会创建重复条目。

此时我可能错过了什么吗?非常感谢。

【问题讨论】:

    标签: postgresql postgresql-10 logical-replication


    【解决方案1】:

    您错过了您无法将行插入到备用数据库上的表中,这些行可能与从主数据库复制的 fows 冲突。

    如果您需要同时插入主数据库和备用数据库,您需要确保主键不冲突,例如只在一个上插入偶数 ID,在另一个上插入奇数 ID。

    【讨论】:

    • 嗨,我没有在备用数据库上插入行。这应该只是只读的。这就是为什么我无法在这里找出问题所在。
    • 那么你必须想出一个可重现的测试用例,因为这似乎是不可能的。
    • 这可以通过删除现有订阅并重新创建来复制。游戏开始复制整个现有数据。因此抛出主键违规错误。有没有办法从之前停止的位置继续复制?
    • @MSRS 仅当复制槽仍然存在或者您知道确切的 LSN 并且 WAL 仍然存在时。
    猜你喜欢
    • 2017-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多