chunk状态PD恢复
chunk文件重命名、路径变更等误操作问题,会导致数据库服务无法找到对应文件,从而对 chunk 及 dbspaces 标记PD、ND。
即使恢复数据文件到原状态,重启服务,但 rootdbs 状态信息已经更改,需要手动更新状态码,才能重新启用该chunk。
检查需要修改的dbspace、chunk的状态码
检查 dbspace 状态 oncheck -pr
正常FLags 最后一位 1 ,当前为 5 ,需要修改。
正常 Flags最后两位40 ,当前为 20 ,需要修改。
定位涉及的页并导出修改
注:修改有问题的页即可,并非需要全部导出导入一遍。
dbspace 相关页
查看 dbspace 保留页 oncheck -pP 1 4
可见,有问题的dbspace 存放在 slot5 ,红框内容为Flags值 5060,查询该 slot 对应的偏移量。
1176为十进制数字,换算到十六进制为 498 ,即有问题的dbspace在该页的 498 行。
导出 dbspace 保留页
dd if=/opt/Gbase330/dbs/rootdbs bs=2k count=1 skip=4 of=page4
编辑 dbspace 保留页
根据偏移量 498 ,找到对应行,并修改。
导入到 rootdbs 块
dd if=page4 bs=2k count=1 seek=6 conv=notrunc of=/opt/Gbase330/dbs/rootdbs
chunk相关页
查看 chunk 保留页
rootdbs 中,头12页为保留页。包含 chunk 信息的保留页位置为 6、7。但是可能不足以存在所有chunk信息。因此,next 指向的页为扩展存储chunk信息的保留页。
保留页 7 为 保留页 6 的备份,均需修改。以下例子仅举其一修改过程。
图中所示十六进制数 7025 转换为十进制为 28709,查询对应页。
当前数据库服务拥有 7 个 chunk 文件,即一共有 7 个 slot 记录,一页最多 6 个 slot,因此页 6 有一个扩展页。找到有问题chunk对应的slot。
查询该 slot 的偏移量。
如图所示,存储该 slot 信息的位置为 页 6 偏移量 3A8 (十进制936)。页 6 的扩展页记录为 chunk 7 的信息,不涉及有问题的chunk,因此,无需导出。
导出 chunk 保留页
dd if=/opt/Gbase330/dbs/rootdbs bs=2k count=1 skip=6 of=page6
dd if=/opt/Gbase330/dbs/rootdbs bs=2k count=1 skip=7 of=page7
编辑 chunk 保留页
根据偏移量 3A8,找到对应行,并修改。
导入到 rootdbs 块
dd if=page6 bs=2k count=1 seek=6 conv=notrunc of=/opt/Gbase330/dbs/rootdbs
dd if=page7 bs=2k count=1 seek=7 conv=notrunc of=/opt/Gbase330/dbs/rootdbs