我使用以下命令生成了一个干净无所有者的Postgres数据库备份:
pg_dump sample_database -O -c -U
后来,当我使用以下命令恢复数据库时:
psql -d sample_database -U app_name
然而,我遇到了一些错误,这些错误阻止我恢复数据:
ERROR: must be owner of extension plpgsql
ERROR: must be owner of schema public
ERROR: schema "public" already exists
ERROR: must be owner of schema public
CREATE EXTENSION
ERROR: must be owner of extension plpgsql
我深入研究了纯文本SQL pg_dump
生成的内容,发现它包含SQL语句。
CREATE SCHEMA public;
COMMENT ON SCHEMA public IS 'standard public schema';
CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;
COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';
我认为问题的原因是用户 app_name
没有修改 public
模式和 plpgsql
的权限。
我该如何解决这个问题?
plpgsql
,在执行pg_dump
前先运行DROP EXTENSION plpgsql
。这比将你的应用程序设置为超级用户更安全,也比忽略错误更方便(如果使用--single-transaction
或-v ON_ERROR_STOP=1
会导致失败)。这是一个已知的问题,在Postgres开发人员的讨论中详细讨论过,但截至9.3版本仍未修复。 - Mark E. Haase