记一次sst文件损坏修复过程

作者: 像风一样的男子 原文来源: https://tidb.net/blog/54e388c8

一、背景

【2023-07-14 14:26:28】应用系统报警删除数据失败,查看日志报Region is unavailable,同时企业微信群也收到数据库告警信息。

image.png

记一次sst文件损坏修复过程_第1张图片

二、问题定位

首先查看集群进程都正常,登录tidb dashboard查看日志。

记一次sst文件损坏修复过程_第2张图片

记一次sst文件损坏修复过程_第3张图片

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

记一次sst文件损坏修复过程_第4张图片

通过pd-ctl查看region详情

记一次sst文件损坏修复过程_第5张图片

发现region正常,通过navicat查询上面删除数据一切正常,手动删除数据也正常,因为这张表插入删除数据很频繁,一度以为是中奖了,正好在region分裂、合并时访问到这个region导致删除失败的。

直到2023-07-15日查看tidb日志发现又有同样情况出现,继续深入查看发现是同一个kv报错,如下截图是日志信息

记一次sst文件损坏修复过程_第6张图片

这时候社区大佬提醒是不是有sst文件出现了损坏,建议停止该kv逐个检查sst文件。

三、修复

官方文档提供了修复损坏的 SST的方法。

记一次sst文件损坏修复过程_第7张图片

根据官方文档提供的命令使用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

记一次sst文件损坏修复过程_第8张图片

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

记一次sst文件损坏修复过程_第9张图片

第一步:删除损坏的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处理成功,这里建议官方能把这块的文档完善下(也有可能是我用的版本太老了)。

记一次sst文件损坏修复过程_第10张图片

至此官方建议的修复步骤就执行完了,重启tikv节点。

查看之前访问报错的数据已经正常。

然后再看了下kv节点的日志,发现一直在循环刷同一段日志,而且tidb告警信息PD_down_peer_region_nums还是一直在推送。

记一次sst文件损坏修复过程_第11张图片

记一次sst文件损坏修复过程_第12张图片

在pd监控大屏healthregion中发现有82个region处于down_peer_region 状态

通过 pd-ctl 的 region check down-peer查看副本状态为 Down 的 Region,通过region命令查看region的down_peer的store_id 为刚修复的tikv节点。

记一次sst文件损坏修复过程_第13张图片

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

记一次sst文件损坏修复过程_第14张图片

不用担心region只有2个副本会出问题,pd会自动复制一份副本到其他kv节点。

至此整个修复完成,集群恢复正常。

你可能感兴趣的:(记一次sst文件损坏修复过程)