我有一个postgres-10数据库,其中存储了一组节点和父子边缘,这些数据库是通过新的逻辑复制功能发布的。
CREATE TABLE "node"
(
id BIGSERIAL CONSTRAINT node_pkey PRIMARY KEY,
//...
created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT (now()),
modified TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT (now())
);
CREATE TABLE "edge" (
id BIGSERIAL CONSTRAINT edge_pkey PRIMARY KEY,
parent_id BIGINT NOT NULL CONSTRAINT edge__parent REFERENCES node ON DELETE CASCADE,
child_id BIGINT NOT NULL CONSTRAINT edge__child REFERENCES node ON DELETE CASCADE
/* This bad boy ruining everything :-( */
/* CONSTRAINT no_loops_allowed CHECK (parent_id <> child_id) */
);
在某个时候,一个客户端进程开始向子级和父级是同一节点的图形中添加一堆循环!而且我们完全不喜欢这种行为的影响,并希望在数据库级别将其阻止。
这是混乱的地方。如果我们用新的约束建立一个新的订户数据库,它将很难失败,从而破坏我们的复制槽和所有订阅(订户数据库和发布数据库都在同一服务器上)。由于数据库不同步,我们的pg_wal变得疯狂,以每天100GB左右的速度扩展(ew)。
我可以在没有约束的情况下建立新数据库并开始复制而不会出现问题,甚至可以重新添加约束。但是,由于问题产生的客户端数据库,我无法重新创建订阅并捕获丢失的事务从一切都崩溃了。是否有人建议重新导入所有丢失的更改的最佳方法?