Postgres pg_terminate_backend替代方案

时间:2016-01-05 09:51:05

标签: php postgresql

我有以下脚本来终止后端进程。

exec('psql -Upostgres -c "select pg_terminate_backend(procpid) from pg_stat_activity where datname= \'' . $databaseName . '\'"');

注意:由于procpid列已替换为pid

,此脚本在postgres 9.3.10或更高版本上失败

在将数据库重置为早期状态之前,此脚本已运行。如果脚本无法运行,则重置数据库的下一个脚本也将失败并抛出错误,如

ERROR:  column "procpid" does not exist
LINE 1: select pg_terminate_backend(procpid) from pg_stat_activity w...
dropdb: database removal failed: ERROR:  database "dbName" is being accessed by other users
DETAIL:  There is 1 other session using the database.
createdb: database creation failed: ERROR:  database "dbName" already exists
 Looks like you failed 8 tests of 74.

所以,我想通过使用像

这样的PHP脚本来避免这种错误的方法
exec('psql --version', $vout);
$isNewVersion = false;
if ($vout !== false)
{
    $x = preg_match_all('!\d+!', $vout[0], $mcs);
    if ($x !== false && $x > 0) {
        $v = implode('', $mcs[0]);
    }

    // Check if psql version is >= 9.3.10
    $isNewVersion = (strpos($v, '931') !== false);
}
if ($isNewVersion)
{
    exec('psql -Upostgres -c "select pg_terminate_backend(pid) from pg_stat_activity where datname= \'' . $databaseName . '\'"');
}
else
{
    exec('psql -Upostgres -c "select pg_terminate_backend(procpid) from pg_stat_activity where datname= \'' . $databaseName . '\'"');
}

问题是,我认为我的代码不可读或友好,因为我只是在unit testing中使用它。

所以,我想知道是否有另一种替代方法可以终止与任何版本的postgres(8.3或更高版本)兼容的后端

任何建议表示赞赏。我是postgres btw的新手。

1 个答案:

答案 0 :(得分:2)

新旧格式enddate=2/10/2016进程ID位于第三列, 所以你可以使用这个查询得到它:

pg_stat_activity