选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 错误代码 / Class 58 系统错误

58030 io_error

ERROR 源码确认 详解 未实测

类别
Class 58 系统错误
严重等级
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.cERROR 报告 could not extend file "%s": %m 并调用 errcode_for_file_access();保存的 errno 为 EIO 时映射到 58030,为 ENOSPC 时映射到 53100。这个原始 ERROR 可能使客户端语句失败并令显式事务进入失败状态;它与 AbortBufferIO 后续重复失败的 WARNING 是不同的发出路径。

消息

  • WARNING,SQLSTATE 58030could 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 时为 58030could 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
DETAIL Multiple failures --- write error might be permanent.
CONTEXT 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
HINT Check free disk space.

来源:src/backend/storage/smgr/md.c @ REL_18_6

诊断

保留完整错误链、第一次写错误、该 warning、日志上下文、关系 fork 和数据块、文件系统/设备 errno、挂载状态,以及 WAL 或副本是否确认写入。确认是后端语句、检查点、后台写进程还是其他服务器路径;源码核验不能代替特定部署的存储定位。

处理

存储路径不健康时停止重试,检查挂载、设备、权限、空间/配额及存储日志,并在修复前保留关系与副本证据。扩展关系的 ERROR 可能令显式客户端事务失败,继续发 SQL 前先 ROLLBACK 或回到已经建立的保存点;AbortBufferIO 的重复失败 WARNING 本身不要求客户端回滚,但仍需修复存储并确认持久性。原因修复后仅按幂等边界重试整个工作单元;后端/服务器已停止时使用新连接,并在重放前确认提交状态。

版本

锁定目录从 7.4 记录此条件;固定机制和消息角色来自 PostgreSQL 18.6。本源码条目没有诱发自然 I/O 故障。

来源

证据

断言

每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。

  • 58030 is io_error in SQLSTATE Class 58.

    核实方式Read locked definition snapshot.

    来源src/backend/utils/errcodes.txt

  • 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.

    核实方式Read the complete fixed write and error-unwind contexts.

    不覆盖Source confirmation is not natural runtime.

    来源src/backend/storage/buffer/bufmgr.c · src/backend/storage/buffer/bufmgr.c

  • 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.

    核实方式Read the complete negative-write branch and the saved-errno switch.

    不覆盖The source establishes message roles and code mapping, not a natural I/O failure on a host.

    来源src/backend/storage/smgr/md.c · src/backend/utils/error/elog.c

  • The locked catalogue records 58030 from 7.4; it does not prove the exact introduction or every historical emitter.

    核实方式Use locked catalogue boundary.

    来源src/backend/utils/errcodes.txt

同类错误代码

Class 58 系统错误 下的其他成员。