tiflash节点缩容一直处于Pending Offline状态

使用tiflash的表已经不再使用,下线tiflash机器。我缩容的过程如下:
1)修改表tiflash副本为0
2)查看数据库已经没有使用tiflash
mysql> SELECT
→ TABLE_SCHEMA AS db_name,
→ TABLE_NAME AS table_name,
→ REPLICA_COUNT,
→ AVAILABLE
→ FROM information_schema.tiflash_replica;
Empty set (0.01 sec)
3)scale in 共7台tiflash
问题:
7台tiflash中的5台已经正常下线。有两台一直处于“Pending Offline” 状态,已经将近一周时间了。
看tiflash的日志,下面的日志一直在循环
[2026/04/03 06:32:40.839 +08:00] [WARN] [KVStore.cpp:151] [“tryFlushRegionCacheInStorage can not get table for region [region 1519893278, applied: term 101 index 151] with table id 58009, ignored”] [thread_id=5]
[2026/04/03 06:53:44.385 +08:00] [WARN] [KVStore.cpp:151] [“tryFlushRegionCacheInStorage can not get table for region [region 1519893054, applied: term 101 index 150] with table id 57981, ignored”] [thread_id=4]
[2026/04/03 06:53:45.482 +08:00] [WARN] [KVStore.cpp:151] [“tryFlushRegionCacheInStorage can not get table for region [region 1519893238, applied: term 111 index 166] with table id 58004, ignored”] [thread_id=5]
[2026/04/03 06:53:53.758 +08:00] [WARN] [KVStore.cpp:151] [“tryFlushRegionCacheInStorage can not get table for region [region 1519893174, applied: term 102 index 152] with table id 57996, ignored”] [thread_id=7]
[2026/04/03 07:07:15.822 +08:00] [WARN] [KVStore.cpp:151] [“tryFlushRegionCacheInStorage can not get table for region [region 1519893126, applied: term 93 index 139] with table id 57990, ignored”] [thread_id=4]

有知道原因的吗?该如何做?

  • 表已删 / 元数据丢失

  • 日志 can not get table for region ... with table id 58009 说明:TiFlash 收到某个 Region 的数据,但对应表 ID 58009 已经不存在(表被删、或库被删、或元数据异常)。

  • 这种 “Region 还在、表没了” 的孤儿 Region,PD 不会主动调度走,TiFlash 也无法清理。

  • 副本调度延迟 / 卡住

  • 你把所有表 replica_count=0 后,PD 应该下发指令删除 TiFlash 上所有副本。

  • 但少量 Region 可能因网络、心跳、元数据不一致、表已删除等原因,删除指令未生效 / 卡住

  • 缩容时 PD 安全机制

  • PD 下线节点前,会检查节点上是否还有 Region:

    • 有 → 必须先迁走 / 删掉
    • 迁不走 / 删不掉 → 一直 Pending Offline
1 个赞
  • 残留 Region 或 Replica
  • 即使表副本数量为 0,一些历史 region 或 snapshot 还可能绑定了这些 TiFlash 节点。
  • 这些 region 数据 TiFlash 尝试 flush 时找不到表对应的 metadata,就会不断报错并阻塞下线。
  • TiFlash 节点本地存储残留旧数据
  • 下线过程 TiFlash 会清理本地 region,如果 region 对应的表已经不存在,但本地数据未能清理干净,节点会一直在 Pending 状态。

Raft / KVStore 状态异常

  • 日志里的 can not get table for region 是 TiFlash 节点本地 KVStore 里 region 元信息和 TiDB metadata 不一致的体现。
  • 如果 region 在 PD 上仍有信息,但 TiFlash 节点找不到表,就会循环尝试 flush,无法完成下线。
1 个赞

1 * 确认 TiDB 上已无 TiFlash 副本

SELECT TABLE_SCHEMA, TABLE_NAME, REPLICA_COUNT, AVAILABLE
FROM information_schema.tiflash_replica;

你已经做了,结果为空,说明 TiDB 侧没问题。

  • 检查 PD 上 region 的分布

pd-ctl store

  • 看看这些 Pending Offline 的 TiFlash 是否还在 region 分配表里。
  • 如果 region 还在,但 table id 已不存在,就需要清理 TiFlash 本地残留 region。
1 个赞
  • 手动清理 TiFlash 节点
  • 停掉 TiFlash 节点。
  • 清理节点数据目录:

flash_cluster_dir/tiflash-xxx/db

:warning: 注意:备份重要数据再操作

  • 再启动 TiFlash 节点,让 PD 重新认领。
  • 如果只是下线节点,可以直接 force remove
  • TiDB v8+ 支持强制移除 TiFlash 节点:

ALTER TABLE

SET TIFLASH REPLICA 0;

之后直接在 tiup cluster scale-in 里移除。

  • 如果节点一直 Pending,可用 tiup cluster edit-config + scale-in 再操作一次。
  • 最终仍不行,可以通过删除 TiFlash 节点在 PD 上的 store 信息来强制下线:

pd-ctl store delete

1 个赞

手动清理过程。是先 tiup cluster stop 节点然后手动rm 吗?
生产环境想多确认一下

我看您提供了三个方案
1 停节点,手动rm,启动节点,scale-in
2 直接 scale-in --force 强制下线
3 pd-ctl store delete 删除pd上store信息强制下线
任何一个都可以? 还是您推荐哪一个?

虽然 tiflash_replica=0,但 TiFlash 本地仍持有 已删除表 / 旧表 ID 的 Region 缓存 / 数据文件

日志 tryFlushRegionCacheInStorage can not get table for region … table id xxx → 表已删,但 Region 还在 TiFlash 本地
PD 一直认为这两台节点还有数据,所以一直 Pending Offline

我觉得你直接去tiflash上把进程杀掉,然后缩容清掉它
tiflash也是同步tikv的数据,暴力点不碍事

tiflash上都是同步复制的数据,手动清理会出问题吗

用这个ALTER TABLE <表名> COMPACT tiflash replica; 应该不会有问题

这个命令会强制 TiFlash 立即对指定表进行数据整理,将 Delta 层的数据合并到 Stable 层,并清理掉那些已经被标记删除且不再需要的旧版本数据.这是 TiDB 官方文档明确支持的运维命令,是安全的

如果有问题也可以重新从tikv同步的吧

可以的,TiFlash 是 TiKV 的列存副本,数据最终来源于 TiKV

我觉得回复中有个尝试重新同步tikv的方案,可以在业务不忙的时候试一试

太顽固了。 执行 store delete 删除后状态依然是Pending Offline , store 里的状态是 offline

表都已经drop不存在了