记一次 sst 文件损坏修复过程
作者: 像风一样的男子原文来源:https://tidb.net/blog/54e388c8
一、背景
【2023-07-14 14:26:28】应用系统报警删除数据失败,查看日志报 Region is unavailable,同时企业微信群也收到数据库告警信息。


二、问题定位
首先查看集群进程都正常,登录 tidb dashboard 查看日志。


登录 tidb 节点 10.20.10.127 查看详细日志,定位到是 region_id 是 2435254 出问题的

通过 pd-ctl 查看 region 详情

发现 region 正常,通过 navicat 查询上面删除数据一切正常,手动删除数据也正常,因为这张表插入删除数据很频繁,一度以为是中奖了,正好在 region 分裂、合并时访问到这个 region 导致删除失败的。
直到 2023-07-15 日查看 tidb 日志发现又有同样情况出现,继续深入查看发现是同一个 kv 报错,如下截图是日志信息

这时候社区大佬提醒是不是有 sst 文件出现了损坏,建议停止该 kv 逐个检查 sst 文件。
三、修复
官方文档提供了修复损坏的 SST 的方法。

根据官方文档提供的命令使用 bad-ssts 检测有问题的 sst 文件,尝试使用 –data-dir 指定 data-dir 目录报参数错误,使用了 tikv-ctl + –db 参数后执行正常。
tikv-ctl bad-ssts –db /data/tidb-data/tikv-20160/db –pd 10.20.10.63:2379

检查了一个多小时,有 10 个 sst 文件需要修复,并列出了操作建议。

第一步:删除损坏的 sst 文件
按照上述输出的建议命令执行 tikv-ctl ldb –db=/data/tidb-data/tikv-20160/db unsafe_remove_sst_file “/data/tidb-data/tikv-20160/db/10973719.sst”,报错:Failed: Failed to parse SST file number /data/tidb-data/tikv-20160/db/10973719.sst 。在社区中查看发现需要使用指定 sst 的文件号而不是文件名,使用 sst 文件号执行成功!
第二步从有问题的 tikv 上删除 sst 文件的 region peer
tikv-ctl –db=/data/tidb-data/tikv-20160/db tombstone -r 2336448 –pd
该命令同样在 –data-dir/–db/–pd 参数使用上报错,最后使用 tikv-ctl –data-dir=/data/tidb-data/tikv-20160 tombstone -r 2336448 –force 处理成功,这里建议官方能把这块的文档完善下(也有可能是我用的版本太老了)。

至此官方建议的修复步骤就执行完了,重启 tikv 节点。
查看之前访问报错的数据已经正常。
然后再看了下 kv 节点的日志,发现一直在循环刷同一段日志,而且 tidb 告警信息 PD_down_peer_region_nums 还是一直在推送。


在 pd 监控大屏 healthregion 中发现有 82 个 region 处于 down_peer_region 状态
通过 pd-ctl 的 region check down-peer 查看副本状态为 Down 的 Region,通过 region 命令查看 region 的 down_peer 的 store_id 为刚修复的 tikv 节点。

通过 pd-ctl operator add remove-peer 2556939 1133876 手动删除 tikv 中副本

不用担心 region 只有 2 个副本会出问题,pd 会自动复制一份副本到其他 kv 节点。
至此整个修复完成,集群恢复正常。
版权声明: 本文为 InfoQ 作者【TiDB 社区干货传送门】的原创文章。
原文链接:【http://xie.infoq.cn/article/48c09eade1dea9308c2732c0a】。文章转载请联系作者。
评论