使用 PostgreSQL,您可以发出以下语句来返回除此之外的所有打开连接的后端 pid:
SELECT pid FROM pg_stat_activity where pid <> pg_backend_pid();
然后您可以向每个后端发出终止请求
SELECT pg_terminate_backend($1);
将从第一条语句返回的 pid 绑定到每个 pg_terminate_backend exec。
如果其他连接没有使用与您相同的用户,则您必须以超级用户身份连接才能成功发出终止。
更新:合并评论并表达为 Capistrano 任务:
desc "Force disconnect of open backends and drop database"
task :force_close_and_drop_db do
dbname = 'your_database_name'
run "psql -U postgres",
:data => <<-"PSQL"
REVOKE CONNECT ON DATABASE #{dbname} FROM public;
ALTER DATABASE #{dbname} CONNECTION LIMIT 0;
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid <> pg_backend_pid()
AND datname='#{dbname}';
DROP DATABASE #{dbname};
PSQL
end