一、坏块问题描述
磐维数据库存储发生故障,导致数据丢失,在启动过程中提示产生坏块无法启动,如下图:

二、排查处理阶段
1) 强制启动数据库
因系统产生的坏块导致无法启动,尝试通过修改 ignore_checksum_failure和zero_damaged_pages参数进行重启。
ignore_checksum_failure:设置读取数据时是否忽略校验信息检查失败(但仍然会告警),继续执行可能导致崩溃,传播或隐藏损坏数据,无法从远程节点恢复数据及其他严重问题。
取值范围: 布尔型
on表示忽略数据校验错误。
off表示数据校验错误正常报错。
默认值: off
zero_damaged_pages:控制检测导致磐维报告错误的损坏的页头,终止当前事务。设置为on时,会导致系统报告一个警告,把损坏的页面填充为零然后继续处理。这种行为会破坏数据,也就是所有在已经损坏页面上的行记录。但是它允许绕开坏页面然后从表中尚存的未损坏页面上继续检索数据行。因此它在因为硬件或者软件错误导致的崩溃中进行恢复是很有用的。通常不应该把它设置为on,除非不需要从崩溃的页面中恢复数据。
默认值: off
编辑postgresql.conf设置ignore_checksum_failure和zero_damaged_pages为on

通过以下命令启动数据库:
gs_ctl start -D start $datadir
2) 排查原因并处理
将告警的坏块id带进pg_class的relfilenode排查,如下图可查出其中一个引起坏块的原因为snap_global_statio_all_indexes这个索引:

通过rebuild index 命令重建snap_global_statio_all_indexes
ALTER INDEX snap_global_statio_all_indexes REBUILD;
其余的原因可参照select relname from pg_class where relfilenode=坏块id来定位。
3) 关闭参数并重启
解决完坏块问题后就可以修改ignore_checksum_failure和 zero_damaged_pages参数为off,并进行重启。




