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:一切都是第一次COPY0001_<schema>.<table>.sqlNNNN_<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可能更适合您的工具.
不可能强制pg_dump以任何特定顺序转储数据,因为它以磁盘顺序转储数据 - 这种方式要快得多.
您可以为pg_dump使用"-a -d"选项然后"排序"输出,但数据中的换行将使排序的输出无法使用.但是对于基本的比较,无论是否有任何改变,都足够了.
| 归档时间: |
|
| 查看次数: |
11005 次 |
| 最近记录: |