运维日记|PostgreSql登陆问题 – 作者:database

小编正在欢快的敲击着键盘,突然,一位开发的同学qq找了过来:XXX,遇到件奇怪的事啊! 为何公司环境的pg用postgres用户都能正常登陆,但是用其他用户登陆不了啊!

一看是登陆问题,不慌。公司环境是rhel6的postgresql10.1, 看报错,截图如下:

image.png

看到报错,小编心里已经有数了,和达到最大连接数有点类似。报错翻译如下:剩余的连接位置为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’;

image.png

直接在客户端杀会话即可,无需在服务器端登陆。

select pg_terminate_backend(3228)

image.png

方式二:登陆到pg服务器上:

ps -ef|grep -v grep |grep postgres|grep idle

image.png

kill -9 pid 即可。该种方法的优势在于,无需登陆到数据库中查询空闲会话,可以直接在OS层面找到IDLE会话。比如超过最大会话数了,无法登陆,这种就十分合适,顺带提一笔,pg中真正算是超最大会话数的报错为 FATAL:  sorry, too many clients already。


方法2:  修改参数

出现该问题的原因,可能是参数设置不合理,不能满足业务环境真实的连接数。杀空闲回话就是治标不治本了。这个时候,就建议修改参数了。但是需要重启服务

查看命令如下:

SELECT name , setting FROM pg_settings where name ~ ‘connection’;

image.png

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论