后端杀手函数

来自 PostgreSQL 维基
跳转到导航跳转到搜索

管理片段

后端杀手函数

适用于 PostgreSQL

7.x – 8.3

编写语言

plperlu

依赖

作者:Emanuel Calvo Franco

此函数仅在 8.3 及更早版本中有效;在更新的 PostgreSQL 版本(8.4 及更高版本)中,您可以使用 pg_terminate_backend() 函数。

此函数发送 TERM 信号来杀死参数中指示的服务器进程。

请注意,所有早于 8.4 的 PostgreSQL 版本都已知可能存在潜在问题,即如果以这种方式杀死后端,可能会导致死锁或共享内存数据结构的其他损坏。 在大多数情况下,这些事件的概率很低;但是,如果确实发生,则需要重新启动 postmaster 以清除它们。(在 8.4 版本之前,postmaster 内部只在它正在关闭时才使用 TERM 信号。)

create or replace function pg_terminate_backend(int) returns int
language plperlu security definer volatile as $$
        $pid = shift;
	my $myPid = spi_exec_query('select pg_backend_pid();');
	if ($pid ==  $myPid->{rows}[0]->{pg_backend_pid}){
		elog(WARNING, "this PID belongs to the current server process");
		return 1;
	}
	my $othersesions = spi_exec_query('SELECT procpid FROM pg_stat_activity');
	my $numRows = $othersesions->{processed};

	foreach my $rn (0 ..  $numRows - 1) {
        	my $rs = $othersesions->{rows}[$rn];
		if ($rs->{procpid} == $pid){
			$ret = kill TERM, $pid;
			elog WARNING, "could not send signal TERM to $pid: $!" unless $ret == 1;
			return $ret;			
		}
	}
	elog(WARNING, "PID $pid is not a PostgreSQL server process");
	return 1;
$$;

(请注意,此函数假设统计收集器正在运行。)

如何找到要杀死的会话的 PID?

要找出当前会话的 PID,请运行

select pg_backend_pid();

但您当然不能用此函数杀死它。

此查询列出了当前活动进程的 PID 以及它们正在运行的 SQL 命令

 select procpid, current_query from pg_stat_activity;
 procpid |                    current_query                     
---------+------------------------------------------------------
    2033 | <IDLE>
    2478 | select procpid, current_query from pg_stat_activity;
(2 rows)

您也可以尝试使用操作系统的进程列表

$ ps feu -C postmaster -C postgres
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
postgres  1402  0.0  0.2  63748  4960 pts/8    S    20:05   0:00 postmaster PGDATA=/pgsql/install/83
postgres  1409  0.0  0.0  63748  1272 ?        Ss   20:05   0:00  \_ postgres: writer process                                
postgres  1410  0.0  0.0  63748  1076 ?        Ss   20:05   0:00  \_ postgres: wal writer process                            
postgres  1411  0.0  0.0  63884  1508 ?        Ss   20:05   0:00  \_ postgres: autovacuum launcher process                   
postgres  1412  0.0  0.0  34240  1196 ?        Ss   20:05   0:00  \_ postgres: stats collector process                       
postgres  2033  0.0  0.2  65236  5768 ?        Ss   20:12   0:00  \_ postgres: postgres postgres [local] idle idle