PG11升级至PG14时pg_upgrade报错:postgres数据库被其他用户访问
PG升级时DROP postgres库报错的原因分析
核心原因
- 外部数据包装器(FDW)的连接即使状态显示非活跃,依然属于绑定到
postgres数据库的有效会话,会被PostgreSQL计入数据库的连接计数中。 DROP DATABASE操作的硬性要求是:目标数据库不能有任何关联的会话(无论会话是活跃还是闲置状态)。只要有会话存在,哪怕处于idle状态,都会阻止删除操作执行。- 你查询到的那条FDW连接,就是导致报错的直接原因——它虽然状态非活跃,但仍然占用着
postgres数据库的连接资源。
验证方式
可以执行以下SQL,精准筛选出除当前查询会话外,所有连接到postgres的会话:
SELECT pid, datname, state, usename, application_name FROM pg_stat_activity WHERE datname = 'postgres' AND pid != pg_backend_pid();
执行结果中会包含那条FDW连接,确认它确实属于postgres数据库的关联会话。
解决步骤
- 先终止所有连接到
postgres的非必要会话(包括FDW连接):SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'postgres' AND pid != pg_backend_pid(); - 执行
pg_upgrade前,确保数据库没有任何外部连接(包括应用、监控工具、FDW等),必要时可以切换到单用户模式操作。
内容的提问来源于stack exchange,提问作者user19868155
相关产品推荐
相关产品推荐

