小编正在欢快的敲击着键盘,突然,一位开发的同学qq找了过来:XXX,遇到件奇怪的事啊! 为何公司环境的pg用postgres用户都能正常登陆,但是用其他用户登陆不了啊!
一看是登陆问题,不慌。公司环境是rhel6的postgresql10.1, 看报错,截图如下:
看到报错,小编心里已经有数了,和达到最大连接数有点类似。报错翻译如下:剩余的连接位置为superuser用户保留。啥意思呢?意思就是我这还有空闲位置能连,但是只能是superuser用户(superuser是pg中最大的权限)!
啧啧,就是这么势利!这一点是pg的小小特色之一。实际上,这也是为了给运维人员留一条后路,避免数据库无法登陆而无法查看数据库的信息状态!
和其他关系型数据库不同的是,pg有两个参数控制外部的连接数。
1.max_connections,最大连接数,参数默认值100 ;
2.superuser_reserved_connections,超级用户保留连接数,参数默认值3。
两者修改后都要重启生效。
前者控制所有用户连接上限,后者控制“普通用户“连接的下限。注意哦,这里的“普通用户”,指的是在达到超级用户保留连接数前,所有的superuser和非superuser用户都算作普通用户。
所以,现在想要让普通用户能够连接,有两种办法,下面,就让小编好好和大家讲讲。
方法1:杀掉部分空闲会话
方式一:客户端杀会话
直接在客户端登陆,使用postgrs用户登陆查杀。
select usename, datname, pid, application_name, wait_event,wait_event_type,state,backend_type from pg_stat_activity where backend_type=’client backend’ and state=’idle’;
直接在客户端杀会话即可,无需在服务器端登陆。
select pg_terminate_backend(3228)
方式二:登陆到pg服务器上:
ps -ef|grep -v grep |grep postgres|grep idle
kill -9 pid 即可。该种方法的优势在于,无需登陆到数据库中查询空闲会话,可以直接在OS层面找到IDLE会话。比如超过最大会话数了,无法登陆,这种就十分合适,顺带提一笔,pg中真正算是超最大会话数的报错为 FATAL: sorry, too many clients already。
方法2: 修改参数
出现该问题的原因,可能是参数设置不合理,不能满足业务环境真实的连接数。杀空闲回话就是治标不治本了。这个时候,就建议修改参数了。但是需要重启服务
查看命令如下:
SELECT name , setting FROM pg_settings where name ~ ‘connection’;
alter system set max_connections=500 ; (根据具体需求而定) 然后重启服务生效!
至此,该问题就处理OK啦。
美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。
来源:freebuf.com 2020-06-09 11:47:55 by: database
请登录后发表评论
注册