跳转到主要内容

53200 — out_of_memory

PostgreSQL SQLSTATE 53200 的来源与诊断参考。

53200

速览

53200 是 PostgreSQL 的内存不足条件。固定调用者包括普通 memory context 分配、共享内存和锁表容量、扩展/统计文件读取以及 WAL 读取处理器;应诊断具体操作和分配上下文,不能把所有内存失败归为一个原因。

字段
SQLSTATE 53200
条件名 out_of_memory
状态 有效
已知存在于 7.4
锁定快照 9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3
ERRCODE_OUT_OF_MEMORY
别名

含义

固定源码有几类不同边界:MemoryContextAllocationFailure 报告带请求大小和 memory context 名称的 out of memoryShmemAlloc 和锁表建立路径报告 out of shared memory,后者可能提示 max_locks_per_transaction。扩展路径把操作写入 detail:pg_stat_statementsout of memory 记录文件读取分配失败,WAL reader 也以相同 primary 搭配分配 detail。pg_stat_statements 这一分支的 severity 是 LOG,并从加载器返回,因此不等同于使客户端当前事务中止的 ERROR;核心和 WAL reader 的 ERROR 分支才需要正常事务恢复。两阶段事务源码路径实际是 WAL reader 分配路径,不能据此说达到 max_prepared_transactions 本身就发出 53200。

诊断

保留 severity、primary、detail、hint、操作、backend 和服务器日志,判断是在 backend memory context、共享内存/锁表、文件/统计结构还是 WAL reader 分配。若 primary 为 out of shared memory 且 hint 指向 max_locks_per_transaction,检查持锁事务与锁表配置;提高它会在启动时消耗共享内存。不要只凭 SQLSTATE 推断主机内存。

处理

确认平台限制和影响后,再降低或重塑操作、释放应用压力或调整消息指向的容量。先结束或回滚持有过多锁的事务,再考虑调整 max_locks_per_transaction;该 hint 不等于操作系统 OOM。文件/WAL/统计操作失败后先验证对象。核心/WAL reader 的 ERROR 会使显式事务失败,重试前执行 ROLLBACKROLLBACK TO SAVEPOINT;自动提交只有在分配原因修复后才能重试。pg_stat_statementsLOG 分支属于后台加载器,本身不要求客户端恢复事务。本页不在真实主机制造 OOM。

版本

锁定目录从 7.4 记录;引用扩展和核心路径来自 PostgreSQL 18.6,未执行 OOM 运行。

530005340055000

来源

contrib/pg_stat_statements/pg_stat_statements.c#L2340-L2350

contrib/pg_walinspect/pg_walinspect.c#L121-L124

src/backend/access/transam/twophase.c#L1417-L1420

src/backend/utils/mmgr/aset.c#L444-L453

src/backend/utils/mmgr/mcxt.c#L1157-L1167

src/backend/storage/ipc/shmem.c#L151-L162

src/backend/storage/lmgr/lock.c#L2957-L2969

结构化证据记录保存固定消息以及源码/运行边界。