如何解决WSL下源码编译PostgreSQL的‘角色不存在’致命错误?
解决PostgreSQL角色不存在的问题
问题根源:PostgreSQL初始化数据库时,默认会创建一个和当时操作系统用户名同名的超级角色。你修改WSL用户名后,新用户名和数据库里的角色名不匹配,导致连接失败。以下是几种可行的解决方法:
方法一:单用户模式创建新角色
- 先停止数据库服务:
bin/pg_ctl -D demo stop - 启动PostgreSQL单用户模式(无需验证即可进入):
bin/postgres -D demo --single - 在单用户命令行中执行SQL创建新角色(替换成你的新用户名):
CREATE ROLE nnaemekaxjohn WITH LOGIN SUPERUSER PASSWORD '自定义密码'; - 按
Ctrl+D退出单用户模式,重新启动数据库:bin/pg_ctl -D demo start - 现在就可以用新用户名连接数据库了:
bin/psql --port=5430 demo
方法二:用旧角色登录后创建新角色
如果你记得当初初始化数据库时的旧系统用户名(比如旧用户名是olduser):
- 指定旧角色登录数据库:
bin/psql --port=5430 -U olduser demo - 登录后执行SQL创建新角色:
CREATE ROLE nnaemekaxjohn WITH LOGIN SUPERUSER; - 可选:将
demo数据库的所有权转移给新角色:ALTER DATABASE demo OWNER TO nnaemekaxjohn;
方法三:临时修改权限配置登录
- 打开数据库目录下的
pg_hba.conf文件:nano demo/pg_hba.conf - 找到类似以下的行:
local all all peer - 将
peer修改为trust,保存退出。 - 重启数据库服务:
bin/pg_ctl -D demo restart - 此时无需验证即可登录数据库,执行创建新角色的SQL:
bin/psql --port=5430 demoCREATE ROLE nnaemekaxjohn WITH LOGIN SUPERUSER PASSWORD '自定义密码'; - 操作完成后,记得把
pg_hba.conf改回原来的peer或md5,再重启数据库,保证安全性。
内容的提问来源于stack exchange,提问作者Nnaemeka Daniel John
相关产品推荐
相关产品推荐

