SheepDog1998

博客园 首页 新随笔 联系 订阅 管理

PostgreSQL 解决“其他用户正在使用数据库”实操记录

日常操作 PostgreSQL 数据库时,经常会遇到“其他用户正在使用数据库”的提示,导致无法执行删除、恢复、修改数据库等关键操作。本次就以实际遇到的问题为例,记录完整的排查、解决过程,方便后续遇到同类问题快速复用。

一、问题场景

操作数据库 gsearthquakeresponse-test2 时,系统提示“其他用户正在使用数据库”,无法继续执行后续操作(如数据库恢复、删除等),需先释放占用的数据库连接。

二、排查过程:找到占用数据库的连接

首先需要明确,到底是哪个进程、哪个客户端在占用数据库连接。通过执行以下 SQL 语句,可查看目标数据库的所有活跃连接信息:

SELECT pid, usename, datname, application_name, client_addr, state, query
FROM pg_stat_activity
WHERE datname = 'gsearthquakeresponse-test2';

执行后,得到如下查询结果:

33704    postgres    gsearthquakeresponse-test2    Navicat    192.168.1.143    active    SELECT pid, usename, datname, application_name, client_addr, state, query
FROM pg_stat_activity
WHERE datname = 'gsearthquakeresponse-test2'

从结果中可清晰看出关键信息:

  • 占用进程 PID:33704

  • 数据库用户:postgres

  • 客户端工具:Navicat(自己正在使用的客户端)

  • 客户端IP:192.168.1.143

  • 连接状态:active(活跃状态)

结论:本次占用数据库的是自己当前打开的 Navicat 连接,并非其他用户,只需终止该连接即可。

三、解决步骤:终止占用连接

找到占用连接的 PID(33704)后,执行以下 SQL 语句,强制终止该连接:

SELECT pg_terminate_backend(33704);

关键报错解读

执行上述命令后,系统提示如下“致命错误”,很多人会误以为操作失败,实则是成功的标志:

致命错误:  由于管理员命令中断联接
时间: 0.015s

解读:该报错表示“连接已被管理员命令强制中断”,即目标占用连接已成功终止,数据库不再被占用。

四、后续操作

连接终止后,无需额外操作,直接回到原本的需求场景(删除数据库、pg_restore 恢复数据、修改数据库配置等),即可正常执行,不会再提示“其他用户正在使用数据库”。

五、补充说明(实用扩展)

若排查后发现是多个连接占用,或需要批量终止所有外部连接,可使用以下命令(替换目标数据库名即可):

-- 批量终止 gsearthquakeresponse-test2 数据库的所有外部连接(排除当前连接)
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'gsearthquakeresponse-test2'
  AND pid <> pg_backend_pid();

若需做数据库恢复、迁移等操作,担心操作过程中有人重新连接占用,可先禁止新连接,操作完成后再恢复:

-- 1. 禁止新连接进入目标数据库
UPDATE pg_database SET datallowconn = false WHERE datname = 'gsearthquakeresponse-test2';

-- 2. 终止所有已存在的连接
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'gsearthquakeresponse-test2'
  AND pid <> pg_backend_pid();

-- 3. 操作完成后,恢复正常连接权限
UPDATE pg_database SET datallowconn = true WHERE datname = 'gsearthquakeresponse-test2';

六、总结

遇到 PostgreSQL “其他用户正在使用数据库”的问题,核心是找到占用连接的 PID 并终止,无需复杂操作:

  1. 用 pg_stat_activity 视图排查占用连接,获取 PID;

  2. 用 pg_terminate_backend(PID) 终止对应连接;

  3. “致命错误: 由于管理员命令中断联接”是正常报错,代表连接终止成功。

本次问题虽为自己的 Navicat 连接占用,但排查逻辑适用于所有同类场景,记录下来,下次遇到可直接套用命令,提高效率。

posted on 2026-04-01 09:31  SheepDog1998  阅读(8)  评论(0)    收藏  举报