TiDB 删除一行时也需要把这一行读出来来保证 affected rows 准确,所以用 SQL 无法删除。一种恢复方法是用 tikv-ctl recover-mvcc 功能,它可以把不匹配的数据删掉,比如这里缺少 default 列的这一行。但这需要停机才能使用,为了减少影响可以这样操作:
- 找到那个 key 所在的 region 和 store。
- evict 其中一个 store 上的所有 leader,然后停掉该 store。
- 在停掉的 TiKV 上执行
tikv-ctl --db /path/to/tikv/db recover-mvcc -r {region_id} -p {pd_ip:port}
。 - 启动 TiKV 然后把 key 所在的 region leader 迁移到该 store 上。之后依次对其他 2 个 follower 做相同操作。