Postgresql

如何將舊的 pgdump 導入到更新的架構中?

  • May 24, 2019

我是 DB 新手,正在做軟體升級,我前任最初的遷移計劃可能沒有我想的那麼深思熟慮……

計劃是使用我們的備份,通過

pg_dump -U derp -h db-host -Fc derp > backup

使用升級後的軟體刷新乾淨的虛擬機,並使用其精美的新架構和使用

pg_restore -v -U derp -n public -c -1 -h db-host -d derp backup

用所有花哨的舊數據載入它。

不幸的是,由於更新的架構,我遇到了錯誤,新列創建了新的關係。“不能在表 Y 上刪除約束 X,因為其他對象依賴於它”

我嘗試使用 -a (僅限數據)但很快失敗,因為現在有許多查找表具有重複的鍵。

我可以以某種方式導入現有副本嗎?

如果沒有,我能否以允許舊轉儲工作的方式更改新的數據庫模式?

如果沒有……我可以製作一個不同的、更有用的舊數據庫副本嗎?

如果我問的是非常愚蠢的問題,我應該問什麼?

聽起來您正在處理一些第 3 方的應用程序。換句話說,應用程序供應商和你的前任不是同一個人。

第 3 方通常會為您提供兩件事,一個供新客戶使用的安裝程序,以及一個為現有客戶在其應用程序版本之間升級架構的升級過程。您要麼需要使用其中一個,要麼需要使用另一個,而不是它們之間的某種混蛋組合。在新客戶的新初始化模式的頂部恢復舊模式+數據的轉儲預計不會起作用,除非供應商表示這樣做。

供應商還可能會提供有關如何升級 PostgreSQL 版本的說明,無論是單獨升級還是與升級應用程序版本一起升級。如果他們這樣做,然後找到並按照這些說明進行操作。如果他們不這樣做,那麼您有幾個選擇。

  • 回到使用舊數據庫。針對它執行升級腳本。擔心稍後將其遷移到新的數據庫伺服器。
  • 創建一個空的數據庫集群(完全空,不使用供應商的新客戶初始化東西)並恢復到該數據庫集群。最簡單的方法可能是對 pg_restore 使用“-C”(注意大寫)標誌。這將為您創建新的數據庫,其名稱、編碼等都記錄在 dmp 文件中。或者,也許您只是使用現有集群(使用應用程序供應商新客戶模式初始化)並將 -C 標誌添加到您的還原中。這將做的是刪除他們批量提供的數據庫(這將解決依賴問題)並從轉儲文件中的內容重新創建它,這意味著您獲得的是舊模式而不是新模式。無論哪種方式,您現在都將在新的 PostgreSQL 數據庫中執行舊的應用程序模式。一旦這個工作,
  • 詢問第 3 方應用供應商該怎麼做。

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