2014-06-25 105 views
17

我已經使用pg_dump以「自定義」格式(-Fc)創建了數據庫轉儲。這種格式允許使用「作業」選項(-j8)調用pg_restore。作業選項啓動8個進程,並在10分鐘內恢復我數據庫中的絕大多數關係。如何防止物化視圖在pg_restore期間刷新?

我剩下4個進程。其中一個是物化視圖的刷新,另外三個是應用於物化視圖用作數據源的3個表的索引。索引根據pg_stat_activity「等待」,可能是因爲物化視圖的REFRESH仍在訪問源表。

當索引到位時,視圖的刷新只需要幾分鐘。由於在REFRESH期間索引不存在,我在17小時關閉了REFRESH進程,導致pg_restore失敗。

我怎樣才能

  1. 力使指數獲得創建第一
  2. 關閉物化視圖的刷新和做手工後
  3. 操縱自定義格式轉儲文件的項目順序說「沒有數據」
  4. 攔截REFRESH MATERIALIZED VIEW語句並在垃圾桶扔

還是其他可以完成工作的解決方案?

+3

請報告這個問題儘快在pgsql-hackers郵件列表中。鏈接到這個問題,但也描述了這個問題。如果方便的話,通過archives.postgresql.org鏈接到您的帖子將會很棒。 –

+0

好的,做到了。感謝您的建議。 –

回答

15

David G Johnston posted an answer for me on the pgsql-hackers mailing list

「有/你可以試試 '-l(EL)& -L' 選項pg_restore的?

http://www.postgresql.org/docs/9.3/static/app-pgrestore.html

(例如使用的是朝向頁面底部)

基本上重新命令命令序列,以便儘可能晚地運行 ,或者完全禁用它。

應該教導pg_dump/pg_restore更好地處理這個是主要的原因爲什麼克雷格你在這裏盡​​快發佈,但要獲得它現在的功能 手動干預將是必要的。從理論上來說,「上市」的能力 應該讓你做你需要什麼「

我認爲這(pg_restore的-l | pg_restore的-L)。將得到我在哪裏,我需要通過插入一個小的shell 去現在腳本之間,推動 物化視圖到列表的末尾,但我也將不得不 管理我自己的依賴關係爲我重新排序項目(MatViews的 MatViews)。 這非常嚴重限制了有用性對於我來說物化視圖 對於9.3.x版本,我可能需要MatView依賴項不超過 1深。

編輯: 要停止對物化的數據恢復,我開始做這個:

pg_dump mydatabase -Fd backup_dir 
pg_restore -l -Fd backup_dir | sed '/MATERIALIZED VIEW DATA/d' > ordered.lst 
pg_restore -L ordered.lst -Fd backup_dir mydatabase 

這消除了從恢復REFRESH MATERIALIZED VIEW語句。 感謝David G Johnston的提示。

1

一種解決方法,你可以試試。

也許你可以在單獨的架構中創建MatViews,專用於它們。 爲了向後兼容性您可以使用同義詞。

pg_restore只能在架構中使用。

+0

這可能會更有用*從主pg_dump中排除mat視圖的模式,並在單獨的步驟中將其轉儲。但是,這個兩步驟的過程需要改造旨在爲多個數據庫提供服務的備份腳本。 –

+0

的確,我希望他們能修復pg_restore。 :) – Aret

3

作爲附錄接受的答案,一旦所有的指標已經完成和/或你已經運行分析一下,就可以使用刷新正確(依賴)爲了物化視圖:

pg_restore -l -Fd backup_dir | grep 'MATERIALIZED VIEW DATA' > refresh.lst 
pg_restore -L refresh.lst -Fd backup_dir mydatabase