2014-01-20 5 views
2

У меня есть база данных neo4j с несколькими миллионами узлов и примерно столько же отношений. Во время запуска программы, которая добавляла к ней данные, JVM, похоже, разбилась. Когда позже я пытался обращаться к базе данных с использованием индекса, он был открыт как обычно и извлекаются некоторые из узлов, но в какой-то момент возвратил следующую ошибку:Восстановление поврежденной базы данных neo4j после сбоя сервера graphdb.NotFoundException

Exception in thread "main" org.neo4j.graphdb.NotFoundException: Node[20924] not found. This can be because someone else deleted this entity while we were trying to read properties from it, or because of concurrent modification of other properties on this entity. The problem should be temporary. at org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:601) at org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:579) at org.neo4j.kernel.impl.core.Primitive.hasProperty(Primitive.java:309) at org.neo4j.kernel.impl.core.NodeImpl.hasProperty(NodeImpl.java:53) at org.neo4j.kernel.impl.core.NodeProxy.hasProperty(NodeProxy.java:160) at org.neo4j.cypher.internal.spi.gdsimpl.GDSBackedQueryContext$$anon$1.hasProperty(GDSBackedQueryContext.scala:66) at org.neo4j.cypher.internal.spi.gdsimpl.GDSBackedQueryContext$$anon$1.hasProperty(GDSBackedQueryContext.scala:48) at org.neo4j.cypher.internal.commands.Has.isMatch(Predicate.scala:203) at org.neo4j.cypher.internal.pipes.FilterPipe$$anonfun$internalCreateResults$1.apply(FilterPipe.scala:30) at org.neo4j.cypher.internal.pipes.FilterPipe$$anonfun$internalCreateResults$1.apply(FilterPipe.scala:30) at 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) at org.neo4j.cypher.internal.pipes.PipeWithSource.createResults(Pipe.scala:69) at org.neo4j.cypher.internal.pipes.PipeWithSource.createResults(Pipe.scala:66) at org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl.org$neo4j$cypher$internal$executionplan$ExecutionPlanImpl$$prepareStateAndResult(ExecutionPlanImpl.scala:164) at org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl$$anonfun$getLazyReadonlyQuery$1.apply(ExecutionPlanImpl.scala:139) at org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl$$anonfun$getLazyReadonlyQuery$1.apply(ExecutionPlanImpl.scala:138) at org.neo4j.cypher.internal.executionplan.ExecutionPlanImpl.execute(ExecutionPlanImpl.scala:38) at org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:72) at org.neo4j.cypher.ExecutionEngine.execute(ExecutionEngine.scala:67) at org.neo4j.cypher.javacompat.ExecutionEngine.execute(ExecutionEngine.java:66) at querygraph.BasicStatsQueries.main(BasicStatsQueries.java:54) Caused by: org.neo4j.kernel.impl.nioneo.store.InvalidRecordException: PropertyRecord[11853043] not in use at org.neo4j.kernel.impl.nioneo.store.PropertyStore.getRecord(PropertyStore.java:453) at org.neo4j.kernel.impl.nioneo.store.PropertyStore.getLightRecord(PropertyStore.java:306) at org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.getPropertyRecordChain(ReadTransaction.java:185) at org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.loadProperties(ReadTransaction.java:215) at org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.nodeLoadProperties(ReadTransaction.java:239) at org.neo4j.kernel.impl.persistence.PersistenceManager.loadNodeProperties(PersistenceManager.java:111) at org.neo4j.kernel.impl.core.NodeManager.loadProperties(NodeManager.java:833) at org.neo4j.kernel.impl.core.NodeImpl.loadProperties(NodeImpl.java:143) at org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:596) ... 23 more

Там был только один поток (по крайней мере, что я начал), выполняющий запрос, и он все читал, а не писал. И хотя исключение утверждает, что оно временное, это происходит каждый раз, когда я пытаюсь запросить этот индекс. Поэтому я предполагаю, что это связано с плохим отключением. У меня были коррумпированные базы данных до принудительных отключений, прежде чем я реализовал код для предотвращения этого, но neo4j всегда мог восстановить базу данных, хотя это заняло некоторое время. Кажется, это намного хуже.

Когда я зациклился по индексу вручную и добавил попытку, он начал возвращать ошибку для каждого узла в индексе после указанного выше. Означает ли это, что все эти узлы несуществуют или повреждены? Это означало бы значительную (огромную) потерю данных, так как в индексе должно быть около миллиона узлов. Что можно сделать для восстановления базы данных?

Я использую 1.9.2 и хотел бы обновить, чтобы использовать ярлыки и т. Д., Но мне нужна эта база данных прямо сейчас для некоторой критически важной работы и у меня нет времени изменить что-либо важное сейчас.

Большое спасибо за любую помощь.

ответ

1

жаль, что это случилось с вами. :(Какие аварии было?

Я рекомендовал бы сделать резервную копию базы данных, а затем удалить и воссоздавать индекс.

Если вы не можете удалить индекс программно можно также удалить каталог под /data/graph.db/index/lucene/node/<indexname> ., когда база данных закрыта

Затем после этого вы можете программно повторно индексировать узлы с помощью

для (Node п: GlobalGraphOperations.at (дБ) .getAllNodes()) { если (node.hasProperty («ключ»)) db.index(). ForNodes («index»). Add (node, «key», node.getProperty («ключ»)); }

Было бы здорово, если бы вы могли получить нашу базу данных для аналитики. Спасибо большое

+0

Спасибо! Я собираюсь попробовать это и отметить это как ответ, если он будет работать. Сбой JVM, вероятно, был вызван чем-то в программе, использующей neo4j - не знаю, был ли это сам neo4j или один из других компонентов. Я узнаю, могу ли я предоставить вам базу данных, и если да, я отправлю журналы сервера. – bsg

+0

Я видел, как вы попросили несколько раз увидеть базы данных в подобных ситуациях, и это здорово знать, что neo действительно стоит над любыми проблемами - спасибо! – bsg

+0

Могу ли я предположить, что вы имели в виду 'for (Node n: GlobalGraphOperations.at (db) .getAllNodes())? – bsg

Смежные вопросы