首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Postgres pg_dump每次都会以不同的顺序转储数据库

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

Stack Overflow用户
提问于 2010-02-02 02:04:47
回答 7查看 14.9K关注 0票数 20

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

我使用的是PostgreSQL数据库(8.4.2)...

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

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

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

有没有其他方法可以让我开始做pg_dump?

谢谢!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-02-02 03:02:55

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

您可以对pg_dump使用"-a -d“选项,然后对输出进行”排序“,但是数据中的换行符将使排序后的输出不可用。但对于基本的比较,无论有什么变化,都足够了。

票数 9
EN

Stack Overflow用户

发布于 2010-04-22 15:00:22

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

https://github.com/akaihola/pgtricks

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

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

NNNN_<schema>.<table>.sql:每个表的数据,按first field

  • 9999_epilogue.sql:最后一次拷贝后的所有内容排序

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

代码语言:javascript
运行
复制
$ cat *.sql | psql <database>

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

代码语言:javascript
运行
复制
$ meld old-dump/ new-dump/

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

代码语言:javascript
运行
复制
# ~/.gitconfig
[color]
        diff = true
[color "diff"]
        frag = white blue bold
        meta = white green bold
        commit = white red bold

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

票数 15
EN

Stack Overflow用户

发布于 2010-02-02 03:16:39

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

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

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

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2178907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档