我从
/docker-entrypoint-initdb.d/*
脚本创建了扩展,如下所示:
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname db <<EOSQL
CREATE EXTENSION citext;
CREATE EXTENSION pgcrypto;
CREATE EXTENSION hstore;
CREATE EXTENSION unaccent;
CREATE EXTENSION pg_trgm;
EOSQL
**抱歉,我们使用了过时的图像。实际命令是:
gosu postgres postgres --single -jE <<EOSQL
CREATE EXTENSION citext;
CREATE EXTENSION pgcrypto;
CREATE EXTENSION hstore;
CREATE EXTENSION unaccent;
CREATE EXTENSION pg_trgm;
EOSQL
当我用
pg_dumpall/pg_dump
转储此数据库时,转储文件中不存在扩展名,并且数据库恢复失败。
pg_dump -U postgres -d userdb
pg_dumpall -U postgres
但是如果我连接到我的数据库并执行
DROP/CREATE extension
,那么我的扩展将被转储并且数据库会成功恢复。我的 PostgreSQL 服务器版本是 11.19。
我找到了这个答案,但我不明白p2。我的
CREATE EXTENSION
算作 SQL 脚本吗?如果是,为什么以及如何使其成为非脚本?
我决定创建下一个
999-recreate-extensions.sh
初始化脚本。这里我通过psql
创建了扩展:
gosu postgres pg_ctl -D "$PGDATA" -o "-c listen_addresses='' -p 5432" -w start
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname db <<EOSQL
DROP EXTENSION IF EXISTS pg_trgm;
DROP EXTENSION IF EXISTS unaccent;
DROP EXTENSION IF EXISTS hstore;
DROP EXTENSION IF EXISTS pgcrypto;
DROP EXTENSION IF EXISTS citext;
EOSQL
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname db -c "CREATE EXTENSION citext;"
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname db -c "CREATE EXTENSION pgcrypto;"
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname db -c "CREATE EXTENSION hstore;"
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname db -c "CREATE EXTENSION unaccent;"
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname db -c "CREATE EXTENSION pg_trgm;"
echo "EXTENSIONS Were reinstalled";
gosu postgres pg_ctl -D "$PGDATA" -m fast -w stop
在此之后,以下
pg_dumpall
转储 CREATE EXTENSION
语句。