tiflash启动不起来,报错Can not find path for DMFile

有一台 tiflash 实例报错,网上找不到有类型的报错,服务一直循环重启,导致 tiflash 不可用了
前面有研发人员执行了 truncate partition,再写入数据后,tiflash 就挂了

[2025/11/20 11:34:00.352 +08:00] [ERROR] [Exception.cpp:91] ["Storage inited fail, keyspace=4294967295 table_id=277494: Code: 0, e.displayText() = DB::Exception: Can not find path for DMFile, file_id=3493898: \n       0x72e4bfc\tDB::StableDiskDelegator::getDTFilePath(unsigned long, bool) const [tiflash+120474620]\n                \tdbms/src/Storages/PathPool.cpp:470\n       0x69e08c8\tDB::DM::StableValueSpace::restore(DB::DM::DMContext&, DB::ReadBuffer&, unsigned long) [tiflash+111020232]\n                \tdbms/src/Storages/DeltaMerge/StableValueSpace.cpp:159\n       0x69e0244\tDB::DM::StableValueSpace::restore(DB::DM::DMContext&, unsigned long) [tiflash+111018564]\n                \tdbms/src/Storages/DeltaMerge/StableValueSpace.cpp:112\n       0x695a7b8\tDB::DM::Segment::restoreSegment(std::__1::shared_ptr<DB::Logger> const&, DB::DM::DMContext&, unsigned long) [tiflash+110471096]\n                \tdbms/src/Storages/DeltaMerge/Segment.cpp:383\n       0x6910e7c\tstd::__1::__function::__func<DB::DM::DeltaMergeStore::DeltaMergeStore(DB::Context&, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int, long, bool, std::__1::vector<DB::DM::ColumnDefine, std::__1::allocator<DB::DM::ColumnDefine> > const&, DB::DM::ColumnDefine const&, bool, unsigned long, DB::DM::DeltaMergeStore::Settings const&, DB::ThreadPoolImpl<DB::ThreadFromGlobalPoolImpl<false> >*)::$_17, std::__1::allocator<DB::DM::DeltaMergeStore::DeltaMergeStore(DB::Context&, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int, long, bool, std::__1::vector<DB::DM::ColumnDefine, std::__1::allocator<DB::DM::ColumnDefine> > const&, DB::DM::ColumnDefine const&, bool, unsigned long, DB::DM::DeltaMergeStore::Settings const&, DB::ThreadPoolImpl<DB::ThreadFromGlobalPoolImpl<false> >*)::$_17>, void ()>::operator()() [tiflash+110169724]\n                \t/usr/local/bin/../include/c++/v1/__functional/function.h:345\n       0x1c8fef4\tstd::__1::packaged_task<void ()>::operator()() [tiflash+29949684]\n                \t/usr/local/bin/../include/c++/v1/future:2089\n       0x1c44330\tDB::ThreadPoolImpl<DB::ThreadFromGlobalPoolImpl<false> >::worker(std::__1::__list_iterator<DB::ThreadFromGlobalPoolImpl<false>, void*>) [tiflash+29639472]\n                \tdbms/src/Common/UniThreadPool.cpp:306\n       0x1c461f0\tstd::__1::__function::__func<DB::ThreadFromGlobalPoolImpl<false>::ThreadFromGlobalPoolImpl<void DB::ThreadPoolImpl<DB::ThreadFromGlobalPoolImpl<false> >::scheduleImpl<void>(std::__1::function<void ()>, long, std::__1::optional<unsigned long>, bool)::'lambda0'()>(void&&)::'lambda'(), std::__1::allocator<DB::ThreadFromGlobalPoolImpl<false>::ThreadFromGlobalPoolImpl<void DB::ThreadPoolImpl<DB::ThreadFromGlobalPoolImpl<false> >::scheduleImpl<void>(std::__1::function<void ()>, long, std::__1::optional<unsigned long>, bool)::'lambda0'()>(void&&)::'lambda'()>, void ()>::operator()() [tiflash+29647344]\n                \t/usr/local/bin/../include/c++/v1/__functional/function.h:345\n       0x1c452f4\tvoid* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void DB::ThreadPoolImpl<std::__1::thread>::scheduleImpl<void>(std::__1::function<void ()>, long, std::__1::optional<unsigned long>, bool)::'lambda0'()> >(void*) [tiflash+29643508]\n                \t/usr/local/bin/../include/c++/v1/thread:291\n  0xffff80fb7d38\tstart_thread [libpthread.so.0+32056]\n  0xffff80daf680\tthread_start [libc.so.6+915072], e.what() = DB::Exception, Stack trace:\n\n\n       0x72e4bfc\tDB::StableDiskDelegator::getDTFilePath(unsigned long, bool) const [tiflash+120474620]\n                \tdbms/src/Storages/PathPool.cpp:470\n       0x69e08c8\tDB::DM::StableValueSpace::restore(DB::DM::DMContext&, DB::ReadBuffer&, unsigned long) [tiflash+111020232]\n                \tdbms/src/Storages/DeltaMerge/StableValueSpace.cpp:159\n       0x69e0244\tDB::DM::StableValueSpace::restore(DB::DM::DMContext&, unsigned long) [tiflash+111018564]\n                \tdbms/src/Storages/DeltaMerge/StableValueSpace.cpp:112\n       0x695a7b8\tDB::DM::Segment::restoreSegment(std::__1::shared_ptr<DB::Logger> const&, DB::DM::DMContext&, unsigned long) [tiflash+110471096]\n                \tdbms/src/Storages/DeltaMerge/Segment.cpp:383\n       0x6910e7c\tstd::__1::__function::__func<DB::DM::DeltaMergeStore::DeltaMergeStore(DB::Context&, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int, long, bool, std::__1::vector<DB::DM::ColumnDefine, std::__1::allocator<DB::DM::ColumnDefine> > const&, DB::DM::ColumnDefine const&, bool, unsigned long, DB::DM::DeltaMergeStore::Settings const&, DB::ThreadPoolImpl<DB::ThreadFromGlobalPoolImpl<false> >*)::$_17, std::__1::allocator<DB::DM::DeltaMergeStore::DeltaMergeStore(DB::Context&, bool, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned int, long, bool, std::__1::vector<DB::DM::ColumnDefine, std::__1::allocator<DB::DM::ColumnDefine> > const&, DB::DM::ColumnDefine const&, bool, unsigned long, DB::DM::DeltaMergeStore::Settings const&, DB::ThreadPoolImpl<DB::ThreadFromGlobalPoolImpl<false> >*)::$_17>, void ()>::operator()() [tiflash+110169724]\n                \t/usr/local/bin/../include/c++/v1/__functional/function.h:345\n       0x1c8fef4\tstd::__1::packaged_task<void ()>::operator()() [tiflash+29949684]\n                \t/usr/local/bin/../include/c++/v1/future:2089\n       0x1c44330\tDB::ThreadPoolImpl<DB::ThreadFromGlobalPoolImpl<false> >::worker(std::__1::__list_iterator<DB::ThreadFromGlobalPoolImpl<false>, void*>) [tiflash+29639472]\n                \tdbms/src/Common/UniThreadPool.cpp:306\n       0x1c461f0\tstd::__1::__function::__func<DB::ThreadFromGlobalPoolImpl<false>::ThreadFromGlobalPoolImpl<void DB::ThreadPoolImpl<DB::ThreadFromGlobalPoolImpl<false> >::scheduleImpl<void>(std::__1::function<void ()>, long, std::__1::optional<unsigned long>, bool)::'lambda0'()>(void&&)::'lambda'(), std::__1::allocator<DB::ThreadFromGlobalPoolImpl<false>::ThreadFromGlobalPoolImpl<void DB::ThreadPoolImpl<DB::ThreadFromGlobalPoolImpl<false> >::scheduleImpl<void>(std::__1::function<void ()>, long, std::__1::optional<unsigned long>, bool)::'lambda0'()>(void&&)::'lambda'()>, void ()>::operator()() [tiflash+29647344]\n                \t/usr/local/bin/../include/c++/v1/__functional/function.h:345\n       0x1c452f4\tvoid* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, void DB::ThreadPoolImpl<std::__1::thread>::scheduleImpl<void>(std::__1::function<void ()>, long, std::__1::optional<unsigned long>, bool)::'lambda0'()> >(void*) [tiflash+29643508]\n                \t/usr/local/bin/../include/c++/v1/thread:291\n  0xffff80fb7d38\tstart_thread [libpthread.so.0+32056]\n  0xffff80daf680\tthread_start [libc.so.6+915072]"] [thread_id=765]

