我正在创建pg_dumps,DUMP1和DUMP2.
DUMP1和DUMP2完全相同,只是DUMP2以DUMP1的REVERSE顺序转储.
无论如何,我可以对两个DUMPS进行排序,以便两个DUMP文件完全相同(使用diff时)?
我正在使用PHP和Linux.我尝试在linux中使用“排序”,但这不起作用……
谢谢!
解决方法:
From your previous question,我假设您真正想要做的是与数据库进行比较,以确定它们是否相同,包括数据.
As we saw there,pg_dump不会有确定性的行为.一个文件与另一个文件相反的事实可能只是巧合.
首先,比较模式using this method.
其次,通过将数据全部转储到文件中来比较数据,并保持一致的顺序.通过首先按名称对表进行排序,然后通过主键列对每个表中的数据进行排序来保证顺序.
select
'copy (select * from '||r.relname||' order by '||
array_to_string(array_agg(a.attname), ',')||
') to STDOUT;'
from
pg_class r,
pg_constraint c,
pg_attribute a
where
r.oid = c.conrelid
and r.oid = a.attrelid
and a.attnum = ANY(conkey)
and contype = 'p'
and relkind = 'r'
group by
r.relname
order by
r.relname
运行该查询将为您提供一个语句列表,例如copy(从a,b的测试顺序中选择*)到STDOUT;将这些全部放在一个文本文件中,并通过psql为每个数据库运行它们,然后比较输出文件.您可能需要使用output settings to COPY
进行调整.