使用不同的用户名无法从pg_dump恢复psql数据库

11

我需要从计算机1上使用postgres用户名1转储postgres数据库,然后在计算机2上使用postgres用户名2还原它。我一直遇到这个错误,看起来备份文件想要使用用户名1:

当我在计算机2上运行以下命令时:

psql dbname < backupname.pgsql

我收到了这个错误信息:
ERROR:  role "username1" does not exist

我已经尝试过:
// Dumping from computer1:

pg_dump dbname > backupname.sql
pg_dump dbname > backupname.pgsql
pg_dump -U username1 dbname -N topology -T spacial_ref_sys > backupname.pgsql


// Restoring on computer2:

psql dbname < backupname.pgsql

需要修改倒入还是恢复操作才能解决这个问题?
3个回答

12

问题出在导出数据时。通过这篇文章的启示,我成功地采用以下方法来解决:

// On Computer1

pg_dump dbname -O -x > backupname.sql


// On Computer2

psql dbname < backupname.sql

pg_dump 使用的选项标志如下:

-O   <-- No owner
         Do not output commands to set ownership of objects to match the original database

-x   <-- No privileges
         Prevent dumping of access privileges (grant/revoke commands)

请参阅PostgreSQL文档中有关pg_dump的选项标志的更多信息。


4
如果您正在使用pgAdmin,则可以在DumpOptions#2中删除包含“Owner”的复选框,或者删除如下特权:--no-privileges,并且去除在转储查询中的所有权例如--no-password
/usr/bin/pg_dump --host localhost --port 5432 --username "postgres" --no-password --format custom --no-privileges --no-tablespaces --verbose --file "as" "databasename"。如果表上有约束,则在创建备份时要同时禁用触发器。
如果无法创建另一个数据库备份,则备份数据库的所有人和角色到新数据库是另一种方法。如果不这样做,将会收到错误消息“‘ACL does not exist’”(不确定是否需要很久才能面对)。

我没有使用pgAdmin,但也许看到这个的人会用。感谢提供这个选项。@Piyush - richardsonae
谢谢 @Piyush。 - richardsonae

4

您无需通过丢弃所有者/权限来削弱转储。您可以在还原时执行此操作。

使用pg_restore--no-acl(可能还有--no-owner)选项:

-x
--no-privileges
--no-acl
    防止恢复访问权限(grant/revoke命令)。
--no-owner 不要输出命令以设置对象的所有权以匹配原始数据库。默认情况下,pg_restore会发出ALTER OWNER或SET SESSION AUTHORIZATION语句来设置已创建模式元素的所有权。除非初始连接到数据库是由超级用户(或拥有脚本中所有对象的相同用户)进行的,否则这些语句将失败。使用-O,任何用户名都可以用于初始连接,并且该用户将拥有所有创建的对象。

因此,可以采取如下措施:

pg_restore --no-privileges --no-owner -U postgres --clean ... $Your_sql_backup

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接