ber*_*olo 3 postgresql database-connection drop-database postgresql-9.6
我正在尝试编写数据库备份脚本,部分流程是我需要删除数据库,然后从备份重新创建数据库。
当存在到数据库的连接时,我收到如下失败消息:
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();
Run Code Online (Sandbox Code Playgroud)
我从 SO 帖子中获取了查询,该帖子似乎表明可以使用它,是否有更可靠的方法来执行此操作,或者无论是否存在活动连接都强制删除数据库?
连接到同一集群的不同DB时的SQL DDL语句:
DROP DATABASE database_name WITH (FORCE);
Run Code Online (Sandbox Code Playgroud)
从外壳:
dropdb database_name --force
Run Code Online (Sandbox Code Playgroud)
看:
连接到与要删除的数据库不同的数据库 - 在同一数据库集群中。否则,您自己的连接就会受到阻碍。为此,您可以使用默认维护数据库“postgres”:
psql -h localhost -U postgres postgres
Run Code Online (Sandbox Code Playgroud)
然后确保客户端不会重新连接:
UPDATE pg_database SET datallowconn = 'false' WHERE datname = :"database_name";
Run Code Online (Sandbox Code Playgroud)
最后:
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = :"database_name"; -- escape to avoid errors / sql injection
Run Code Online (Sandbox Code Playgroud)
这是 psql 中SQl 插值:"database_name"的语法。标识符用双引号。