Postgresql

pg_restore 失敗並在標識列上刪除預設值

  • March 12, 2022

試圖通過 pg_restore 恢復 Postgres 10.6 數據庫,它似乎想要在清理階段DROP DEFAULT應該做的時候做一個。DROP IDENTITY見下文:

pg_restore --verbose --format=custom --dbname=bosh --clean --if-exists --single-transaction --exit-on-error

pg_restore: dropping TABLE DATA cpi_configs
pg_restore: dropping TABLE DATA configs
pg_restore: dropping TABLE DATA compiled_packages
pg_restore: dropping TABLE DATA cloud_configs
pg_restore: dropping TABLE DATA blobs
pg_restore: dropping TABLE DATA agent_dns_versions
pg_restore: dropping DEFAULT vms id
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2493; 2604 16496 DEFAULT vms id postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  column "id" of relation "vms" is an identity column
HINT:  Use ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY instead.
   Command was: ALTER TABLE IF EXISTS public.vms ALTER COLUMN id DROP DEFAULT;

我將其作為自動化實用程序的一部分執行,其中更改命令並非易事。我能想到的最好的解決方法是使用-C刪除/創建數據庫pg_restore,但這是要歸檔的錯誤還是我們可以用不同的方法做的事情pg_dump

這看起來像是一個不幸的巧合--clean和一個現有的表。

轉儲包含列預設定義,因此--clean在恢復之前嘗試刪除預設值。這不適用於標識列。

知道您轉儲的數據庫中的相應列是如何定義的會很有趣。它DEFAULT有價值嗎?

有人可能會爭辯說,“放棄預設”應該包括擺脫身份列;如果您有這種感覺,您可以向 PostgreSQL 黑客郵件列表提出投訴。應該可以進行相應的修改pg_restore,但我想知道是否值得付出努力。

我看到以下內容,這與原始文章一致:

  1. 安裝 postgres 9.4,用SEQUENCEs 為 id 列創建表
  2. 升級到 postgres 10.4,執行pg_upgrade
  3. pg_dump``pg_restore反對10.4是可以的
  4. 升級到postgres 10.9,執行pg_upgrade成功
  5. pg_dumppg_restore原帖一樣。同類型的錯誤。

實際上,有問題的數據庫是https://github.com/cloudfoundry/bosh數據庫。遵循上述升級路徑時,bosh 的使用者會看到此問題。從 OP 來看,問題似乎也始於 10.6。

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