postgresql – Postgres序列不同步

postgresql – Postgres序列不同步,第1张

概述我正在使用bucardo和postgres运行多主设置. 我发现我的一些表序列彼此不同步.特别是自动增加的id. 例: db1 – table1 INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets') 新行的ID为1 db2 – table1 INSERT INTO distributors (did, dname 我正在使用bucardo和postgres运行多主设置.

我发现我的一些表序列彼此不同步.特别是自动增加的ID.

例:

db1 – table1

INSERT INTO distributors (dID,dname) VALUES (DEFAulT,'XYZ Widgets')

新行的ID为1

db2 – table1

INSERT INTO distributors (dID,'XYZ Widgets')

新行的ID为1

db2上新行的ID应为2,因为bucardo已从db1复制数据,但db2的自动增量基于:

nextval('oauth_sessions_ID_seq'::regclass)

如果我们检查“oauth_sessions_ID_seq”,我们会将最后一个值视为0.

phew ……有道理吗?

无论如何,我可以做以下任何一项吗?

>使用bucardo复制会话表,以便共享每个数据库的会话?
> *** 纵上面的默认自动增量功能,以考虑表中最大的现有项目?

如果您有任何更好的想法,请随时将它们扔进去.问题只是问,感谢您的帮助.

解决方法 您将不得不更改您的ID生成方法,因为根据FAQ中的此注释没有Bucardo解决方案.

Can Bucardo replicate DDL?

No,Bucardo relIEs on triggers,and Postgres does not yet provIDe DDL
triggers or triggers on its system tables.

由于Bucardo使用触发器,因此它不能“看到”序列更改,只能“查看”表中的数据,它会复制.序列是不支持触发器的有趣对象,但您可以手动更新它们.我想你可以在INSERT之前添加类似下面的代码,但仍然可能存在问题.

SELECT setval('oauth_sessions_ID_seq',(SELECT MAX(dID) FROM distributors));

有关更多信息,请参见this question.

我没有完全了解所涉及的所有问题,但您可以手动执行最大计算并在重试循环中执行插入 *** 作.我怀疑如果你实际上在两个数据库上插入并允许Bucardo复制,它会起作用,但是如果你能保证一次只更新一个数据库,那么你可以尝试类似UPSERT重试循环的东西.有关详细信息,请参阅this post.循环的“胆量”可能如下所示:

INSERT INTO  distributors (dID,dname)     VALUES ((SELECT max(dID)+1 FROM distributors),'XYZ Widgets');
总结

以上是内存溢出为你收集整理的postgresql – Postgres序列不同步全部内容,希望文章能够帮你解决postgresql – Postgres序列不同步所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1158042.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存