是 tiflash 服务一直循环重启,重启的时候这台 tiflash 的磁盘 IO 读满了,然后看日志是报错 DMFile 的那个错误,看他这个报错中的表 id,我在 tidb 里面查是没有这个表的

建议先删除这个表的tiflash 副本,再生成这个副本,应该就好了

这个表在 tidb 中是不存在的,我感觉是 tiflash 发生故障重启的时候出现的问题,可能删了 tidb 的元数据,data 数据没删

执行了truncate 的那张表

已经试过了,不是 truncate 表,是 truncate 分区

直接那张表tiflash 副本先干掉,再重建试试

对啊,就是这样操作的


重启dm试试

建议

  1. 使用绝对路径:所有配置文件中的路径都应使用绝对路径,避免相对路径导致的问题
  2. 预先创建目录:在启动DM组件前,确保所有必要的目录都已创建
  3. 权限管理:确保DM进程有足够的权限访问配置的目录和文件
  4. 定期检查:定期检查磁盘空间和文件系统状态,避免因空间不足导致的路径问题
  5. 备份配置:保留配置文件的备份,便于快速恢复
1 个赞

我这不是 DM 的,也没有 dm 集群,这个 dmfile 是 tiflash 的文件, DeltaMerge File

看看系统表里还有没有这张表SELECT * FROM INFORMATION_SCHEMA.TIFLASH_TABLES;

个人觉得最好移除tiflash,再加入。加入时会重新同步数据

有这张表的,查到了是我们的某一个表

这个过程做了,但是我之前找不到是哪个表,那个日志的 table_id,原来是 tlflash 的 table id

可以重建一下flash节点试试

看日志是TiFlash 在启动时尝试加载一个已经不存在的 DMFile(ID 为 3493898),导致存储引擎初始化失败,从而引发进程崩溃和循环重启

可以通过清理残留元数据 + 重启 TiFlash试试

元数据要怎么清理,我现在用测试的 tidb 集群复现了,删了一个 dmfile 文件,其中日志内容一模一样,然后我设置 tiflash 副本为 0,再设置成 1,已经可以查询,但是 tiflash 的负载很高,报错内容还是有