表文件损坏问题
问题描述
执行SQL报错,ERROR: could not read block 2 in file "base/xxx/xxx":read only 0 of 8192 bytes。报错信息和表文件损坏一样。
可能影响
SQL执行如果使用到坏块则会报错。
解决步骤
- 表文件损坏,通常需要从备份文件中恢复;
- 如没有备份数据,可通过设置设置参数zero_damaged_pages=true来跳过坏块;
- 通过base/xxx/xxx中的xxx定位到具体的对象, 其中第一个数字为database的oid,第二个数字为表的oid;
查看对应数据库SQL:
select datname from pg_database where oid=xxx;
查看对应表SQL:
select xxx::regclass;
- 将该表数据导出,truncate或重建表后再导入数据。
索引文件损坏问题
问题描述
SQL报错,ERROR: could not read block 2 in file "base/xxx/xxx":read only 0 of 8192 bytes。报错信息和表文件损坏一样。
可能影响
SQL执行如果使用到该索引则可能会报错。
解决步骤
- 索引文件损坏,通常可以通过重建索引解决;
- 通过base/xxx/xxx中的xxx定位到具体的对象, 其中第一个数字为database的oid,第二个数字为索引的oid;
查看对应数据库SQL:
select datname from pg_database where oid=xxx;
查看对应索引SQL:
select xxx::regclass;
- 重建索引reindex index xxx;
- 系统表索引文件损坏,还可以通过设置参数ignore_system_indexes暂时忽略损毁的系统索引,然后再重建系统索引。
toast表文件损坏问题
问题描述
SQL报错,如: missing chunk number 0 for toast value xxx in pg_toast_xxx。
可能影响
toast表坏块相关的记录操作报错;
解决步骤
- 通过报错中pg_toast_xxx中的xxx(这里是表的oid)找到对应的表;例如,oid为34458,那么通过 select 34458::regclass; 可以查到34458对应的表;
teledb=# select 34458::regclass;
regclass
-----------
test_varchar2
(1 row)
- 对该表执行VACUUM ANALYZE, VACUUM ANALYZE test_varchar2;
- 通常vacuum成功后问题可解决,如果仍有问题,可尝试重建该表索引、vacuum full表等方法修复;有备份的话可以重建表重新加载数据;也可以尝试设置zero_damaged_pages参数来跳过错误的数据块。