我有一个用pg_dump导出的数据库,但现在当我尝试再次导入它时:
psql -d databasename < mydump.sql
尝试向不存在的人授予角色失败。 (错误说'角色'xxx“不存在')
有没有办法自动导入并设置所有角色给我的用户?
答案 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; - 所以创建它:)