select报错9005 - Region is unavailable

在查找数据库中某一批数据时,总是查询40秒后报 【9005 - Region is unavailable】 的错误,查数据库中的其他数据正常。一共3个tikv,在其中一个tikv中有不少epoch_not_match的警告。

[2021/04/02 05:10:09.063 +00:00] [WARN] [endpoint.rs:527] [error-response] [err="Region error (will back off and retry) message: \"EpochNotMatch current epoch of region 4800001 is conf_ver: 5 version: 791, but you sent conf_ver: 11 version: 801\" epoch_not_match { current_regions { id: 4800001 start_key: 7480000000000006FF9C5F698000000000FF0000040419A8BC54FF7300000003B5C9ACFF1F2E801000000000FC end_key: 7480000000000006FF9C5F698000000000FF0000040419A922D2FF5B00000003B60551FF2EE6006000000000FC region_epoch { conf_ver: 5 version: 791 } peers { id: 4800002 store_id: 1 } peers { id: 4800003 store_id: 7001 } peers { id: 4800004 store_id: 7002 } } current_regions { id: 4602013 start_key: 7480000000000006FF9C5F698000000000FF0000040419A82AE1FF0400000003B596A4FFF70B806000000000FC end_key: 7480000000000006FF9C5F698000000000FF0000040419A8BC54FF7300000003B5C9ACFF1F2E801000000000FC region_epoch { conf_ver: 5 version: 790 } peers { id: 4602014 store_id: 1 } peers { id: 4602015 store_id: 7001 } peers { id: 4602016 store_id: 7002 } } }"]

怀疑是region 4800001出问题了,请问这个有没有办法恢复的?

如果无法恢复的话,有没有办法清掉那些有问题的数据,不然每次查都会等待40秒,然后报错。

EpochNotMatch:该错误是说 Region 的版本过期。

检查机制实现是,每个 Region 信息都有 Epoch 信息,包括两个字段:

  • conf_ver 代表配置项版本,新增或删除 peer 时,该属性会自增
  • version 代表 region 的版本,当 region 被合并或拆分时,该值会自增

TiDB 的在请求 TiKV 时会在请求中附上 Epoch,KV 会校验 Epoch 如果不匹配则返回 EpochNotMatch 错误, 并在错误中附带自己知道的最新 Region 信息。

如果使用了 TiDB 那么 TiDB 在收到报错后会进行 backoff 重试,不用特别担心,可以参考下:
https://docs.pingcap.com/zh/tidb/stable/tidb-troubleshooting-map#11-客户端报-region-is-unavailable-错误

你好,根据上面的链接,我的问题可能属于下面这种情况:
1.1.5 follower apply 落后,成为 Leader 之后把收到的请求以 epoch not match 理由打回,见案例 case-958(TiKV 内部需要优化该机制)。
这里我找不到处理问题的解决方案,我应该如何解决Region的版本过期的问题?
能修复最好,不能修复的话如何删掉它,不让它报 Region is Unavailable 的错误。

请问下你这边出现 epoch not match 时,前端和后端的报错信息和 case-958 都是吻合的吗?如果是的话需要排查下 apply 慢的原因,可以参考下:

如何看以前的日志的,由于tikv的pod删了重新生成过,对应的log也看不到了,但可以排除内存不足、没有leader、tikv busy的原因,因为目前运行良好,新生成的数据可用,也没有apply慢的情况,就是查固定某一批旧的数据的时候会报Region is Unavailable

有两个疑问地方:
1.固定查询某一批旧数据才会报错,是指查询特定表上符合特定条件的数据才报错吗?而查询表上其他数据都是正常的?
2.每次报 Region is Unavailable 时,日志里都是提示 EpochNotMatch 吗?还是说有其他报错信息。

1.不是每次都报,那可能不是epoch_not_match的问题?

2.是在查固定某个表的某些数据的时候报错,表上其他数据正常。

通过show table t regions查看,综合自己对报错数据的大致排查,怀疑表的id在38870941834579804343890916794226966566之间的数据有问题。

可以确定是id 在 38870941834579804343890916794226966566 之间的数据有问题了,我查id<3887094183457980434 的数据的数量和查id> 3890916794226966566 的数据的数量都没问题,但查id在 38870941834579804343890916794226966566 之间的数据的数量的时候报错了。

查id在 38870941834579804343890916794226966566 之间的数据报错内容是 epoch_not_match 还是其他报错内容?

