一、背景
【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节点。
至此整个修复完成,集群恢复正常。