【问题标题】:Recover corrupt neo4j Database after server crash graphdb.NotFoundException服务器崩溃后恢复损坏的 Neo4j 数据库 graphdb.NotFoundException
【发布时间】:2014-01-20 16:14:55
【问题描述】:

我有一个 neo4j 数据库,其中包含数百万个节点和几乎一样多的关系。在运行向其添加数据的程序时,JVM 似乎已经崩溃。当我后来尝试使用索引查询数据库时,它正常打开并检索了一些节点,但在某些时候返回了以下错误:

线程“主”org.neo4j.graphdb.NotFoundException 中的异常: 未找到节点 [20924]。这可能是因为其他人删除了此 当我们试图从中读取属性时,或者因为 同时修改此实体上的其他属性。这 问题应该是暂时的。在 org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:601) 在 org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:579) 在 org.neo4j.kernel.impl.core.Primitive.hasProperty(Primitive.java:309) 在 org.neo4j.kernel.impl.core.NodeImpl.hasProperty(NodeImpl.java:53) 在 org.neo4j.kernel.impl.core.NodeProxy.hasProperty(NodeProxy.java:160) 在 org.neo4j.cypher.internal.spi.gdsimpl.GDSBackedQueryContext$$anon$1.hasProperty(GDSBackedQueryContext.scala:66) 在 org.neo4j.cypher.internal.spi.gdsimpl.GDSBackedQueryContext$$anon$1.hasProperty(GDSBackedQueryContext.scala:48) 在 org.neo4j.cypher.internal.commands.Has.isMatch(Predicate.scala:203) 在 org.neo4j.cypher.internal.pipes.FilterPipe$$anonfun$internalCreateResults$1.apply(FilterPipe.scala:30) 在 org.neo4j.cypher.internal.pipes.FilterPipe$$anonfun$internalCreateResults$1.apply(FilterPipe.scala:30) 在 scala.collection.Iterator$$anon$14.hasNext(Iterator.scala:390) 在 scala.collection.Iterator$class.foreach(Ite​​rator.scala:727) 在 scala.collection.AbstractIterator.foreach(Ite​​rator.scala:1156) 在 org.neo4j.cypher.internal.pipes.EagerAggregationPipe.internalCreateResults(EagerAggregationPipe.scala:76) 在 org.neo4j.cypher.internal.pipes.PipeWithSource.createResults(Pipe.scala:69) 在 org.neo4j.cypher.internal.pipes.PipeWithSource.createResults(Pipe.scala:66) 在 org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl.org$neo4j$cypher$internal$executionplan$ExecutionPlanImpl$$prepareStateAndResult(ExecutionPlanImpl.scala:164) 在 org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl$$anonfun$getLazyReadonlyQuery$1.apply(ExecutionPlanImpl.scala:139) 在 org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl$$anonfun$getLazyReadonlyQuery$1.apply(ExecutionPlanImpl.scala:138) 在 org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl.execute(ExecutionPlanImpl.scala:38) 在 org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:72) 在 org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:67) 在 org.neo4j.cypher.javacompat.ExecutionEngine.execute(ExecutionEngine.java:66) 在 querygraph.BasicStatsQueries.main(BasicStatsQueries.java:54) 引起:org.neo4j.kernel.impl.nioneo.store.InvalidRecordException: PropertyRecord[11853043] 未在使用 org.neo4j.kernel.impl.nioneo.store.PropertyStore.getRecord(PropertyStore.java:453) 在 org.neo4j.kernel.impl.nioneo.store.PropertyStore.getLightRecord(PropertyStore.java:306) 在 org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.getPropertyRecordChain(ReadTransaction.java:185) 在 org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.loadProperties(ReadTransaction.java:215) 在 org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.nodeLoadProperties(ReadTransaction.java:239) 在 org.neo4j.kernel.impl.persistence.PersistenceManager.loadNodeProperties(PersistenceManager.java:111) 在 org.neo4j.kernel.impl.core.NodeManager.loadProperties(NodeManager.java:833) 在 org.neo4j.kernel.impl.core.NodeImpl.loadProperties(NodeImpl.java:143) 在 org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:596) ... 23 更多

只有一个线程(至少是我开始的)运行查询,而且都是读取,而不是写入。尽管异常声称它是临时的,但每次我尝试查询此索引时都会发生这种情况。因此,我认为这与糟糕的关机有关。在我实施代码以防止这种情况之前,我曾因强制关闭而导致数据库损坏,但 neo4j 始终能够恢复数据库,尽管这需要一段时间。这似乎更糟。

当我手动循环遍历索引并添加一个 try-catch 时,它开始为索引中在上面列出的节点之后的每个节点返回错误。这是否意味着所有这些节点都不存在或已损坏?这将意味着大量(大量)数据丢失,因为索引中应该有大约一百万个节点。我可以做些什么来恢复数据库?

我正在使用 1.9.2,并且很想升级以使用标签等,但我现在需要这个数据库来完成一些时间紧迫的工作,并且现在没有时间进行任何重大更改。

非常感谢您的任何帮助。

【问题讨论】:

    标签: java neo4j corruption


    【解决方案1】:

    很抱歉发生在你身上。 :(那是什么类型的崩溃?

    我建议对数据库进行备份,然后删除并重新创建索引。

    当您无法以编程方式删除索引时,您也可以删除以下目录 /data/graph.db/index/lucene/node/<indexname> 数据库关闭时。

    然后您可以使用编程方式重新索引您的节点

    for (节点 n : GlobalGraphOperations.at(db).getAllNodes()) { if (node.hasProperty("key")) db.index().forNodes("index").add(node,"key",node.getProperty("key")); }

    如果您能给我们提供用于分析的数据库,那就太好了。 非常感谢

    【讨论】:

    • 谢谢!如果可行,我将尝试此操作并将其标记为答案。 JVM 崩溃可能是由程序中使用 neo4j 的某些东西引起的——不知道是 neo4j 本身还是其他组件之一。我会看看我是否可以让你拥有数据库,如果可以,我会将服务器日志一起发送。
    • 我看到您多次要求在类似情况下查看数据库,很高兴知道 neo 真的能解决任何问题 - 谢谢!
    • 我可以假设你的意思是 'for (Node n : GlobalGraphOperations.at(db).getAllNodes()) 吗?
    • 我试过了,不幸的是,它在一个 id 稍小的节点上再次崩溃并出现同样的错误。如果在图中找不到这些节点,又没有索引,它怎么会认为这些节点存在呢?我现在该怎么办?
    • 您究竟为修复做了什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2017-10-28
    • 1970-01-01
    • 2011-03-29
    • 2013-08-18
    • 2019-04-06
    • 1970-01-01
    相关资源
    最近更新 更多