如何终止所有PostgreSQL连接?

我试着打rake db:drop分,但是我拿到了:

ERROR:  database "database_name" is being accessed by other users
DETAIL:  There are 1 other session(s) using the database.

我已经try 关闭我在ps -ef | grep postgres上看到的进程,但这也不起作用:

kill: kill 2358 failed: operation not permitted

推荐答案

您可以使用pg_terminate_backend()来终止连接.您必须是超级用户才能使用此功能.这在所有操作系统上都是一样的.

SELECT 
    pg_terminate_backend(pid) 
FROM 
    pg_stat_activity 
WHERE 
    -- don't kill my own connection!
    pid <> pg_backend_pid()
    -- don't kill the connections to other databases
    AND datname = 'database_name'
    ;

在执行此查询之前,您必须拥有REVOKE个连接权限,以避免新的连接:

REVOKE CONNECT ON DATABASE dbname FROM PUBLIC, username;

如果您正在使用Postgres 8.4-9.1,请使用propid而不是PID

SELECT 
    pg_terminate_backend(procpid) 
FROM 
    pg_stat_activity 
WHERE 
    -- don't kill my own connection!
    procpid <> pg_backend_pid()
    -- don't kill the connections to other databases
    AND datname = 'database_name'
    ;

Database相关问答推荐

如何避免在模式更改时重新同步微服务数据库之间的整个表?

我如何知道 DynamoDB 表分布在多少个分区上?

动态数据模型

为什么引用 SQLite rowid 会导致外键不匹配?

JOIN 三张表

skip bad record in redshift data load

如何在 Play 2.0 中 for each 环境设置不同的数据库?

为什么数据库索引使用平衡树,而不是哈希表?

PHP 和 MySQL Select 单个值

如何产生幻读?

执行语句还是运行脚本?

SQLite同时读写

PDO SQL 状态00000但仍然错误?

唯一(多列)并且在一列中为空

MySQL 整数 0 与 NULL

SQL Server Express LocalDB 可以远程连接吗?

关系未更新的 NSFetchedResultsController

如何修复 Postgres 上过时的 postmaster.pid 文件?

LevelDB 支持 java 吗?

无需安装的轻量级 SQL 数据库