pg_dump导出无root用户数据库报权限拒绝的解决方法
问题根因
你当前执行的命令没有指定连接数据库的用户,pg_dump默认会读取当前操作系统登录账号的用户名作为数据库连接用户,根本没有使用你提前创建的专用导出用户;同时报错显示你使用的连接账号连表的共享读锁权限都不具备,属于数据库权限配置缺失,和系统有没有同名数据库用户没有关系。
操作步骤
1. 指定专用用户执行导出命令
pg_dump通过-U参数指定连接使用的数据库用户,完全不依赖操作系统同名用户,只要参数指定正确,连接时校验数据库侧的账号密码即可。
带用户参数的基础导出命令格式:
pg_dump -U <你创建的专用数据库用户名> -h <数据库连接地址,本地填localhost> -p <数据库端口,默认5432> lhhsweb > lhhs.sql
举个实际例子,如果你的专用导出用户名为lhhs_backup,连接本地默认端口的库,命令为:
pg_dump -U lhhs_backup -h localhost -p 5432 lhhsweb > lhhs.sql
执行后按照提示输入该数据库用户的密码即可触发导出流程。如果需要免密执行,可以在当前系统用户的家目录创建.pgpass文件存储认证信息,文件内容格式为<数据库地址>:<端口>:<库名>:<用户名>:<密码>,将文件权限设置为600即可被pg_dump自动读取。
2. 给专用导出用户补全必要权限
你遇到的锁表权限报错是因为该账号缺少public schema下对象的读权限,需要用数据库超级管理员(默认是postgres账号)连接到lhhsweb库,依次执行以下授权语句:
- 授予schema使用权限
GRANT USAGE ON SCHEMA public TO <你的专用数据库用户名>;
- 授予当前public下所有表、序列的读权限(导出需要读全表数据、拿读锁)
GRANT SELECT ON ALL TABLES IN SCHEMA public TO <你的专用数据库用户名>; GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO <你的专用数据库用户名>;
- (可选)配置默认权限,后续新建的表、序列自动给该用户授予读权限,避免下次导出再出现权限报错
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO <你的专用数据库用户名>; ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON SEQUENCES TO <你的专用数据库用户名>;
注意事项
- 数据库导出必须能获取所有导出对象的ACCESS SHARE锁,权限不足时强行导出会得到残缺的备份文件,后续恢复会出现数据缺失、对象不存在等问题
- 如果你的数据库用了非public的其他自定义schema,需要对每个schema重复上面的授权步骤,否则对应schema下的对象还是会报权限错
内容的提问来源于stack exchange,提问作者bradrice
相关产品推荐
相关产品推荐

