获取“blobId的InputStream”时数据存储不一致错误
了解如何解决数据存储获取InputStream错误。 编译丢失文件的路径列表并将路径还原并重新索引。
描述 description
环境
- Experience Manager 6.4
- Experience Manager 6.5
问题/症状
您有一个 文件数据存储 已在Adobe Experience Manager 6.x/Oak 1.x系统中配置并在error.log中,您会看到以下内容:
获取时出错 InputStream
对象 blobId
.
10.09.2015 10:38:04.220 *ERROR* [ pool-9-thread-3] org.apache.sling.commons.scheduler.impl.QuartzScheduler
Exception during job execution of org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate@7fe7e8fa :
Error occurred while obtaining InputStream for blobId [ add1dd8fc5093b27b1fae1b753cb48b24ef3231f#101983]
java.lang.RuntimeException: Error occurred while obtaining InputStream for blobId [ add1dd8fc5093b27b1fae1b753cb48b24ef3231f#101983]
解决方法 resolution
此错误表示您的Adobe Experience Manager数据存储目录中可能缺少文件。 数据存储文件的丢失可能是由于Oak Blob垃圾收集失败、磁盘空间中断、磁盘或网络共享不稳定造成的。 或者,也可能是由于用户从服务器错误删除了文件。
要恢复缺少的文件,请执行以下步骤。
-
安装最新的CFP/SP。
最新的修补程序位于 Adobe包共享.
-
运行数据存储一致性检查。
使用oak-run jar 1.6.6及更高版本,运行以下命令:
code language-none java -jar oak-run-*.jar datastorecheck --consistency -ref --id --fds crx-quickstart/install/org.apache.jackrabbit.oak.plugins.blob.datastore.FileDataStore.config --repoHome crx-quickstart/repository --store crx-quickstart/repository/datastore --dump temp --verbose --track
-
创建缺少文件的路径列表。
恢复丢失文件的下一步是编译丢失文件的完整路径列表。
搜索一致性检查输出以查看所有出现的错误 未找到记录
答: 在Linux或Unix中:使用此命令将缺失文件的列表输出到文件
missing_ds_files.txt
:code language-none grep "blobId" consistency_check_output.txt | grep -Eo "[ 0-9a-f] {40,200}" | awk '{ print substr($1, 0,2) "/" substr($1, 3,2) "/" substr($1, 5,2) "/" $1 }' | sort -u > missing_ds_files.txt
注意 — 如果您的Adobe Experience Manager实例由于
blobId
错误,然后在以下位置搜索日志文件:crx-quickstart/logs
(对于所有出现的错误)'Error occurred while obtaining InputStream for blobId'
而是:code language-none grep "Error occurred while obtaining InputStream for blobId" error.log* | grep -Eo "[ 0-9a-f] {40,200}" | awk '{ print substr($1, 0,2) "/" substr($1, 3,2) "/" substr($1, 5,2) "/" $1 }' | sort -u > missing_ds_files.txt
如果命令运行正常,则
missing_ds_files.txt
将类似于以下内容:code language-none 12/92/04/129204a6dd0ce2cd5ca19c721b6f52ee2b3630e2 9f/d8/38/9fd8386d20cf55e7e0024e18d0c7d4e8400454ee 7a/13/15/7a1315788f45dafd6630454f04183601682a9f80 28/37/d2/2837d24aed3ff223cd40e90222226c4ef2e2a0c6
b. 在Windows中:使用文本编辑器(如文本面板或记事本++)查找所有匹配项 未找到记录. 然后,在找到所有此类匹配项后,使用宏提取文件名,编写脚本或在新文本文件中手动复制和构建文件名。
DataStore文件路径由以下格式的记录名称构造: {记录id的前两个字符}/{记录id的第二两个字符}/{记录id的第三两个字符}/{记录id}
例如,在此错误中:
code language-none java.lang.RuntimeException: Error occurred while obtaining InputStream for blobId [ add1dd8fc5093b27b1fae1b753cb48b24ef3231f#101983]
记录id为
add1dd8fc5093b27b1fae1b753cb48b24ef3231f
文件路径为ad/d1/dd/add1dd8fc5093b27b1fae1b753cb48b24ef3231f
-
恢复缺少的文件。
现在,使用上一步的输出在您的环境中的其他Adobe Experience Manager实例中对相同的文件进行向下搜索。 由于数据存储文件是唯一存储的,因此您可以从环境中的其他Adobe Experience Manager实例中复制它们。
如果在其他实例中找不到某些文件,请搜索备份并从那里恢复它们(如果可能)。
在Linux中,您可以登录到每个正在运行的Adobe Experience Manager实例,并使用rsync等命令来复制这些实例中存在的任何缺失文件。 例如,通过从服务器上缺少文件的数据存储目录运行它:
code language-none rsync -avR --files-from=missing_ds_files.txt . user@hostname-of-server-missing-files:/path/to/crx-quickstart/repository/repository/datastore/
该命令会运行一个rsync,以复制服务器中存在的missing_ds_files.txt中列出的任何文件。
-
清除不可恢复的文件引用。
如果您无法从备份或其他Adobe Experience Manager实例恢复某些文件,请清理或修复错误的数据存储引用。 在步骤4中运行DataStore一致性检查时,重新运行该检查。 您会获得当前丢失文件列表。
查看列出的每个引用缺少的数据存储文件的节点路径。 查看任何丢失的DAM资源或与用户一起上传到页面的文件。 让他们重新上传任何他们需要的缺失文件。 可以通过Adobe Experience Manager用户界面安全地删除不需要的任何内容。 如果/var/audit或/var/eventing下缺少任何内容,则可以安全地将其删除。 对于任何您不确定的文件,请转到 此处 并联系AEM支持团队以获取帮助。
-
重新索引所有异步Oak索引。
由于索引文件存储在Oak存储库中,基于/oak:index lucene的索引中可能缺少某些文件。
由于缺少的文件在存储库遍历中处于隐藏状态,因此不会在/system/console/repositorycheck一致性检查中报告这些文件。 很遗憾,此类文件在不同的AEM实例中不匹配。
要修复此类不一致,请重新索引受影响的异步Oak索引。
警告: 此操作非常昂贵,并且需要延长停机时间,完成时间从10分钟到多天不等,具体取决于系统中的内容量。
要重新索引异步索引,请执行以下操作:
-
下载与您在Oak环境中安装的版本匹配的oak-run 1.0.x: https://repo1.maven.org/maven2/org/apache/jackrabbit/oak-run/
-
将oak-run上传到Adobe Experience Manager服务器。
-
停止所有Adobe Experience Manager实例。
-
运行以下与您的Adobe Experience Manager实例的Oak存储对应的命令:
TarMK命令:
code language-none java -Xmx4096m -jar /apps/staging/oak-run-*-*.jar checkpoints crx-quickstart/repository/segmentstore rm-all
MongoMK命令:
code language-none java -Xmx4096m -jar oak-run-*-*.jar checkpoints mongodb://localhost/aem-author rm-all
-
再次启动Adobe Experience Manager并监视日志文件中的INFO日志消息
org.apache.jackrabbit.oak.plugins.index
. 如果要查看有关索引的更多详细信息,请转到/system/console/slinglog UI并启用调试级别日志记录org.apache.jackrabbit.oak.plugins.index
.您应会看到如下日志消息:
code language-none 23.06.2015 14:26:23.070 *INFO* [ FelixStartLevel] org.apache.jackrabbit.oak.plugins.index.IndexUpdate Reindexing will be performed for following indexes: [ /oak:index/cqAcUUID, /oak:index/nodetype, /oak:index/deviceIdentificationMode, /oak:index/campaignpath, /oak:index/active, /oak:index/jcrFrozenMixinTypes] 23.06.2015 14:26:23.517 *INFO* [ FelixStartLevel] org.apache.jackrabbit.oak.plugins.index.IndexUpdate Reindexing Traversed #10000 /jcr:system/jcr:versionStorage/c8/5f ... 23.06.2015 14:28:51.999 *INFO* [ pool-8-thread-1] org.apache.jackrabbit.oak.plugins.index.IndexUpdate Indexing report - /oak:index/counter*(708) - /oak:index/authorizables*(159) - /oak:index/cqPageLucene*(1913) - /oak:index/ntBaseLucene*(444) - /oak:index/cqTagLucene*(512) - /oak:index/workflowDataLucene*(116) ... 23.06.2015 14:28:52.009 *INFO* [ pool-8-thread-1] org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate Reindexing (async) completed for indexes: [ /oak:index/counter*(708), /oak:index/authorizables*(159), /oak:index/cqPageLucene*(1913), /oak:index/ntBaseLucene*(444), /oak:index/cqTagLucene*(512), /oak:index/workflowDataLucene*(116)] in 30.36 s
-
如果索引由于某个原因失败,则会看到它循环,重复此日志消息:
code language-none 23.06.2015 14:26:23.070 *INFO* [ FelixStartLevel] org.apache.jackrabbit.oak.plugins.index.IndexUpdate Reindexing will be performed for following indexes: [ /oak:index/cqAcUUID, /oak:index/nodetype, /oak:index/deviceIdentificationMode, /oak:index/campaignpath, /oak:index/active, /oak:index/jcrFrozenMixinTypes]
-