适用版本: 6.8-8.11
1. 错误异常的基本描述 #
在恢复、快照或文件元数据解析过程中,如果 written_by 字段为空或非法,Elasticsearch 会报:
missing or invalid written_by [value]
2. 为什么会发生这个错误 #
这个异常来自文件元数据解析,不是普通文档字段错误。源码在构造 StoreFileMetadata 前,会校验 physicalName、length、writtenBy、checksum 等字段;如果 writtenBy == null,就直接抛出 ElasticsearchParseException。
这意味着对应的元数据记录已经不完整或损坏。
3. 如何排查和解决这个异常 #
- 确认异常发生在快照恢复、文件信息读取还是存储元数据加载阶段。
- 查看相关元数据文件是否缺失、损坏或来自不兼容的版本。
- 检查最近是否发生过不完整恢复、手工复制文件或中断升级。
4. 如何解决这个错误 #
方案一:恢复完整元数据来源 #
如果元数据来自快照或复制过程,优先重新获取完整且一致的元数据文件。
方案二:检查版本兼容性 #
written_by 与 Lucene 写入版本有关。如果元数据来自不兼容版本,需先确认升级/恢复链路是否正确。
方案三:重新执行恢复或重建 #
如果元数据已经损坏且无法修复,通常需要重新恢复快照或重建受影响数据。
5. 预防建议 #
- 不要手工改写或拼接底层存储元数据文件。
- 对快照与恢复流程做完整性校验,避免中断后留下半成品元数据。
- 升级或迁移前确认版本兼容矩阵,避免把不同版本产出的元数据混用。
6. 小结 #
missing or invalid written_by 不是普通业务字段缺失,而是底层文件元数据不完整。处理重点在于恢复正确元数据来源、校验版本兼容性,以及避免继续使用可能损坏的恢复结果。
相关错误 #
- missing-affix-file-for-hunspell-dictionary-%s-how-to-solve-this-elasticsearch-exception
- malformed-setting-override-value-how-to-solve-this-elasticsearch-exception
- missing-paramname-in-context-mapping-how-to-solve-this-elasticsearch-exception
附:日志上下文 #
} 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);
}





