使用DBeaver删除Postgres数据库
使用DBeaver删除Postgres数据库
我需要写一个脚本来删除一个 PostgreSQL 数据库。可能会存在很多连接,但是脚本应该忽略它们。
当存在打开的连接时,标准的DROP DATABASE db_name
查询将不起作用。
我该如何解决这个问题?
admin 更改状态以发布 2023年5月23日
在 PostgreSQL 9.2 及以上版本中,断开除当前会话外其他连接到同一数据库的所有连接:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE datname = current_database() AND pid <> pg_backend_pid();
在较早的版本中,要做同样的操作,只需将 pid
更改为 procpid
即可。要从另一个数据库断开连接,只需将 current_database()
更改为您想要断开用户连接的数据库名称。
在断开用户连接之前,您可能需要从数据库用户中 REVOKE
CONNECT
权限,否则用户仍会继续重新连接,您就永远无法有机会将该数据库删除。参见此评论以及与其相关联的问题如何从数据库中分离所有其他用户。
如果您只想断开空闲用户的连接,请参见此问题。
这将中止除你之外的所有现有连接:
查询pg_stat_activity
并获取您想要关闭的pid值,然后向它们发出SELECT pg_terminate_backend(pid int)
。
PostgreSQL 9.2及以上版本:
SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'TARGET_DB' -- ← change this to your DB AND pid <> pg_backend_pid();
PostgreSQL 9.1及以下版本:
SELECT pg_terminate_backend(pg_stat_activity.procpid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'TARGET_DB' -- ← change this to your DB AND procpid <> pg_backend_pid();
一旦您断开了所有人的连接,就必须从另一个数据库的连接中断开并发出DROP DATABASE命令,而不是您要删除的那个数据库。
请注意procpid
列的重命名为pid
。 请参见这个邮件列表线程。