获取“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垃圾收集失败、磁盘空间中断、磁盘或网络共享不稳定造成的。 或者,也可能是由于用户从服务器错误删除了文件。

要恢复缺少的文件,请执行以下步骤。

  1. 安装最新的CFP/SP。

    最新的修补程序位于 Adobe包共享.

  2. 运行数据存储一致性检查。

    使用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
    
  3. 创建缺少文件的路径列表。

    恢复丢失文件的下一步是编译丢失文件的完整路径列表。

    搜索一致性检查输出以查看所有出现的错误 未找到记录

    答: 在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

  4. 恢复缺少的文件。

    现在,使用上一步的输出在您的环境中的其他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中列出的任何文件。

  5. 清除不可恢复的文件引用。

    如果您无法从备份或其他Adobe Experience Manager实例恢复某些文件,请清理或修复错误的数据存储引用。 在步骤4中运行DataStore一致性检查时,重新运行该检查。 您会获得当前丢失文件列表。

    查看列出的每个引用缺少的数据存储文件的节点路径。 查看任何丢失的DAM资源或与用户一起上传到页面的文件。 让他们重新上传任何他们需要的缺失文件。 可以通过Adobe Experience Manager用户界面安全地删除不需要的任何内容。 如果/var/audit或/var/eventing下缺少任何内容,则可以安全地将其删除。 对于任何您不确定的文件,请转到 此处 并联系AEM支持团队以获取帮助。

  6. 重新索引所有异步Oak索引。

    由于索引文件存储在Oak存储库中,基于/oak:index lucene的索引中可能缺少某些文件。

    由于缺少的文件在存储库遍历中处于隐藏状态,因此不会在/system/console/repositorycheck一致性检查中报告这些文件。 很遗憾,此类文件在不同的AEM实例中不匹配。

    要修复此类不一致,请重新索引受影响的异步Oak索引。

    警告: 此操作非常昂贵,并且需要延长停机时间,完成时间从10分钟到多天不等,具体取决于系统中的内容量。

    要重新索引异步索引,请执行以下操作:

    1. 下载与您在Oak环境中安装的版本匹配的oak-run 1.0.x: https://repo1.maven.org/maven2/org/apache/jackrabbit/oak-run/

    2. 将oak-run上传到Adobe Experience Manager服务器。

    3. 停止所有Adobe Experience Manager实例。

    4. 运行以下与您的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
      
    5. 再次启动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
      
    6. 如果索引由于某个原因失败,则会看到它循环,重复此日志消息:

      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]
      
recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f