如何解决Solr IndexUpgrader升级索引时找不到_md6.si的问题
问题诱因
从报错堆栈可以定位,该问题是Lucene索引段元数据引用损坏导致的:_md6.si是Lucene 4.x版本中名为_md6的索引段对应的段信息文件,报错触发点是Lucene40SegmentInfoReader在加载索引时,从segments_N(索引全局段元数据记录文件)中读取到了_md6段的条目,但在目录下找不到对应文件。
出现该问题的常见场景:
- 迁移索引目录时文件拷贝不完整,漏传了该段文件
- 索引运行过程中发生过进程强杀、磁盘异常、写入中断,导致段文件被清理但
segments_N中的引用未被同步移除
你全文检索不到相关文件引用是正常的:segments_N是二进制格式文件,普通文本检索无法识别其中存储的段名记录。
修复步骤
按优先级依次操作:
- 优先使用源环境完整索引操作
- 回到运行Solr 4.5.1的原始服务环境,先停掉所有针对目标core的写入流量
- 对索引执行强制优化,调用接口:
http://<Solr服务地址>/solr/<core名称>/update?optimize=true&maxSegments=1 - 优化完成后,确认索引目录无文件写入操作后,全量拷贝整个索引目录到升级环境,避免文件遗漏,再执行IndexUpgrader升级即可
- 若无法获取源环境完整索引,修复现有损坏索引
- 先全量备份当前索引目录所有文件,避免操作失误造成数据不可逆丢失
- 使用Solr 4.5.1配套的Lucene版本自带的CheckIndex工具扫描修复损坏元数据,执行命令:
java -cp lucene-core-4.5.1.jar org.apache.lucene.index.CheckIndex <索引目录绝对路径> -fix - 工具执行过程中会自动识别并移除
segments_N中指向不存在文件的无效段引用,对应丢失段的数据本身已因文件缺失无法恢复,会在修复过程中被剔除 - 修复完成后,再运行Solr 5.x自带的IndexUpgrader工具执行索引升级即可
- 升级注意事项
- 禁止跨大版本使用升级工具,必须先用Solr 5.x自带的IndexUpgrader将索引升级到Lucene 5.x格式,再逐步往更高版本升级,直接用高版本工具运行4.x索引会触发Codec不兼容报错
- 所有升级操作前必须全量备份索引文件
内容的提问来源于stack exchange,提问作者user16316067
相关产品推荐
相关产品推荐

