簡體   English   中英

排序 postgresql 數據庫轉儲 (pg_dump)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM