# [FAQ] TiDB 告警 TiDB_tikvclient_region_err_total 提示 epoch_not_match 错误

## Key Words

epoch_not_match, EpochNotMatch

## Description

关于 TiDB 访问 TiKV 发生 Region 报错的告警规则详见：[TiDB_tikvclient_region_err_total](https://docs.pingcap.com/zh/tidb/stable/alert-rules#tidb_tikvclient_region_err_total)，监控指标对应的面板位于 {cluster-name} - TiDB Dashboard 下面的 KV Errors - TiClient Region Error OPS。之所以会出现 Region 报错，是因为 TiDB server 是根据自己缓存的 region cache 路由信息去请求 Region，当 Region 发生调度或变更，TiKV 的当前 Region 信息与 TiDB 缓存的信息不一致，就会出现错误提示，通常这类报错可通过内部 backoff 重试消除，避免错误直接返回给客户端。

## Content

epoch_not_match/EpochNotMatch 是 Region 报错中的一种（其他类型错误详见[代码](https://github.com/tikv/client-go/blob/v2.0.3/internal/locate/region_request.go#L1367-L1404)），由 TiKV RaftStore 报出，表示 Region 的版本过期，需要进行 backoff 重试。

具体检查机制：

1. 每个 Region 都包含 Epoch 信息，包括两个字段:

    - conf_ver 代表 Region 配置的版本号，在新增或删除 peer 时，该版本号会递增

    - version 代表 Region 的当前版本号，当 region 被合并或分裂时，该版本号会递增

    这两个字段记录在 information_schema.tikv_region_status 视图的 EPOCH_CONF_VER 和 EPOCH_VERSION

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

3. TiDB 在收到 EpochNotMatch 错误后：

    - 如果 EpochNotMatch 中提供的 region 信息比当前 TiDB 已知的 region epoch 更旧（[tidb #9181](https://github.com/pingcap/tidb/pull/9181)），会尝试 backoff 重试

    - 如果 EpochNotMatch 中提供的 region 信息比当前新，则会用 EpochNotMatch 中的 region 信息更新当前 region cache，之后重新发送请求

遇到 epoch_not_match 错误告警时，可以检查 TiDB 监控 KV Errors 相关 backoff 面板，重试次数和重试时长是否比较高，以及对 TiDB Duration 的影响程度。如果影响不大且告警比较频繁，可以临时调大 TiDB_tikvclient_region_err_total 告警阈值。如果明显影响到数据库性能，可以进一步调查 TiKV 侧的监控和日志，分析可能的原因，例如近期是否发生频繁的调度，是否存在大量的 region 合并或分裂等。

相关 case study：<https://github.com/pingcap/tidb-map/blob/master/maps/diagnose-case-study/case958.md>

## Affected Versions

ALL
