有活动连接时删除数据库

时间:2019-04-18 13:39:23

标签: postgresql database-connection postgresql-9.6 drop-database

我正在尝试编写数据库备份脚本,部分流程是我需要删除数据库,然后从备份中重新创建数据库。

当有到数据库的连接时,我会收到如下失败消息:

DETAIL: There are 2 other sessions using the database.

我一直在寻找一种在删除数据库之前忽略此连接或终止连接的方法。我正在尝试使用下面的查询,但实际上并不允许我在运行数据库后删除它。

-- Drop connections
\set database_name `echo $DB_NAME`

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = ':database_name'
AND pid <> pg_backend_pid();

我从一条SO帖子中获取了该查询,该查询似乎表明可以使用该查询,是否有更可靠的方法可以执行此操作,还是可以强制删除数据库而不管是否存在活动连接?

1 个答案:

答案 0 :(得分:1)

连接到与要删除的数据库不同的不同数据库-在同一数据库群集中。否则,您自己的连接将成为障碍。您可以为此使用默认的维护数据库“ postgres”:

psql -h localhost -U postgres postgres

然后确保客户端不重新连接:

UPDATE pg_database SET datallowconn = 'false' WHERE datname = :"database_name";

最后:

SELECT pg_terminate_backend(pid)
FROM   pg_stat_activity
WHERE  datname = :"database_name";  -- escape to avoid errors / sql injection

:"database_name"是psql中SQl interpolation的语法。标识符双引号。

请参阅: