Postgres pg_dump每次都以不同的顺序转储数据库

2022-08-30 19:03:14

我正在编写一个PHP脚本(它也使用linux bash命令),它将通过执行以下操作来运行测试用例:

我正在使用PostgreSQL数据库(8.4.2)...

1.) 创建一个数据库 2。修改 DB 3。存储数据库的数据库转储(pg_dump)

4.) 通过执行步骤 1 进行回归测试。和 2.),然后获取另一个数据库转储并将其 (diff) 与步骤 3 中的原始数据库转储进行比较。

但是,我发现pg_dump并不总是以相同的方式转储数据库。它每次都会以不同的顺序转储东西。因此,当我对两个数据库转储进行比较时,比较将导致两个文件不同,而它们实际上是相同的,只是顺序不同。

有没有其他方法可以进行pg_dump?

谢谢!


答案 1

下面是一个用于预处理输出的方便脚本,使其更适合在版本控制中进行比较和存储:pg_dump

https://github.com/akaihola/pgtricks

pg_dump_splitsort.py将转储拆分为以下文件:

  • 0000_prologue.sql:直到第一个副本的所有内容
  • 0001_<schema>.<table>.sql
    .

    按第一个字段排序的每个表的数据NNNN_<schema>.<table>.sql
  • 9999_epilogue.sql:最后一次复制后的所有内容

表数据的文件已编号,因此可以使用所有文件的简单排序串联来重新创建数据库:

$ cat *.sql | psql <database>

我发现快速查看转储之间差异的一个好方法是在整个目录上使用该工具:meld

$ meld old-dump/ new-dump/

将转储存储在版本控制中也可以很好地了解差异。下面介绍如何将 git 配置为在差异中使用颜色:

# ~/.gitconfig
[color]
        diff = true
[color "diff"]
        frag = white blue bold
        meta = white green bold
        commit = white red bold

注意:如果已创建/删除/重命名表,请记住在对新转储进行后处理之前删除所有文件。.sql


答案 2

这里值得区分架构和数据。架构以相当确定的顺序转储,大多数对象按字母顺序排列,受对象间依赖关系的约束。在一些有限的情况下,顺序没有完全约束,并且可能对外部观察者来说看起来是随机的,但这可能会在下一个版本中得到解决。

另一方面,数据按磁盘顺序转储。这通常是您想要的,因为您希望转储速度快,而不是使用大量的资源来进行排序。您可能观察到的是,当您“修改数据库”时,您正在执行UPDATE,这实际上将删除旧值并在最后附加新值。这当然会打乱你的差异策略。

可能更适合您目的的工具是pg_comparator


推荐