Postgres如何强制断开数据库连接并删除数据库

Postgres如何强制断开数据库连接并删除数据库

一、问题描述

在PostgreSQL中有时候我们需要把数据库删除重建,正常情况下我们执行以下语句:

drop database pro_1217;

会报错:

ERROR: database “pro_1217” is being accessed by other users 详细:There are 25 other sessions using the database.

image

意思就是有连接连着数据库,不能删除。

二、产生原因

产生这个问题的原因一般是因为有应用或者数据库连接池等进程连接着数据库,所以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的应用这个是无效的。

大T笔记所有文章均为本人原创,转载请您注明来源,并留下原文链接地址,是对我的尊重,也是对知识的尊重,谢谢!
大T笔记 » Postgres如何强制断开数据库连接并删除数据库

大T笔记-我的个人互联网创业和自由职业之路

关于我 我的百宝箱
大T笔记-专注个人互联网创业和自由职业