由于磁盘坏道或者是内存问题等硬件上的原因,有时候会导致数据库的数据文件的一些数据块的损坏,使得某些表不能正常访问, 数据块的损坏一般只会影响到一个表,使得该表的数据不能查询或者是备份。
数据块的损坏的情形比较复杂,所以如何恢复,或者是能恢复到什么情形不能一概而论。最好的情况是丢失一个数据块里面的所有记录(也有可能只丢失某些记录,但是方法比较复杂),最坏也有可能整个表丢失。
最简单的方法是,用备份恢复!如果你有做备份和日志归档,则出现问题以后,恢复到最新即可。如果没有备份,则请参考下面的方法。
数据块头部损坏
例如:
select * from test ;
ERROR: invalid page header in block 1 of relation xxx;
方法:利用参数zero_damaged_pages,当这个参数为true的时候,会忽略所有数据有损坏的页面。
数据块数据部分损坏
例如:
select * from test ;
数据库down掉了。
方法:Select * from test offset xxx limit xxx;
上述两种方法都为了达到同一个结果,将没有损坏的数据尽可能的通过copy或者select的方式导出来,重建表。
注:依赖于此表的相关视图和索引也需要重建。