【问题标题】:Dropping DB when there are active connections有活动连接时删除数据库
【发布时间】:2019-04-18 13:39:22
【问题描述】:

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

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

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 帖子中获取查询,是否有更可靠的方法来执行此操作,或者无论是否有活动连接都强制删除数据库的方法?

【问题讨论】:

  • 您在运行该查询后是否退出了psql?否则,您仍将与该数据库建立一个打开的连接 - 您的查询使用的那个
  • 我正在从 docker 容器远程运行 psql,并且正在连接到 postgres 管理数据库,而不是我要删除的数据库。我还需要断开连接吗?这是要连接的正确数据库吗?

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


【解决方案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 的语法。标识符的双引号。

见:

【讨论】:

  • 谢谢,我正在尝试从 postgres 数据库运行它,那么我对 postgres 9.6 的查询是否不正确?我应该删除 AND 子句(如您的示例中所示)吗?
  • AND pid &lt;&gt; pg_backend_pid() 在您的示例中排除了当前会话 - 当当前会话指向不同的数据库时,这无关紧要......
猜你喜欢
  • 2011-07-21
  • 2010-11-29
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多