50

我有一个使用 pg_dump 导出的数据库,但是现在当我尝试使用以下命令再次导入它时:

psql -d databasename < mydump.sql

尝试将角色授予不存在的人失败。(错误提示'角色“xxx”不存在')

有没有办法自动为我的用户导入和设置所有角色?

4

7 回答 7

49

导入的默认行为是将所有它不知道的角色替换为您正在使用的角色进行导入。因此,根据您需要数据库的用途,您可能只需导入它并忽略错误消息即可。

引用自http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE

在恢复 SQL 转储之前,所有拥有对象或被授予对转储数据库中对象的权限的用户必须已经存在。如果不这样做,还原将无法重新创建具有原始所有权和/或权限的对象。(有时这是您想要的,但通常不是。)

于 2013-06-17T17:22:09.247 回答
34

您可能正在寻找的答案是添加--no-ownerpg_restore命令中。与目前接受的答案不同,即使数据库中不存在转储中的角色,该命令也应该使用当前用户创建每个对象。

因此,pg_restore 不会跳过任何元素,但是如果导入的某些元素由不同的用户拥有,那么据我所知,所有记录现在将仅归一个用户所有。

于 2016-06-20T18:59:25.367 回答
20

pg_restore您可以使用该选项--role=rolename强制使用角色名称来执行还原。但转储必须是非纯文本格式。
例如,您可以转储:

pg_dump -F c -Z 9 -f my_file.backup my_database_name

并且您可以通过以下方式恢复它:

pg_restore -d my_database_name --role=my_role_name my_file.backup

欲了解更多信息: http ://www.postgresql.org/docs/9.2/static/app-pgrestore.html

于 2013-06-17T17:45:12.223 回答
9

是的,您可以使用 pg_dumpall 的 -g 选项从源数据库中转储所有“全局”对象:

pg_dumpall -g  > globals.sql

然后在导入之前针对您的目标数据库运行 globals.sql。

于 2013-06-17T17:18:54.530 回答
5

我使用了以下内容:

pg_dump --no-privileges --no-owner $OLD_DB_URL | psql $NEW_DB_URL

https://www.postgresql.org/docs/12/app-pgdump.html

-O

--no-owner

不要输出命令来设置对象的所有权以匹配原始数据库。默认情况下,pg_dump 发出 ALTER OWNER 或 SET SESSION AUTHORIZATION 语句来设置创建的数据库对象的所有权。当脚本运行时,这些语句将失败,除非它是由超级用户(或拥有脚本中所有对象的同一用户)启动的。要创建可以由任何用户恢复但将赋予该用户所有对象的所有权的脚本,请指定 -O。

此选项仅对纯文本格式有意义。对于归档格式,您可以在调用 pg_restore 时指定选项。

-X

--无特权

--no-acl

防止转储访问权限(授予/撤销命令)。

于 2020-01-14T23:51:25.250 回答
0

在较新版本的 pg_restore 中,它会抱怨文本文件导入。

但是,您可以使用 awk 删除这些行。您可以将其通过管道传输到新文件以确保它不会破坏任何内容,或者直接将其通过管道传输到 psql 中,如下所示:

cat my-import-file.sql | awk '!/old-role/' | psql -U target_owner -d target_db_name -1 -v ON_ERROR_STOP=1
  • 替换my-import-file.sql为您的导入文件
  • 替换target_owner为您的用户名
  • 替换target_db_name为要创建的数据库的名称
  • 替换old-role为它抱怨的角色

如果您有多个角色:

cat my-import-file.sql | awk '!/role1|role2|role3/' | psql -U target_owner -d target_db_name -1 -v ON_ERROR_STOP=1

这将删除所有提及该角色的行。一切都将由登录到 psql 的用户创建。

于 2019-11-20T07:59:42.943 回答
-6

好吧,您可以创建与您缺少的名称相同的新角色,然后导入转储而没有错误。

错误说'角色“xxx”不存在' - 所以创建它:)

于 2015-09-15T16:15:43.953 回答