# [Critical bug] TiDB 5.1.0通过快照同步数据后，TiFlash副本中的一些行可能会丢失

## Issue

上周在内部测试中，我们发现了 5.1.0 版本中， TiFlash 一些行数据可能丢失，导致查询结果与 TiKV 不一致。

### 问题现象

在同一个事务中，使用 set session tidb_isolation_read_engines = "tikv" ; select count(*) from {table-name}; 以及 set session tidb_isolation_read_engines = "tiflash"; select count(*) from {table-name};，分别从 TiKV、TiFlash 查询表的行数，TiFlash 的结果少于 TiKV 的结果。

如果用户设置了多个 TiFlash 副本，在同一个事务中，使用 set session tidb_isolation_read_engines = "tiflash"; select count(*) from {table-name};，从 TiFlash 进行多次查询，查询得到的行数不是固定的值。

## Root Cause

在新建 TiFlash 表副本或 Region 在 TiFlash 节点之间进行调度的过程中，TiFlash 会通过 Snapshot 的方式从 TiKV 同步 Region 的数据。

在 5.1.x 版本中，实现了 [Applying region snapshots optimization](https://internal.pingcap.net/jira/browse/FD-32)，为了优化 TiFlash 在 apply snapshot 同步数据时内存占用，对 Region 内不同 Column Family 的 key-value 分批加载到内存中。 加载到内存的 "default" Column Family 中的 key-value 对可能不足以满足 TiDB 的事务模型，导致 "write" Column Family 中的部分 key-value 被错误地抛弃。最终 decode 出来的 TiFlash 数据中，Region 中会缺少部分行的数据。

## Diagnostic Steps

Oncall issue: None. Found by internal testing.

Related detailed document:

inconsistency troubleshooting (in Chinese)

TiFlash PR: [https://github.com/pingcap/tics/pull/2504](https://github.com/pingcap/tics/pull/2504)

## Resolution

规避/解决方案：

不建议用户在 5.1.0 集群上建立 TiFlash 副本；

如果用户在 5.1.0 集群上已经有 TiFlash 副本，并且触发了此问题，首先需要将集群升级至 5.1.1 版本，然后：

如果用户可以接受重新建立 TiFlash 副本：使用 ALTER TABLE <table_name> SET TIFLASH REPLICA 0 去除 TiFlash 副本，等一个 GC lifetime 的时间以清理旧的 TiFlash 副本数据，再重新设置 TiFlash 的副本 *如果用户无法接受重新建立 TiFlash 副本的方法，请联系 Junshen Huang 或 Realtime Analytics 团队进一步支援。

## Workaround
