我正在尝试编写数据库备份脚本,部分流程是我需要删除数据库,然后从备份中重新创建数据库。
当有到数据库的连接时,我会收到如下失败消息:
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帖子中获取了该查询,该查询似乎表明可以使用该查询,是否有更可靠的方法可以执行此操作,还是可以强制删除数据库而不管是否存在活动连接?
答案 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的语法。标识符双引号。
请参阅: