当 pg_dump 捕获完整备份时,如果我们有序列被更新,pg_dump 是否保证导出时序列值一致?详细来说,如果 pg_dump 需要一个小时才能运行,并且序列正在更新,那么序列值是否与 pg_dump 执行时一致,或者是 pg_dump 完成时的最新序列值?
我们尝试使用一个会话中设置的隔离级别,并更新另一个会话中的序列值。
开始事务隔离级别可串行化;
以上是从保持活动状态的会话中执行的。然后在另一个会话中,我们更新了序列。
在检查第一个会话时,我们注意到,在设置隔离级别时,从第二个会话更新的表没有获得最新的更改。但是,序列值是最新的。我们想要了解的是 pg_dump 是否会有相同的行为。
来自来源pg_dump:
pg_dump.c pg_dump 是一个用于转储 postgres 数据库的实用程序 到脚本文件中。
部分版权所有 (c) 1996-2023,PostgreSQL 全球开发小组 部分版权所有 (c) 1994,加州大学董事会
pg_dump 将读取数据库中的系统目录并转储出 以可理解的 SQL 形式重现模式的脚本 通过 PostgreSQL
注意pg_dump运行在事务快照模式事务中, 所以它看到数据库的一致快照,包括系统 目录。然而,它部分依赖于各种专门的后端 像 pg_get_indexdef() 这样的函数,这些东西往往会看 当前提交的状态。所以有可能获得'缓存 如果有人在转储时执行 DDL 更改,则会出现“查找失败”错误 正在发生。这类事情的窗口来自于收购 事务快照的 getSchemaData() (当 pg_dump 获取 AccessShareLock 在它打算转储的每个表上)。面积不是很大, 但这有可能发生。
http://archives.postgresql.org/pgsql-bugs/2010-02/msg00187.php
这意味着 pg_dump 在开始操作时会拍摄数据库状态的快照。这就是被抛弃的东西。快照之后发生的操作是未来的操作,不会保存在转储中。