--- title: "恢复文件异常 (recover_files_recovery_exception) 错误排查与解决" date: 2026-03-06 lastmod: 2026-03-06 description: "recover_files_recovery_exception 表示在分片恢复过程中传输文件时失败,通常由网络中断、磁盘空间不足或传输超时引起。" tags: ["分片恢复", "文件传输", "数据恢复"] summary: "为什么这个错误发生 # recover_files_recovery_exception 表示在分片恢复过程中传输文件时失败。恢复文件是分片恢复的关键步骤,需要将索引文件从源节点复制到目标节点。 这个错误可能由以下原因引起: 网络中断:节点间的网络连接在传输过程中中断 磁盘空间不足:目标节点磁盘空间不足 文件损坏:源节点的文件损坏无法读取 传输超时:大文件传输超时 并发限制:达到并发恢复限制 磁盘 IO 错误:磁盘读写错误 文件系统错误:文件系统问题 节点故障:源节点或目标节点故障 文件权限问题:文件权限不正确 传输带宽不足:网络带宽不足 如何修复这个错误 # 1. 查看恢复状态 # # 查看当前恢复状态 GET /_cat/recovery?v&active_only=true # 查看详细恢复信息 GET /<index>/_recovery?human&detailed=true # 查看恢复的文件和字节数 GET /_recovery?human&filter_path=**.files,**.bytes 2. 检查磁盘空间 # # 查看磁盘使用情况 GET /_cat/allocation?v # 检查系统磁盘空间 df -h /path/to/easysearch/data # 清理不必要的文件或索引 DELETE /<old_index> 3. 检查网络连接 # # 测试节点间网络 ping <target_node> telnet <target_node> 9300 # 检查网络带宽 iperf -c <target_node> 4." --- ## 为什么这个错误发生 `recover_files_recovery_exception` 表示在分片恢复过程中传输文件时失败。恢复文件是分片恢复的关键步骤,需要将索引文件从源节点复制到目标节点。 这个错误可能由以下原因引起: 1. **网络中断**:节点间的网络连接在传输过程中中断 2. **磁盘空间不足**:目标节点磁盘空间不足 3. **文件损坏**:源节点的文件损坏无法读取 4. **传输超时**:大文件传输超时 5. **并发限制**:达到并发恢复限制 6. **磁盘 IO 错误**:磁盘读写错误 7. **文件系统错误**:文件系统问题 8. **节点故障**:源节点或目标节点故障 9. **文件权限问题**:文件权限不正确 10. **传输带宽不足**:网络带宽不足 ## 如何修复这个错误 ### 1. 查看恢复状态 ```bash # 查看当前恢复状态 GET /_cat/recovery?v&active_only=true # 查看详细恢复信息 GET //_recovery?human&detailed=true # 查看恢复的文件和字节数 GET /_recovery?human&filter_path=**.files,**.bytes ``` ### 2. 检查磁盘空间 ```bash # 查看磁盘使用情况 GET /_cat/allocation?v # 检查系统磁盘空间 df -h /path/to/easysearch/data # 清理不必要的文件或索引 DELETE / ``` ### 3. 检查网络连接 ```bash # 测试节点间网络 ping telnet 9300 # 检查网络带宽 iperf -c ``` ### 4. 调整恢复配置 ```bash # 减少并发恢复数量 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.node_concurrent_recoveries": 2 } } # 减少恢复速度 PUT //_settings { "index": { "recovery": { "max_bytes_per_sec": "10mb" } } } ``` ### 5. 重试恢复 ```bash # 取消卡住的恢复 POST /_cluster/reroute { "commands": [ { "cancel": { "index": "", "shard": 0, "node": "" } } ] } # 重新触发恢复 POST /_cluster/reroute?retry_failed=true ``` ### 6. 重启节点 ```bash # 如果节点状态异常,重启相关节点 sudo systemctl restart easysearch # 等待节点重新加入集群 GET /_cat/nodes?v ``` ### 7. 检查文件权限 ```bash # 检查数据目录权限 ls -la /path/to/easysearch/data # 修复权限 chown -R easysearch:easysearch /path/to/easysearch/data chmod -R 750 /path/to/easysearch/data ``` ### 8. 从快照恢复 ```bash # 如果恢复持续失败,从快照恢复 POST /_snapshot///_restore { "indices": "", "include_global_state": false } ``` ### 9. 查看错误日志 ```bash # 查看恢复相关错误日志 grep -i "recovery.*fail\|transfer.*error" /path/to/easysearch/logs/easysearch.log | tail -100 # 查看文件传输错误 grep -i "file.*not.*found\|io.*error" /path/to/easysearch/logs/easysearch.log | tail -50 ``` ### 10. 使用不同的恢复源 ```bash # 移动分片到其他节点恢复 POST /_cluster/reroute { "commands": [ { "move": { "index": "", "shard": 0, "from_node": "", "to_node": "" } } ] } ``` ### 11. 增加超时时间 ```yaml # 在 easysearch.yml 中增加超时 recovery.internal_action_timeout: 15m indices.recovery.max_bytes_per_sec: 100mb ``` ### 12. 分批恢复 ```bash # 如果有多个分片需要恢复,分批进行 # 暂停分片分配 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.enable": "none" } } # 恢复后重新启用 PUT /_cluster/settings { "transient": { "cluster.routing.allocation.enable": "all" } } ``` ### 13. 检查磁盘健康 ```bash # 检查磁盘健康状态 sudo smartctl -a /dev/sdX # 检查文件系统 sudo fsck /dev/sdX ``` ### 14. 验证源分片 ```bash # 确保源分片健康 GET /_cat/shards?v&h=index,shard,prirep,state,node # 查看分片存储状态 GET //_shard_stores?status=green ``` ### 15. 重建分片 ```bash # 如果恢复无法完成,考虑重建分片 # 删除并从副本重建 DELETE / # 从快照或数据源重新导入 POST /_snapshot///_restore { "indices": "" } ``` ### 预防措施 - 保持足够的磁盘空间 - 配置合理的恢复速度 - 监控恢复进度 - 使用稳定的网络连接 - 配置足够的副本 - 定期创建快照备份 - 监控磁盘健康状态 - 避免同时恢复大量分片 - 使用增量恢复 - 实现恢复失败自动重试