【发布时间】:2012-04-27 11:49:03
【问题描述】:
我正在为一个 django 项目使用 Postgres,我目前正在实现一个数据库备份/恢复系统,该系统尽可能简单地在用户单击备份时执行 pg_dump,然后在他们单击恢复备份时执行 pg_restore。
在它实际尝试执行 pg_restore 并给出此错误之前,一切看起来都很好:
pg_restore: [archiver (db)] 来自 TOC 条目 3206 的错误; 0 0 条评论 EXTENSION plpgsql pg_restore: [archiver (db)] 无法执行查询: 错误:必须是扩展 plpgsql 命令的所有者:注释打开 扩展 plpgsql 是“PL/pgSQL 过程语言”;
我已经研究了 plpgsql 是什么等,我明白这一点,关于错误,我尝试手动将“扩展的所有者”设置为执行脚本并拥有数据库本身但没有改变的用户,它真的很烦人,因为它在尝试设置所有事物的评论时出错
这一切都是由 pg_dump 自动创建的,因此无法删除注释行,也没有禁用 cmets 的标志(我知道这是关闭的),所以我真的不知道如何解决这个问题。
【问题讨论】:
-
如果您使用 psql 连接并输入
\l,您会在该数据库的“所有者”列中看到什么?由于 plpgsql 是一种不受信任的语言,它只能由数据库所有者或数据库超级用户修改(我猜这甚至适用于对它的评论)。 -
我可以确认数据库的所有者是正确的,并且与 pg_restor 命令的 -U 选项指定的用户匹配(以及 pg_dump 也是)
-
不幸的是,事情没那么简单。我有 pg_dump 输出,希望能够使用这些语言创建语言和函数。如果我以 DB 超级用户的身份手动创建语言,则函数创建会因权限错误而失败。如果我不这样做,程序语言安装会由于权限错误而失败。在任何一种情况下,也无法创建依赖于这些现有功能的更下方的触发器,因为这些功能不存在。
标签: postgresql plpgsql database-restore