为什么从 `/docker-entrypoint-initdb.d/*` 脚本创建 PostgreSQL 扩展时未转储?

问题描述 投票:0回答:1

我从

/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 脚本吗?如果是,为什么以及如何使其成为非脚本?

postgresql database-backups postgresql-extensions
1个回答
0
投票

我决定创建下一个

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
语句。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.