一、修复策略
1、有备份使用备份恢复
备份包括:备份+归档
2、跳过坏快参数
ignore_checksum_failure、zero_damaged_pages,恢复后会丢失部分数据
ignore_checksum_failure (boolean)
只有当data checksums被启用时才有效。在读取过程中检测到一次校验码失败通常会导致PostgreSQL报告一个错误。设置ignore_checksum_failure为打开会导致系统忽略失败(但是仍然报告一个警告),并
且继续执行。这种行为可能导致崩溃、传播或隐藏损坏或者其他严重的问题。但是,它允许你绕过错误并且在块头部仍然健全的情况下从表中检索未损坏的元组。如果头部被损坏,即便这个选项被启用系统也将报告一个错误。默认设置是off,并且只能被超级用户改变。
zero_damaged_pages (boolean)
检测到一个损坏的页面头部通常会导致PostgreSQL报告一个错误,并且中止当前事务。把zero_damaged_pages设置为打开会让系统报告一个警告、把损坏的页面填充零,然后继续处理。这种行为会毁掉数据,即被损坏页面上的所有行。但是它允许你绕开错误并且从可能存在表中的任何未损坏页面中检索行。如果由于一次硬件或软件错误而发生毁坏,这种方法可用于恢复数据。通常你不应该把它设置为打开,除非你已经彻底放弃从表的损坏页面中恢复数据。被填充零的页面不会被强制到磁盘上,因此我们推荐在再次关闭这个参数之前先重建表或索引。默认的设置是off,并且只有超级用户可以改变它。
磁盘出问题,导致日志坏快,配置此参数,未成功
3、修复坏快
使用dd 重写,恢复后,会丢失部分数据
二、坏快分类
1、索引坏快
修复方法:
可以直接重建索引
2、数据文件坏快
常见数据也损坏:
could not read block N of relation X/Y/Z: read only 0 of 8192 bytes catalog is missing N attribute(s) for relid M WARNING: page verification failed, calculated checksum %u but expected %u ERROR: invalid page in block %u of relation %s
修复方法:
1)ignore_checksum_failure加zero_damaged_pages
此方法如果在数据库无法开启的情况下,可能无法使用,待确认。。。
2)dd重写数据文件
根据报错,找到对应的文件
使用dd方法新建损坏的文件(空文件)
3、日志文件坏快
暂时未遇到这种情况
注意:日志文件损坏,可能导致数据库无法启动,如果没有备份,可用dd重写(清空)损坏的日志文件
参考文档:
postgreSQL 常见数据页损坏坏块问题
http://www.askmac.cn/archives/postgresql-corruption.html
PostgreSQL checksum
https://blog.csdn.net/weixin_34122548/article/details/89595195