加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 强制drop db而其他人可能已连接

发布时间:2020-12-13 16:22:44 所属栏目:百科 来源:网络整理
导读:我需要从PostgreSQL数据库集群中删除数据库.即使有活动连接,我怎么能这样做?我需要一种-force标志,它会丢弃所有连接,然后是数据库. 我该如何实现它? 我目前正在使用dropdb,但其他工具也是可行的. 从版本9.5开始,当客户端连接到Postgres数据库时,只能使用 d
我需要从PostgreSQL数据库集群中删除数据库.即使有活动连接,我怎么能这样做?我需要一种-force标志,它会丢弃所有连接,然后是数据库.

我该如何实现它?

我目前正在使用dropdb,但其他工具也是可行的.

从版本9.5开始,当客户端连接到Postgres数据库时,只能使用 dropdb实用程序 – 这是一个围绕 DROP DATABASE服务器查询的简单包装器.

相当强大的解决方法如下:

使用psql或其他客户端以超级用户身份连接到服务器.不要使用要删除的数据库.

psql -h localhost postgres postgres

现在使用纯数据库客户端,您可以使用三个简单步骤强制删除数据库

>确保没有人可以连接到此数据库.您可以使用以下方法之一(第二种方法似乎更安全,但不会阻止来自超级用户的连接).

/* Method 1: update system catalog */
UPDATE pg_database SET datallowconn = 'false' WHERE datname = 'mydb';

/* Method 2: use ALTER DATABASE. Superusers still can connect! */
ALTER DATABASE mydb CONNECTION LIMIT 0;

>使用pg_terminate_backend强制断开连接到此数据库的所有客户端.

SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'mydb';

对于旧版本的PostgreSQL(最高9.1),将pid更改为procpid:

SELECT pg_terminate_backend(procpid)
FROM pg_stat_activity
WHERE datname = 'mydb';

>删除数据库.

DROP DATABASE mydb;

步骤1需要第一个方法的超级用户权限和第二个方法的数据库所有者权限.第2步需要超级用户权限.步骤3需要数据库所有者权限.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读