id在 38870941834579804343890916794226966566 之间的数据用sql语句查的时候报 9005 - Region is unavailable
epoch_not_match是在tikv的日志里看到的,可能和Region is unavailable无关。
现在想解决的是Region is unavailable的问题,那批有问题的数据修复也修复不了,删也删不掉。sql语句去查询、修改、删除数据的时候,只要有牵扯到那批数据的,都会报 9005 - Region is unavailable 的错误。
另外用BR备份也会卡住,备份不了。

image

image

可以参考 https://docs.pingcap.com/zh/tidb/stable/tikv-control#tikv-control-使用说明 先查询 bad region,如果在某个节点损坏,看看是否有可能使用 unsafe recover 恢复,多谢。

你好,我查了所有3个tikv的 bad region, 都显示 all regions are healthy
会不会是region没有损坏,而是丢失了?如何找到丢失的region?

是tiup安装的吗? tiup ctl pd 命令查看下 region 看看 PD 里记录的信息

不是tiup安装,是部署在Kubernetes上的。
用pd-ctl查看region,输出了很多内容,我把它放到下面的文档里,看看我应该如何找出有问题的region?
region.txt (613.9 KB)

» region check miss-peer
{
“count”: 0,
“regions”: []
}

» region check down-peer
{
“count”: 0,
“regions”: []
}

» region check pending-peer
{
“count”: 0,
“regions”: []
}

  1. 可以帮忙再反馈下 show table region 吗?
  2. pd ctl 中查看您最早的标出的两个 region id ; region 460300 ,如果改变了,就根据当前的查,多谢。

region460300是null,但show table region能显示那个region。

» region sibling 460300
Failed to get region sibling: [404] “region 460300 not found”

» region sibling 480002
Failed to get region sibling: [404] “region 480002 not found”

» region 460300
null

感觉show table region时缩略了regionid的最后一位吧,问题region看上去可能是4800001。

» region sibling 4800001
{
“count”: 2,
“regions”: [
{
“id”: 4603001,
“start_key”: “7480000000000006FF8D5F72B5E0978076FF0000010000000000FA”,
“end_key”: “7480000000000006FF8D5F72B5F1BB90ADFF8000120000000000FA”,
“epoch”: {
“conf_ver”: 11,
“version”: 800
},
“peers”: [
{
“id”: 4603002,
“store_id”: 1
},
{
“id”: 4603003,
“store_id”: 7001
},
{
“id”: 4603004,
“store_id”: 7002
}
],
“leader”: {
“id”: 4603003,
“store_id”: 7001
},
“written_bytes”: 221,
“read_bytes”: 0,
“written_keys”: 1,
“read_keys”: 0,
“approximate_size”: 93,
“approximate_keys”: 665234
},
{
“id”: 4800025,
“start_key”: “7480000000000006FF8D5F72B5FF50359AFF8000260000000000FA”,
“end_key”: “7480000000000006FF8D5F72B60B324DDCFF0000020000000000FA”,
“epoch”: {
“conf_ver”: 11,
“version”: 802
},
“peers”: [
{
“id”: 4800026,
“store_id”: 1
},
{
“id”: 4800027,
“store_id”: 7001
},
{
“id”: 4800028,
“store_id”: 7002
}
],
“leader”: {
“id”: 4800027,
“store_id”: 7001
},
“written_bytes”: 0,
“read_bytes”: 292,
“written_keys”: 0,
“read_keys”: 2,
“approximate_size”: 93,
“approximate_keys”: 663709
}
]
}

» region 4800001
{
“id”: 4800001,
“start_key”: “7480000000000006FF8D5F72B5F1BB90ADFF8000120000000000FA”,
“end_key”: “7480000000000006FF8D5F72B5FF50359AFF8000260000000000FA”,
“epoch”: {
“conf_ver”: 11,
“version”: 801
},
“peers”: [
{
“id”: 4800002,
“store_id”: 1
},
{
“id”: 4800003,
“store_id”: 7001
},
{
“id”: 4800004,
“store_id”: 7002
}
],
“written_bytes”: 0,
“read_bytes”: 0,
“written_keys”: 0,
“read_keys”: 0,
“approximate_size”: 0,
“approximate_keys”: 0
}

  1. 请问是什么版本?
  2. show table regions 的完整结果,麻烦上传下。

版本是v4.0.7。
show table regions 的完整结果如下:
tableregion.xls (53 KB)