Postgresql
pg_restore 失敗並在標識列上刪除預設值
試圖通過 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
,但我想知道是否值得付出努力。
我看到以下內容,這與原始文章一致:
- 安裝 postgres 9.4,用
SEQUENCE
s 為 id 列創建表- 升級到 postgres 10.4,執行
pg_upgrade
pg_dump``pg_restore
反對10.4是可以的- 升級到postgres 10.9,執行
pg_upgrade
成功pg_dump
和pg_restore
原帖一樣。同類型的錯誤。實際上,有問題的數據庫是https://github.com/cloudfoundry/bosh數據庫。遵循上述升級路徑時,bosh 的使用者會看到此問題。從 OP 來看,問題似乎也始於 10.6。