PostgreSQL 解决“其他用户正在使用数据库”实操记录 一、问题场景操作数据库gsearthquakeresponse-test2时系统提示“其他用户正在使用数据库”无法继续执行后续操作如数据库恢复、删除等需先释放占用的数据库连接。二、排查过程找到占用数据库的连接首先需要明确到底是哪个进程、哪个客户端在占用数据库连接。通过执行以下 SQL 语句可查看目标数据库的所有活跃连接信息SELECT pid, usename, datname, application_name, client_addr, state, queryFROM pg_stat_activityWHERE datname gsearthquakeresponse-test2;执行后得到如下查询结果33704 postgres gsearthquakeresponse-test2 Navicat 192.168.1.143 active SELECT pid, usename, datname, application_name, client_addr, state, queryFROM pg_stat_activityWHERE datname gsearthquakeresponse-test2从结果中可清晰看出关键信息占用进程 PID33704数据库用户postgres客户端工具Navicat自己正在使用的客户端客户端IP192.168.1.143连接状态active活跃状态结论本次占用数据库的是自己当前打开的 Navicat 连接并非其他用户只需终止该连接即可。三、解决步骤终止占用连接找到占用连接的 PID33704后执行以下 SQL 语句强制终止该连接SELECT pg_terminate_backend(33704);关键报错解读执行上述命令后系统提示如下“致命错误”很多人会误以为操作失败实则是成功的标志致命错误: 由于管理员命令中断联接时间: 0.015s解读该报错表示“连接已被管理员命令强制中断”即目标占用连接已成功终止数据库不再被占用。四、后续操作连接终止后无需额外操作直接回到原本的需求场景删除数据库、pg_restore 恢复数据、修改数据库配置等即可正常执行不会再提示“其他用户正在使用数据库”。五、补充说明实用扩展若排查后发现是多个连接占用或需要批量终止所有外部连接可使用以下命令替换目标数据库名即可-- 批量终止 gsearthquakeresponse-test2 数据库的所有外部连接排除当前连接SELECT pg_terminate_backend(pid)FROM pg_stat_activityWHERE datname gsearthquakeresponse-test2AND pid pg_backend_pid();若需做数据库恢复、迁移等操作担心操作过程中有人重新连接占用可先禁止新连接操作完成后再恢复-- 1. 禁止新连接进入目标数据库UPDATE pg_database SET datallowconn false WHERE datname gsearthquakeresponse-test2;-- 2. 终止所有已存在的连接SELECT pg_terminate_backend(pid)FROM pg_stat_activityWHERE datname gsearthquakeresponse-test2AND pid pg_backend_pid();-- 3. 操作完成后恢复正常连接权限UPDATE pg_database SET datallowconn true WHERE datname gsearthquakeresponse-test2;六、总结遇到 PostgreSQL “其他用户正在使用数据库”的问题核心是找到占用连接的 PID 并终止无需复杂操作用 pg_stat_activity 视图排查占用连接获取 PID