无法向PostgreSQL表添加新行,报错:Could not read block 2 in file...
PostgreSQL 读取块错误的解决办法
这个错误说明PostgreSQL读取数据文件base/16385/16433的第2块时完全失败,只读到0字节,大概率是数据文件损坏或者底层存储出了问题,按下面的步骤排查修复:
先查存储是否正常
先检查磁盘有没有坏道、文件系统是否出错,用系统自带工具排查——Linux用fsck,Windows用磁盘检查工具,先排除硬件或文件系统层面的问题。找到损坏的数据库对象
用PostgreSQL内置函数定位这个文件对应的表或索引:SELECT relname, relkind FROM pg_class WHERE relfilenode = 16433;执行后就能知道是哪个表(relkind为'r')还是索引(relkind为'i')出了问题。
针对性修复
- 如果是索引损坏:直接删了重建就行,比如找到索引名是
idx_user_id,执行:DROP INDEX idx_user_id; CREATE INDEX idx_user_id ON your_table (user_id); - 如果是表损坏:
- 先试试用
pg_dump导出该表数据,能导出的话就建个新表把数据导进去,再替换原表; - 要是导出失败,
pg_resetwal是最后手段(会丢数据,一定要先备份整个数据目录):先停PostgreSQL服务,运行pg_resetwal -D /var/lib/postgresql/14/main(替换成你的数据目录),重启服务后再尝试恢复。
- 先试试用
- 如果是索引损坏:直接删了重建就行,比如找到索引名是
优先用备份恢复
要是有最近的全量备份加增量备份,直接恢复到备份状态,这是最稳妥的方式,能最大程度保证数据安全。
内容的提问来源于stack exchange,提问作者Aung
相关产品推荐
相关产品推荐

