导入没有角色的postgres数据库

Bra*_*den 39 sql database postgresql import psql

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

psql -d databasename < mydump.sql
Run Code Online (Sandbox Code Playgroud)

它未能尝试将角色授予不存在的人.(错误说'角色'xxx"不存在')

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

小智 37

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

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

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

  • 从我第一次读到这个答案开始,我就错过了那个说"你可能会好起来"的部分.为了澄清这个答案,这个命令可能在运行时起作用.显示的错误并未停止导入数据.源中使用的角色不在目标中,与它们关联的任何数据现在都与运行该命令的用户相关联. (3认同)

Loï*_*oix 26

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

因此,pg_restore不会跳过任何元素,但如果导入的某些元素由不同的用户拥有,则据我所知,所有记录现在只由一个用户拥有.

  • 如何使用psql实现它?这就是问题所在 (3认同)

And*_*Boc 17

有了pg_restore您可以使用--role=rolename选项强制角色名称将被用于执行恢复.但转储必须是非纯文本格式.
例如,你可以转储:

pg_dump -F c -Z 9 -f my_file.backup my_database_name
Run Code Online (Sandbox Code Playgroud)

而且你可以用以下方法恢复它:

pg_restore -d my_database_name --role=my_role_name my_file.backup
Run Code Online (Sandbox Code Playgroud)

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


Bri*_*ers 9

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

pg_dumpall -g  > globals.sql
Run Code Online (Sandbox Code Playgroud)

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


jmu*_*sch 5

我使用了以下内容:

pg_dump --no-privileges --no-owner $OLD_DB_URL | psql $NEW_DB_URL
Run Code Online (Sandbox Code Playgroud)

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

-O

--无所有者

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

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

-X

--无权限

--no-acl

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