文章目录
- 环境
- 症状
- 问题原因
- 解决方案
环境
系统平台:银河麒麟 (海光) 版本:4.5.8
症状
表执行insert时,提示could not read block 2394 in file “base/298783/598992”: read only 0 of 8192 bytes
问题原因
根据base/298783/598992查找到是数据表的文件损坏,不是索引,然后导致insert失败。
解决方案
1、如果损坏表中没有数据,则可以采取如下方案:
# 清空表数据同时会重置数据文件
truncate schemaname.tablename;
2、如果损坏表中有数据,则建议逻辑导出表结构及数据,然后对损坏表进行重命名以保留原表,再导入备份文件,详细如下:
1)逻辑导出损坏表的表结构和数据
# 备份为sql脚本的方式,方便查看表结构,适用于数据量小的表
pg_dump –U username –d dbname –t schemaname.tablename –Fp –v > xxx.sql
# 备份为backup文件的方式
pg_dump –U username –d dbname –t schemaname.tablename –Fc –v > xxx.backup
2)对损坏表重命名,同时也需要重命名约束、索引名等,否则下面导入时会提示已存在
alter table schemaname.损坏表 rename to schemaname.损坏表_bak;
alter index 损坏表索引 rename to 损坏表索引_bak;
3)导入备份的表结构和数据
# sql脚本的导入方式
psql –U username –d dbname –c "\\i xxx.sql"
# backup文件的导入方式
pg_restore –U username –d dbname –v xxx.backup


