📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 6.8-8.11

1. 错误异常的基本描述 #

在恢复、快照或文件元数据解析过程中,如果 written_by 字段为空或非法,Elasticsearch 会报:

missing or invalid written_by [value]

2. 为什么会发生这个错误 #

这个异常来自文件元数据解析,不是普通文档字段错误。源码在构造 StoreFileMetadata 前,会校验 physicalNamelengthwrittenBychecksum 等字段;如果 writtenBy == null,就直接抛出 ElasticsearchParseException

这意味着对应的元数据记录已经不完整或损坏。

3. 如何排查和解决这个异常 #

  1. 确认异常发生在快照恢复、文件信息读取还是存储元数据加载阶段。
  2. 查看相关元数据文件是否缺失、损坏或来自不兼容的版本。
  3. 检查最近是否发生过不完整恢复、手工复制文件或中断升级。

4. 如何解决这个错误 #

方案一:恢复完整元数据来源 #

如果元数据来自快照或复制过程,优先重新获取完整且一致的元数据文件。

方案二:检查版本兼容性 #

written_by 与 Lucene 写入版本有关。如果元数据来自不兼容版本,需先确认升级/恢复链路是否正确。

方案三:重新执行恢复或重建 #

如果元数据已经损坏且无法修复,通常需要重新恢复快照或重建受影响数据。

5. 预防建议 #

  • 不要手工改写或拼接底层存储元数据文件。
  • 对快照与恢复流程做完整性校验,避免中断后留下半成品元数据。
  • 升级或迁移前确认版本兼容矩阵,避免把不同版本产出的元数据混用。

6. 小结 #

missing or invalid written_by 不是普通业务字段缺失,而是底层文件元数据不完整。处理重点在于恢复正确元数据来源、校验版本兼容性,以及避免继续使用可能损坏的恢复结果。

相关错误 #

附:日志上下文 #

} else if (physicalName == null || Strings.validFileName(physicalName) == false) {
    throw new ElasticsearchParseException("missing or invalid physical file name [" + physicalName + "]");
} else if (length < 0) {
    throw new ElasticsearchParseException("missing or invalid file length");
} else if (writtenBy == null) {
    throw new ElasticsearchParseException("missing or invalid written_by [" + writtenBy + "]");
} else if (checksum == null) {
    throw new ElasticsearchParseException("missing checksum for name [" + name + "]");
}
return new FileInfo(name; new StoreFileMetadata(physicalName; length; checksum; writtenBy; metaHash; writerUuid); partSize);
}