postgresql 如何在Postgres复制插槽中使用导出的快照

mwecs4sa  于 2023-05-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(186)

在创建postgres逻辑复制插槽时,我使用了here中记录的EXPORT_SNAPSHOT选项。文档指出,默认情况下,“导出”将导出快照以供其他会话使用。此选项不能在事务中使用...'
但是,当我尝试使用SET TRANSACTION SNAPSHOT命令从另一个事务导出的快照时,我总是得到invalid snapshot identifier错误。
有一个导出快照选项明确声明它不应该在一个事务中使用(因此我们无法控制它何时提交),但我们不能在另一个事务中使用导出的快照(正是因为我们无法控制create_replication_slot何时提交,并且当我们尝试使用它时,该快照可能已经被清除),这不是矛盾吗?
ps:我想要实现的是在实际启动逻辑复制之前,在创建复制插槽之前,使用导出的快照复制表数据。

s3fp2yjn

s3fp2yjn1#

以下是我所做的工作,仅供参考:

  • 创建复制插槽时,默认情况下将导出快照。该create_replication_slot命令不能在事务内。导出的快照具有“可重复读取”隔离级别,似乎无法更改。保持连接而不执行任何其他命令。
  • 一旦您从create replication slot结果中获得了快照名称(如“00000004- 000003 B 9 -1”),您就可以在另一个连接上开始另一个事务,并且事务中的第一个语句必须是SET TRANSACTION SNAPSHOT <snapshot_name>,这是您从上面的create_replication_slot命令中获得的。
  • 请注意,在第二个连接上启动快照使用事务之前,不得关闭第一个连接,也不得执行其他命令。否则,快照将不再有效。

相关问题