导入没有角色的postgres数据库

时间:2013-06-17 17:06:34

标签: sql database postgresql import psql

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

psql -d databasename < mydump.sql

尝试向不存在的人授予角色失败。 (错误说'角色'xxx“不存在')

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

7 个答案:

答案 0 :(得分:35)

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

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

  

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

答案 1 :(得分:26)

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

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

答案 2 :(得分:17)

使用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

答案 3 :(得分:9)

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

pg_dumpall -g  > globals.sql

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

答案 4 :(得分:4)

我使用了以下内容:

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

来自

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

-O

-没有所有者

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

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

-x

-无特权

-no-acl

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

答案 5 :(得分:0)

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

但是,您可以使用awk删除这些行。您可以将其通过管道传输到新文件中,以确保它没有损坏任何东西,或者像这样直接将其直接管道到psql中:

SELECT t.id, t.client_id, t.name, t.value, t.`date`
FROM (
  SELECT *, LAG(value) OVER (PARTITION BY client_id, name ORDER BY ID) AS lastValue
  FROM tableA
) t WHERE t.value <> t.lastValue OR t.lastValue IS NULL
ORDER BY ID
  • 用导入文件替换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

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

答案 6 :(得分:-2)

您可以创建与您缺少的名称相同的新角色,然后导入dump而不会出错。

错误说&#39;角色&#34; xxx&#34;不存在&#39; - 所以创建它:)