[英]Sorting postgresql database dump (pg_dump)
我正在創建 pg_dumps、DUMP1 和 DUMP2。
DUMP1 和 DUMP2 完全相同,除了 DUMP2 以 DUMP1 的 REVERSE 順序轉儲。
無論如何,我可以對兩個 DUMPS 進行排序,以便兩個 DUMP 文件完全相同(使用差異時)?
我正在使用 PHP 和 linux。 我嘗試在 linux 中使用“排序”,但這不起作用......
謝謝!
根據您之前的問題,我假設您真正想做的是與數據庫進行比較,看看它們是否相同,包括數據。
正如我們在那里看到的, pg_dump 不會有確定性的行為。 一個文件與另一個文件相反的事實可能只是巧合。
這是一種可以進行包括架構和數據在內的總體比較的方法。
首先, 使用此方法比較模式。
其次,通過以一致的順序將數據全部轉儲到文件中來比較數據。 通過首先按名稱對表進行排序,然后按主鍵列對每個表中的數據進行排序來保證順序。
下面的查詢生成COPY
語句。
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 (select * from test order by a,b) to STDOUT;
將它們全部放在一個文本文件中,並通過 psql 為每個數據庫運行它們,然后比較輸出文件。 您可能需要將輸出設置調整為COPY
。
我的解決方案是為 pg_dump 輸出編寫一個自己的程序。 隨意下載PgDumpSort ,它按主鍵對轉儲進行排序。 java 默認內存為 512MB,每個表最多可以處理 1000 萬條記錄,因為記錄信息(主鍵值、文件偏移量)保存在內存中。
你使用這個小 Java 程序,例如
java -cp ./pgdumpsort.jar PgDumpSort db.sql
然后你得到一個名為“db-sorted.sql”的文件,或者指定輸出文件名:
java -cp ./pgdumpsort.jar PgDumpSort db.sql db-$(date +%F).sql
排序后的數據位於“db-2013-06-06.sql”之類的文件中
現在您可以使用 diff 創建補丁
diff --speed-large-files -uN db-2013-06-05.sql db-2013-06-06.sql >db-0506.diff
這允許您創建通常較小的增量備份。 要恢復文件,您必須使用補丁將補丁應用到原始文件
patch -p1 < db-0506.diff
(源代碼在 JAR 文件中)
解析轉儲可能不值得。
將 DUMP2 恢復到臨時數據庫並以正確的順序轉儲臨時數據庫會快得多。
如果
您可以按照如下確定的順序以 CSV 格式轉儲數據:
COPY (select * from your_table order by some_col) to stdout
with csv header delimiter ',';
參見復制 (9.5)
這是該問題的另一種解決方案: https : //github.com/tigra564/pgdump-sort
它允許對 DDL 和 DML 進行排序,包括將易失性值(如序列值)重置為一些規范值,以最小化由此產生的差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.