PostgreSQL 9.6使用pg_dumpall备份恢复时避免超级用户相关错误
解决PostgreSQL 9.6 pg_dumpall恢复时超级用户角色错误的问题
这个问题其实挺常见的——当你用某个超级用户执行pg_dumpall -c --if-exists备份时,备份文件里会自动包含该超级用户自己的DROP ROLE和CREATE ROLE语句。恢复时你又用同一个超级用户操作,自然会触发"无法删除当前用户"和"角色已存在"的错误,虽然不影响最终恢复结果,但确实看着闹心。下面给你两个实用的解决办法:
方法1:直接编辑备份文件移除相关语句
打开生成的备份SQL文件,定位并删除两类语句:
- 类似
DROP ROLE IF EXISTS mysuperuser;的行(尝试删除当前超级用户的语句) - 类似
CREATE ROLE mysuperuser WITH SUPERUSER LOGIN PASSWORD 'xxx';的行(尝试重新创建该超级用户的语句)
这样恢复时就不会再触发这两个无关错误了。放心,作为执行恢复的当前超级用户,它本身已经存在且正在连接,删除这些语句不会影响任何依赖对象的恢复。
方法2:备份时直接过滤掉超级用户的语句
PostgreSQL 9.6的pg_dumpall还没有--exclude-role选项(这个功能在PostgreSQL 11及以后才加入),所以我们可以用管道命令在备份阶段直接过滤掉相关行,省掉后续编辑的麻烦:
pg_dumpall -c --if-exists | grep -v "DROP ROLE IF EXISTS mysuperuser;" | grep -v "CREATE ROLE mysuperuser" > my_backup.sql
把命令里的mysuperuser替换成你实际使用的超级用户名即可。生成的备份文件里就不会包含该用户的删除和创建语句,恢复时自然就不会出现那些报错了。
内容的提问来源于stack exchange,提问作者Nuri Tasdemir
相关产品推荐
相关产品推荐

