后端杀手函数
来自 PostgreSQL 维基
跳转到导航跳转到搜索作者: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