查看Postgresql的链接情况

今天遇到一个问题,就是pg一直报错,说有太多的客户端链接到数据库上面。但如今不知道是什么程序链接。pg默认的max_connection是100,我并无修改过,觉得平时公司内部用,应该够了,但如今貌似这100个链接都被消耗掉。在网上google了一下,发现用下面的SQL,竟然能够查看全部链接的情况: sql

select * from pg_stat_activity;

结果集会显示出当前链接的数据库名,用户,IP地址,链接开始时间,查询的语句等。 数据库

这里的pg_stat_activity实际上是一个视图,它的定义能够在postgres这个数据库里面的视图部分找到,如下是它的定义: windows

CREATE OR REPLACE VIEW pg_stat_activity AS SELECT s.datid, d.datname, s.procpid, s.usesysid, u.rolname AS usename, s.application_name, s.client_addr, s.client_hostname, s.client_port, s.backend_start, s.xact_start, s.query_start, s.waiting, s.current_query FROM pg_database d, pg_stat_get_activity(NULL::integer) s(datid, procpid, usesysid, application_name, current_query, waiting, xact_start, query_start, backend_start, client_addr, client_hostname, client_port), pg_authid u WHERE s.datid = d.oid AND s.usesysid = u.oid;

能够看到,pg_stat_activity这个视图是由 pg_database,pg_authid,以及两个方法的结果来组合成的。 服务器

pg_database ,顾名思义就是储存了在pg里面的全部的数据库名称。 app

pg_authid,是用来储存pg的登陆帐号。 工具

pg_stat_get_backend_activity在Postgresql里面的定义以下: post

CREATE OR REPLACE FUNCTION pg_stat_get_backend_activity(integer) RETURNS text AS 'pg_stat_get_backend_activity' LANGUAGE internal STABLE STRICT COST 1;
ALTER FUNCTION pg_stat_get_backend_activity(integer) OWNER TO postgres; COMMENT ON FUNCTION pg_stat_get_backend_activity(integer) IS 'statistics: current query of backend';

可见它是一个pg的内部方法,用来统计当前query的数目。 google

看来pg的内部结构仍是挺清楚简单的。愈来愈喜欢pg的这种简单与强大了! spa

好了,如今咱们找出全部链接到数据库的进程了,那么如何去杀死那些IDEL的进程从而释放出链接呢? 命令行

若是pg的版本是 8.4及以上的,能够很简单地用下面的语句来杀死全部IDEL进程 :

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE current_query='<IDLE>'

pg_terminate_backend 是pg的内部方法,另外还有一个叫pg_cancel_backend,这个方法在8.4之前的版本中就一直存在。这两个方法的区别在于,pg_cancel_backend 只是取消当前某一个进程的查询操做,但不能释放数据库链接。但pg_terminate_backend 能够在pg的后台杀死这个进程,从而释放出宝贵的链接资源。

但若是pg的版本是在8.3或者如下的,就不能用上面的方法了。首先,一样的,要先找出pg里面有什么IDEL的链接,而后在windows的command里面,输入如下命令:

pg_ctl kill TERM PID

以上命令是调用pg的后台命令行 pg_ctl去执行命令,直接kill那个进程。这样会同时致使windows和pg的进程同时被杀死,从而释放资源。比较麻烦的是,只能手动地一个一个进程来杀,没有批量的方法。

另一个比较有用的工具是pgAdmin提供的,在pgAdmin -> 工具 -> 服务器状态,会列出当前pg里面全部的链接,从而能够看到什么进程在进行什么操做,pid是多少,何时开始,运行多长时间了,结果是跟用 pg_stat_activity 查询出来的结果同样的。

相关文章
相关标签/搜索