使用AEM/AEM Forms解决并修复索引损坏
如果有人在AEM/AEM表单中遇到索引损坏问题,本文将通过说明如何删除存储库中包含的索引数据并重新索引损坏的索引来帮助您解决此问题。
描述 description
环境
Experience Manager Forms
问题/症状
遇到索引损坏的情况非常少见。 但是,如果发生这种情况,您会看到与以下内容类似的日志条目:17.01.2019 17:55:47.374 *WARN* [ pool-118-thread-4] org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate [ async] The index update failed org.apache.jackrabbit.oak.api.CommitFailedException: OakMerge0001: OakMerge0001: Failed to merge changes to the underlying store (retries 5, 5169 ms) at org.apache.jackrabbit.oak.spi.state.AbstractNodeStoreBranch.merge0(AbstractNodeStoreBranch.java:345) at org.apache.jackrabbit.oak.plugins.document.DocumentNodeStoreBranch.merge(DocumentNodeStoreBranch.java:156) at org.apache.jackrabbit.oak.plugins.document.DocumentRootBuilder.merge(DocumentRootBuilder.java:160) at org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore.merge(DocumentNodeStore.java:1588) at org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate.mergeWithConcurrencyCheck(AsyncIndexUpdate.java:581) at org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate.updateIndex(AsyncIndexUpdate.java:525) at org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate.runWhenPermitted(AsyncIndexUpdate.java:431) at org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate.run(AsyncIndexUpdate.java:323) at org.apache.sling.commons.scheduler.impl.QuartzJobExecutor.execute(QuartzJobExecutor.java:115) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1164) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:634)
解决方法 resolution
如果有人遇到这种情况,解决此问题的最快方法可能是删除存储库中包含的索引数据并重新索引损坏的索引。
注意:对于这些示例,重新索引是一项耗时的耗资源操作,我们将使用索引"workflowDataLucene"
删除索引数据:
索引数据作为隐藏节点位于位于/oak:index/workflowDataLucene之后的存储库中,因此要删除损坏的索引,您需要:
- 将索引定义(仅)复制到新位置。
- 删除整个
/oak:index/workflowDataLucene节点结构。 - 重新创建
/oak:index/workflowDataLucene并触发重新索引。
解决方法:
作为解决方法,您可以停用索引并使用相同的定义创建新索引,而不是删除索引:
- 创建一个与损坏的索引定义相同的新索引
- 触发新索引上的重新索引
- 通过将type属性更改为“disabled”来停用损坏的索引
完成此更改后,每个查询都将转到新索引
从RDB中删除数据:
作为最后手段,如果您在RDBmk上运行,则可以分析以直接从数据库中删除索引数据,其查询类似于:
DELETE FROM NODES WHEREID = '2:/oak:index/workflowDataLucene' OR ID LIKE '3:/oak:index/workflowDataLucene/%' OR ID LIKE '4:/oak:index/workflowDataLucene/%' OR ID LIKE '5:/oak:index/workflowDataLucene/%' OR ID LIKE '6:/oak:index/workflowDataLucene/%' OR ID LIKE '7:/oak:index/workflowDataLucene/%' OR ID LIKE '8:/oak:index/workflowDataLucene/%' OR ID LIKE '9:/oak:index/workflowDataLucene/%' OR ID LIKE '10:/oak:index/workflowDataLucene/%' OR ID LIKE '5:p/oak:index/workflowDataLucene/%' OR ID LIKE '6:p/oak:index/workflowDataLucene/%' OR ID LIKE '7:p/oak:index/workflowDataLucene/%' OR ID LIKE '8:p/oak:index/workflowDataLucene/%' OR ID LIKE '9:p/oak:index/workflowDataLucene/%' OR ID LIKE OR ID LIKE '11:p/oak:index/workflowDataLucene/%' OR ID LIKE '12:p/oak:index/workflowDataLucene/%' 7}
如果决定转到此路径,请确保在运行查询之前对其进行验证,因为可能需要对其进行一些更改'10:p/oak:index/workflowDataLucene/%' OR
注意: AEM必须关闭,并且本地持久缓存和索引文件(< crx-quickstart> /repository/cache和< crx-quickstart> /repository/index)必须在此删除后启动AEM。