postgresql - 当存在事件连接时删除数据库

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

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

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

详细信息:还有 2 个其他 session 正在使用该数据库。

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

-- 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 或更高版本

连接到同一集群的不同数据库时的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"SQl interpolation 的语法。在 psql 中。标识符用双引号引起来。

关于postgresql - 当存在事件连接时删除数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55747282/

相关文章:

sql - Postgres 函数插​​入值/参数范围

java - 如何安全地终止已超时的查询

java - 连接池jdbc

postgresql - 在事件触发器中获取表名

PostgreSQL 在设置之前提示输入密码

postgresql - 与同一 postgres 数据库的两个模式连接的应用程序的两个实例无法区分

postgresql - 用户 "postgres"的对等身份验证失败

grails - Grails v1.1.1是否支持多个数据库连接?

ruby-on-rails - Rails:对于SQLite,PRAGMA FOREIGNS KEYS = ON的放置位置

postgresql - ALTER COLUMN TYPE varchar(N) 是否重写 Postgres 9.6 中的表?