存在活动连接时丢弃数据库



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

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

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 帖子中获取了查询,该帖子似乎表明可以使用它,是否有更可靠的方法来执行此操作或强制删除数据库的方法,无论是否有活动连接?

Postgres 13 或 hgigher

连接到同一集群的不同数据库时的 SQL DDL 语句:

 DROP DATABASE database_name WITH (FORCE);

从外壳:

dropdb database_name --force

看:

  • 强制丢弃数据库,而其他人可能已连接

对于旧版本

连接到与要删除的数据库不同的数据库 - 在同一数据库集群中。否则,你自己的连接就会成为障碍。为此,您可以使用默认维护数据库"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 插值的语法。标识符的双引号。

相关内容

  • 没有找到相关文章

最新更新