如何查询postgres自指定时间点(时间戳或事务ID)以来的增量更新?[英] How to query postgres incremental updates since a specified point (a timestamp or a transaction id)?

本文是小编为大家收集整理的关于如何查询postgres自指定时间点(时间戳或事务ID)以来的增量更新?的处理方法,想解了如何查询postgres自指定时间点(时间戳或事务ID)以来的增量更新?的问题怎么解决?如何查询postgres自指定时间点(时间戳或事务ID)以来的增量更新?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我希望能够找出 postgresql 表的增量更改.

我知道我可以使用时间戳方法:添加一个时间戳列,当一行更新时,我可以用它保存一个时间戳,然后可以查询在指定时间戳之后更改的行.由于某种原因,数据库触发器对我来说不是一个选项,如果不使用数据库触发器,我必须在 Web 服务器上生成时间戳,这需要使用 NTP 来控制服务器之间的时间容差,这也不是一个选项对我来说,因为我无法控制服务器.

所以我转向另一个解决方案:选择在指定事务 ID 之后修改的行.在 Postgres 中,txid_current() 可以返回当前事务 id,我可以通过 sql "select * from table_name where xmin > {transaction_id}" 获取增量更新.

经过一些简单的测试,我发现它有效.一个已知问题是事务 id 会随着时间的推移而增长,并且有一天需要由 postgres 重置,但我正在考虑在事务 id 接近最大值时暂时禁用增量更新功能并在重置后重新启用它完成了.

问题是:我不确定是否可以可靠地使用事务 ID 和 xmin 来检测增量更改(已知的事务 ID 溢出/重置问题除外).

感谢您对增量更新的任何建议.也许还有其他一些方法可以查询增量更新.

推荐答案

你真正想要的是 PostgreSQL 9.4 的 逻辑解码 支持,让您可以从服务器中提取更改流.要使用它,您需要一个逻辑解码插件,将服务器上的更改流转换为您的应用程序可以使用的东西.有一些正在开发中,但还为时过早.

由于您在评论中指出您正在使用 AWS RDS,所以此时您很不走运,因为 RDS 在撰写本文时不提供任何解码插件,您需要超级用户权限才能安装它们.

你不能使用 xmin 和 xmax 进行完整的增量复制,因为你不能在 PostgreSQL 中做脏读,所以你不能看到一个元组是否已经被 DELETEd 了.要使用事务 ID,您需要防止 VACUUM 删除"死"行,即没有当前事务仍需要正确执行的行.您还需要能够进行脏读.这些在 PostgreSQL 中都没有简单的解决方案.

如果您有仅插入表(或者您执行插入和更新、从不删除、从不更改行的主键),那么您可以使用事务 xmin.您必须通过检查 transaction-id wraparound 来处理 transaction-id wraparoundc2> 和 pg_class.relfrozenxid 用于感兴趣的关系.详情见源代码和代码中的注释.VACUUM 如果您从不删除条目,那么缺少脏读也不是问题,因为您不需要看到"消失"的行.

如果可能,请在 9.4+ 中使用逻辑解码.对于旧版本,如果您需要完全复制,则需要累积一个带有触发器的更改队列.

如果您可以完全禁止删除和主键更改,则可以使用 xmin 查找更改的行,只要您注意确保没有 delete 运行或任何 update 更改 primary keys.

本文地址:https://www.itbaoku.cn/post/1764021.html