Postgresql

如何在沒有 CREATE INDEX 的情況下恢復 pg_dumpall 轉儲?

  • November 20, 2020

我正在嘗試從 Postgres 9.6 遷移到 10.3,並且在還原期間每個索引都被一一重新創建 - 這是一個問題。

到目前為止,我認為pg_dumpall是一個不錯的選擇。

pg_dumpall -U postgres -h localhost -p 5432 --clean --file=dumpall_clean.sql

完成此操作後,文件大小約為 1.2TB,我可以將其載入到新的 10.3 實例中

psql -U postgres -h localhost -p 5433 < dumpall_clean.sql

簡單的。

問題

據我了解,索引不像表格那樣備份,它們只是重新創建,這是我的問題。

該集群有數千個分區,每個分區有幾百萬行和兩個索引(一個 BTREE 和一個 GIST)。這需要幾天*,*因為每個索引都是一個一個創建的。

由於我有足夠的資源並且我知道必須創建哪些索引,因此我更願意在轉儲恢復後執行此步驟。最初我做了 8 個 FOR 循環(並行執行)來遍歷分區,並通過將分區移動到更快的表空間 (SSD) 創建索引,創建索引,然後將表和索引移回預設表空間. 到目前為止,這對我有用。

問題pg_dumpall在載入文件時如何在不重新創建索引的情況下 獲得相同的轉儲結果* dumpall_clean.sql?Apg_dumpall --without-index會很好。

“這目前包括有關數據庫使用者和組、表空間和屬性的資訊,例如適用於整個數據庫的訪問權限。” - pg_dumpall 手冊

通過pg_dumpall分兩步使用,我可以看到一種解決方法:

pg_dumpall --schema-only ....

然後編輯該文件並將索引定義提取到第二個文件中。您還需要提取外鍵,因為您必須在導入後手動執行它們(可能與索引創建腳本一起)

然後執行該腳本(沒有索引)來創建(空)表。你

pg_dumpall --data-only ....

然後執行該腳本將數據導入新數據庫。之後執行 FK 和索引創建腳本。

這已經有一段時間了,但我們需要在我們的恢復中做這樣的事情。找到這個答案實際上讓我意識到我可以使用這樣的東西通過減少索引創建來加速我目前的恢復:)

您可以使用 pg_restore 的 -l 和 -L 標誌來列出操作並使用操作列表。

從我在腳本中的筆記中:

   # pg_restore -l gives a list of all operations that would be performed during the restore.
   # pg_restore -L accepts a list of operations from file to perform during the restore.

因此,您可以使用 -l 從現有轉儲中轉儲操作列表,對其進行過濾,然後再次使用 -L 執行以接受新過濾的操作列表。

在實踐中,它看起來像:

   ${PGRESTORE} --dbname=db_restore -Fc -l dump_filename \
       | grep -v "public view_we_dont_want" \
       | grep -v "public postgres" >${tmpFile}
   ${PGRESTORE} --dbname=db_restore -Fc -L ${tmpFile} dump_filename

引用自:https://dba.stackexchange.com/questions/204490