服务器崩溃后,恢复损坏的neo4j数据库graphdb.NotFoundException

时间:2014-01-20 16:14:56

标签: java neo4j corruption

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

  

线程中的异常" main" 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 $$匿名$ 1.hasProperty(GDSBackedQueryContext.scala:66)     在   org.neo4j.cypher.internal.spi.gdsimpl.GDSBackedQueryContext $$匿名$ 1.hasProperty(GDSBackedQueryContext.scala:48)     在   org.neo4j.cypher.internal.commands.Has.isMatch(Predicate.scala:203)     在   org.neo4j.cypher.internal.pipes.FilterPipe $$ anonfun $ internalCreateResults $ 1.适用(FilterPipe.scala:30)     在   org.neo4j.cypher.internal.pipes.FilterPipe $$ anonfun $ internalCreateResults $ 1.适用(FilterPipe.scala:30)     在scala.collection.Iterator $$ anon $ 14.hasNext(Iterator.scala:390)at   scala.collection.Iterator $ class.foreach(Iterator.scala:727)at   scala.collection.AbstractIterator.foreach(Iterator.scala:1156)at   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 $ $内部$ executionplan $$ ExecutionPlanImpl prepareStateAndResult(ExecutionPlanImpl.scala:164)     在   org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl $$ anonfun $ getLazyReadonlyQuery $ 1.适用(ExecutionPlanImpl.scala:139)     在   org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl $$ anonfun $ getLazyReadonlyQuery $ 1.适用(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)     at 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并希望升级到使用标签等,但我现在需要这个数据库用于一些时间紧迫的工作,而且现在没有时间改变任何重要的事情。

非常感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:1)

抱歉,那件事发生在你身上。 :(那是什么样的撞车?

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

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

然后,您可以使用

以编程方式重新索引节点

for(Node n:GlobalGraphOperations.at(db).getAllNodes()){    if(node.hasProperty(“key”))      。db.index()forNodes( “索引”)添加(节点, “钥匙”,node.getProperty( “钥匙”)); }

如果您能够获得分析数据库,那就太棒了。 非常感谢