Postgresql
如果使用公共或 pg_catalog 模式,則不執行 pg_restore ‘CREATE CAST’
pg_dump
在將數據庫移動到另一個實例時,我正在使用pg_restore
中間文件。轉儲文件是這樣創建的:
pg_dump --host $SRC_DB_HOST --port 5432 "dbname=$SRC_DB user=$SRC_DB_USER sslrootcert=rds-combined-ca-bundle.pem sslmode=verify-full" --no-owner --verbose -Fc --file db.bak
我肯定看到垃圾場中有演員表
$strings db.bak | grep "CREATE \(TYPE\|CAST\)" CREATE TYPE public.score_group_name AS ENUM ( CREATE TYPE public.score_group_type AS ENUM ( CREATE CAST (character varying AS public.score_group_name) WITH INOUT AS IMPLICIT; CREATE CAST (character varying AS public.score_group_type) WITH INOUT AS IMPLICIT;
但是當我恢復
pg_restore
使用參數執行的數據庫時:pg_restore --verbose -Fc --no-acl --no-owner -n public --single-transaction db.bak > migration.log
沒有產生用於創建它的查詢:
$ grep -e "\(CREATE\|DROP\) \(TYPE\|CAST\)" migration.log CREATE TYPE public.score_group_name AS ENUM ( CREATE TYPE public.score_group_type AS ENUM (
源 PostgreSQL 版本:
PostgreSQL 9.6.11 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9), 64-bit
目標 PostgreSQL 版本:
PostgreSQL 9.6.10 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4, 64-bit
PostgreSQL 實用程序版本:
$ pg_dump --version pg_dump (PostgreSQL) 9.6.14 $ pg_restore --version pg_restore (PostgreSQL) 9.6.14
UPDATE 問題的根源似乎是
-n public
參數,沒有模式過濾 -CREATE CAST
生成了語句,但是我應該將哪個模式添加到還原中?因為-n public
並-n pg_catalog
過濾掉這樣的陳述。
原因是類型轉換不存在於模式中。
如果您指定
-n public
,您將只從該模式中獲取對象,並且不包括類型轉換。