在将pg_restore写入RDS实例时遇到问题。
Source DB:一个dockerized PG9.4实例。
pg_dump -Fc -h localhost -p 5432 -U user --no-synchronized-snapshot -Fd --jobs 2 dbname --file="/pgdump/dbname_fd"
目标数据库:RDS PG9.6实例:
#drop and recreate databases with proper ownership
export PGPASSWORD=''
psql -h $pgHost -U dbname postgres -c 'DROP DATABASE dbname;'
export PGPASSWORD=''
psql -h $pgHost -U rdspostgresmaster postgres -c 'create database dbname;'
psql -h $pgHost -U rdspostgresmaster postgres -c 'alter database dbname owner to dbname;'
# Drop extensions
psql -h $pgHost -U rdspostgresmaster postgres -c 'DROP EXTENSION IF EXISTS hstore;
DROP EXTENSION IF EXISTS earthdistance;
DROP EXTENSION IF EXISTS postgis;
DROP EXTENSION IF EXISTS ltree;
DROP EXTENSION IF EXISTS plpgsql;'
# Install superuser extensions
psql -h $pgHost -U rdspostgresmaster postgres -c 'CREATE EXTENSION IF NOT EXISTS hstore;'
psql -h $pgHost -U rdspostgresmaster postgres -c 'CREATE EXTENSION IF NOT EXISTS earthdistance with cascade;;'
psql -h $pgHost -U rdspostgresmaster postgres -c 'CREATE ROLE IF NOT EXISTS postgres;'
psql -h $pgHost -U rdspostgresmaster postgres -c 'GRANT rds_superuser to postgres'
psql -h $pgHost -U rdspostgresmaster postgres -c 'GRANT ALL ON SCHEMA public TO postgres;'
# dbname permissions
psql -h $pgHost -U rdspostgresmaster postgres -c 'grant rds_superuser to dbname'
psql -h $pgHost -U rdspostgresmaster postgres -c 'GRANT postgres to dbname;'
#connect as dbname user and add extensions
export PGPASSWORD=''
psql -h $pgHost -U dbowner dbname -c 'CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION IF NOT EXISTS cube;
CREATE EXTENSION IF NOT EXISTS earthdistance with cascade;
CREATE EXTENSION IF NOT EXISTS ltree;
CREATE EXTENSION IF NOT EXISTS plpgsql;'
###Restore
export PGPASSWORD=''
pg_restore -h $pgHost -U dbowner --jobs=4 -d dbname -Fd /pgdump/dbname_fd
获得以下内容:
pg_restore: [archiver (db)] Error from TOC entry 4623; 1259 39684305 INDEX location_search_ll_to_earth_gist dbname
pg_restore: [archiver (db)] could not execute query: ERROR: type "earth" does not exist
LINE 1: ...ians($1))*sin(radians($2))),earth()*sin(radians($1)))::earth
^
QUERY: SELECT cube(cube(cube(earth()*cos(radians($1))*cos(radians($2))),earth()*cos(radians($1))*sin(radians($2))),earth()*sin(radians($1)))::earth
CONTEXT: SQL function "ll_to_earth" during inlining
Command was: CREATE INDEX location_search_ll_to_earth_gist ON public.location_search USING gist (public.ll_to_earth((latitude)::double pr...
我的其他扩展似乎工作得很好,但是那个"地球"类型是麻烦。我已经尝试在进程中的各个点安装扩展(注释掉任一个CREATE EXTENSION块,对于instand),作为RDS postgres master或dbowner用户,两次都会收到此错误。我还试图在我的转储中进行磨练并恢复到公共或dbname架构。
我是否需要做些什么来使扩展能够与公共模式一起使用?