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

lit*_*leK 17 php database linux postgresql dump

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

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

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

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

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

我可以采用不同的方式来做pg_dump吗?

谢谢!

aka*_*ola 14

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

https://github.com/akaihola/pgtricks

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

  • 0000_prologue.sql:一切都是第一次COPY
  • 0001_<schema>.<table>.sql
    .
    .
    NNNN_<schema>.<table>.sql:按第一个字段排序的每个表的数据
  • 9999_epilogue.sql:上一次COPY之后的所有内容

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

$ cat *.sql | psql <database>
Run Code Online (Sandbox Code Playgroud)

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

$ meld old-dump/ new-dump/
Run Code Online (Sandbox Code Playgroud)

在版本控制中存储转储也可以很好地查看差异.以下是如何配置git以在diffs中使用颜色:

# ~/.gitconfig
[color]
        diff = true
[color "diff"]
        frag = white blue bold
        meta = white green bold
        commit = white red bold
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*aut 11

这里值得区分模式和数据.模式以相当确定的顺序转储,大多数对象按字母顺序排列,受到对象间依赖性的约束.在一些有限的情况下,订单没有完全约束,并且可能对外部观察者来说是随机的,但可能会在下一个版本中得到修复.

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

pg_comparator可能更适合您的工具.


Tom*_*zky 9

不可能强制pg_dump以任何特定顺序转储数据,因为它以磁盘顺序转储数据 - 这种方式要快得多.

您可以为pg_dump使用"-a -d"选项然后"排序"输出,但数据中的换行将使排序的输出无法使用.但是对于基本的比较,无论是否有任何改变,都足够了.