侧边栏壁纸
博主头像
波哥

大龄程序猿&自由职业者&副业达人
爱好:敲代码、搞副业
12+年开发经验,热衷自动化网络推广!

  • 累计撰写 1,810 篇文章
  • 累计创建 77 个标签
  • 累计收到 13 条评论

目 录CONTENT

文章目录

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

波哥
2022-01-03 / 0 评论 / 1 点赞 / 1,264 阅读 / 0 字

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的应用这个是无效的。

1

评论区