文档 / SQL 状态码 / Class 58 系统错误
58000 system_error
ERROR 源码确认 参考 未实测
- 条件名
system_error- 宏名称
ERRCODE_SYSTEM_ERROR- 启用版本
- 9.2
- 状态
- 活跃
版本覆盖
速览
58000 是 system-error 条件。在固定 backend 路径中,pg_promote 创建 promotion signal 文件后调用 kill(PostmasterPid, SIGUSR1);信号发送失败时以 ERROR 报告,并把操作系统的 %m 文本展开到消息中。
含义
代表性 backend primary 是 failed to send signal to postmaster: %m。代码在报告 ERROR 前先删除 promotion signal 文件,所以这里是 postmaster 通知路径中的系统调用失败,不是用户值或 SQL 语法错误。共享的 common/exec.c 使用 log_error 宏,并有两个编译时分支:非 FRONTEND 构建展开为 ereport(LOG, (errcodefn, errmsg_internal(...)));FRONTEND 构建忽略 errcode() 参数,把格式化文本写到 stderr。因此 frontend 工具消息不能证明存在客户端协议 58000 诊断,也不能证明客户端事务已回滚。common/logging.h 中独立的 pg_log_error 宏才映射到 PG_LOG_ERROR,但 pclose_check() 并不调用它。
消息
- backend
pg_promote信号路径:primary 为failed to send signal to postmaster: %m,severity 为 ERROR;展开文本取决于失败kill()调用当时的 OSerrno。 - 共享的
pclose_check()源码:调用点模板是%s() failed: %m;对pclose()会展开为pclose() failed: <OS 文本>。非 FRONTEND 构建经ereport(LOG)携带传入的ERRCODE_SYSTEM_ERROR;FRONTEND 构建忽略该 code、直接写 stderr,因此不是客户端协议58000路径。
报文模板
源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。
failed to send signal to postmaster: %m
%s() failed: %m
来源:src/common/exec.c @ REL_18_6 · src/common/exec.c @ REL_18_6
诊断
保留 %m 展开后的完整 primary、操作类型(promotion signal、pclose 或其他系统 helper)、进程身份及服务器或工具日志上下文。对 backend pg_promote,检查 postmaster PID、信号权限/进程存活状态和 OS 错误。没有实际 errno 时,不要把系统错误替换成笼统的磁盘、权限或进程诊断;单凭 SQLSTATE 也不能判断事务结果。
处理
先修正展开消息所指出的操作系统条件,再确认 postmaster/服务器健康后重试。backend ERROR 通常会使当前显式事务进入错误状态,继续前先执行 ROLLBACK 或 ROLLBACK TO SAVEPOINT;autocommit 下也应在原因修正后再重试。pclose_check 的 frontend 日志由工具自身控制流处理,不应据此要求 SQL 回滚。若连接已断开,待服务器 ready 后重连并核对业务效果。
版本
锁定目录从 9.2.0 记录此条件;该目录边界不等于精确实现引入版本。固定源码覆盖 PostgreSQL 18.6。
来源
- 上游源码 src/backend/utils/errcodes.txt 第 444 行
- 上游源码 src/backend/access/transam/xlogfuncs.c 第 706 行
- 上游源码 src/common/exec.c 第 391 行
- 上游源码 src/include/common/logging.h 第 106 行
- 上游源码 src/common/exec.c 第 52 行
证据
断言
每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。
-
58000 is system_error in SQLSTATE Class 58.
-
The fixed backend pg_promote path reports ERROR with ERRCODE_SYSTEM_ERROR; the shared pclose_check source has separate non-FRONTEND ereport(LOG) and FRONTEND stderr macro branches, so frontend output is not asserted as a client-protocol 58000 response.
-
The locked catalogue records 58000 from 9.2.0; that boundary does not prove exact implementation introduction.
同类 SQL 状态码
| 状态码 | 条件名 | 宏名称 | 严重等级 | 版本 |
|---|---|---|---|---|
| 58000 | system_error | ERRCODE_SYSTEM_ERROR |
ERROR | 9.2 |
| 外部系统调用失败,如发送信号返回错误。 | 活跃 | |||
| 58030 | io_error | ERRCODE_IO_ERROR |
ERROR | 7.4 |
| 文件读写发生 I/O 错误,如缓冲区写回失败。 | 活跃 | |||
| 58P01 | undefined_file | ERRCODE_UNDEFINED_FILE |
ERROR | 7.4 |
| 所需的文件或目录不存在,如表空间路径缺失。 | 活跃 | |||
| 58P02 | duplicate_file | ERRCODE_DUPLICATE_FILE |
ERROR | 7.4 |
| 目标文件或目录已存在且非空,无法创建。 | 活跃 | |||
| 58P03 | file_name_too_long | ERRCODE_FILE_NAME_TOO_LONG |
ERROR | 18 |
| 文件访问因路径名过长失败,对应 ENAMETOOLONG。 | 活跃 | |||