postgresql - 有活动连接时删除数据库
问题描述
我正在尝试编写数据库备份的脚本,部分流程是我需要删除然后从备份中重新创建数据库。
当有与数据库的连接时,我会收到如下失败消息:
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”:
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
这是psql中SQl 插值:"database_name"
的语法。标识符的双引号。
看:
推荐阅读
- python - ImportError:没有名为 pip._internal 的模块
- asp.net - 引导更新仅适用于调试配置 (Visual Studio)
- c - 如何在 C 中将指令定义为其他指令?
- java - 如何只显示第一列和第一行?
- node.js - 使用 Node.js 从连接的 FTP 下载文件
- vba - Excel VBA - 单击页面上的 Javascript 按钮
- python - 如何返回在 Pandas 数据框中共享命令值的组?
- css - 如何使用 CSS 将不同 div 行中的所有项目(图像、标题、文本、按钮)对齐?
- webgl - 在片段着色器中绘制椭圆曲线
- reporting-services - SSRS - 柱形图 - 标签样式