文档 / SQL 状态码 / Class 58 系统错误
58030 io_error
ERROR 源码确认 详解 未实测
- 条件名
io_error- 宏名称
ERRCODE_IO_ERROR- 启用版本
- 7.4
- 状态
- 活跃
版本覆盖
速览
58030 由共享缓冲区的一条特定清理路径发出:此前已经记录过写入失败,18.6 中该路径报告的是 WARNING,不是笼统的客户端 ERROR;消息保留数据块和关系对象信息,并提示重复失败可能是永久性的。
含义
FlushBuffer 启动共享缓冲区写入;永久关系会先刷新 WAL,然后调用 smgrwrite。异常展开进入缓冲区 I/O 的资源所有者回调时,AbortBufferIO 将缓冲区标为 BM_IO_ERROR。如果缓冲区仍有效且为脏页,并且这不是第一次失败,它以 WARNING 和 SQLSTATE 58030 报告,再以错误标记结束缓冲区 I/O。较早的 smgrwrite 失败才可能使客户端语句失败;后面的警告是重复失败通知,本身不能证明客户端事务已进入错误状态。
关系文本由缓冲区标记通过 relpathperm 生成;共享缓冲区写入的错误上下文还可能是 writing block %u of relation "%s"。因此它指出排查位置,但不保证只有该数据块受影响。
另一个存储管理器路径用 FileWrite 扩展关系段。如果该调用返回负值,md.c 以 ERROR 报告 could not extend file "%s": %m 并调用 errcode_for_file_access();保存的 errno 为 EIO 时映射到 58030,为 ENOSPC 时映射到 53100。这个原始 ERROR 可能使客户端语句失败并令显式事务进入失败状态;它与 AbortBufferIO 后续重复失败的 WARNING 是不同的发出路径。
消息
- WARNING,SQLSTATE
58030:could not write block %u of %s - DETAIL:
Multiple failures --- write error might be permanent. - 共享缓冲区写入周边的错误上下文:
writing block %u of relation "%s"。 - ERROR,SQLSTATE 由
errcode_for_file_access()选择;保存的 errno 为EIO时为58030:could not extend file "%s": %m - HINT:
Check free disk space.
第一次写失败可能有不同的主消息和 SQLSTATE,例如由 OS errno 辅助函数选择的代码。应把第一次记录与该警告一起保留。在扩展关系的路径中,EIO 明确选择该条件,而 ENOSPC 选择 53100;不能把这些 errno 分支都压成笼统的磁盘已满诊断。
报文模板
源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。
could not write block %u of %s
Multiple failures --- write error might be permanent.
writing block %u of relation "%s"
来源:src/backend/storage/buffer/bufmgr.c @ REL_18_6 · src/backend/storage/buffer/bufmgr.c @ REL_18_6
could not extend file "%s": %m
Check free disk space.
诊断
保留完整错误链、第一次写错误、该 warning、日志上下文、关系 fork 和数据块、文件系统/设备 errno、挂载状态,以及 WAL 或副本是否确认写入。确认是后端语句、检查点、后台写进程还是其他服务器路径;源码核验不能代替特定部署的存储定位。
处理
存储路径不健康时停止重试,检查挂载、设备、权限、空间/配额及存储日志,并在修复前保留关系与副本证据。扩展关系的 ERROR 可能令显式客户端事务失败,继续发 SQL 前先 ROLLBACK 或回到已经建立的保存点;AbortBufferIO 的重复失败 WARNING 本身不要求客户端回滚,但仍需修复存储并确认持久性。原因修复后仅按幂等边界重试整个工作单元;后端/服务器已停止时使用新连接,并在重放前确认提交状态。
版本
锁定目录从 7.4 记录此条件;固定机制和消息角色来自 PostgreSQL 18.6。本源码条目没有诱发自然 I/O 故障。
来源
- 上游源码 src/backend/utils/errcodes.txt 第 445 行
- 上游源码 src/backend/storage/buffer/bufmgr.c 第 4307 行
- 上游源码 src/backend/storage/buffer/bufmgr.c 第 6164 行
- 上游源码 src/backend/storage/smgr/md.c 第 512 行
- 上游源码 src/backend/utils/error/elog.c 第 867 行
证据
断言
每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。
-
58030 is io_error in SQLSTATE Class 58.
-
FlushBuffer writes a shared buffer through smgrwrite, and AbortBufferIO emits the fixed 58030 warning only after a prior I/O error is present on a valid dirty buffer.
-
The relation-extension FileWrite path emits ERROR with a %m primary and errcode_for_file_access(); saved EIO maps to 58030 and saved ENOSPC maps to 53100.
-
The locked catalogue records 58030 from 7.4; it does not prove the exact introduction or every historical emitter.
同类 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。 | 活跃 | |||