一、问题描述
在PostgreSQL中有时候我们需要把数据库删除重建,正常情况下我们执行以下语句:
drop database pro_1217;
会报错:
ERROR: database "pro_1217" is being accessed by other users 详细:There are 25 other sessions using the database.
意思就是有连接连着数据库,不能删除。
二、产生原因
产生这个问题的原因一般是因为有应用或者数据库连接池等进程连接着数据库,所以PostgreSQL数据库不允许直接删除。
三、解决办法
解决这个问题我们需要强制断开数据库连接,执行以下语句:
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = 'pro_1217'
AND pid <> pg_backend_pid();
解释:
- pg_terminate_backend:用来终止与数据库的连接的进程id的函数。
- pg_stat_activity:是一个系统表,用于存储服务进程的属性和状态。
- pg_backend_pid():是一个系统函数,获取附加到当前会话的服务器进程的ID。
执行这个语句后就可以使用drop database 删除数据库了。
注意:如果有数据库连接池,pgbouncer一类的,执行这个语句之后还会自动的连接数据库,所以对于有pgbouner的应用这个是无效的。