Postgresql

如果使用公共或 pg_catalog 模式,則不執行 pg_restore ‘CREATE CAST’

  • July 9, 2019

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,您將只從該模式中獲取對象,並且不包括類型轉換。

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