【问题标题】:neo4j broken/corrupted after ungraceful shutdownNeo4j 在不正常关机后损坏/损坏
【发布时间】:2014-09-27 21:15:20
【问题描述】:

我在 windows 上使用 Neo4j 进行测试,我正在使用一个包含约 200 万个关系和大约相同数量的节点的数据库。在我编写一批关系时不正常地关闭了 neo4j 后,数据库损坏了。

似乎数据库中有一些损坏的节点/关系,每当我尝试读取它们时,我都会收到此错误(我正在使用 py2neo):

Error: NodeImpl#1292315 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.

我尝试重新启动,但 neo4j 无法从该错误中恢复。我发现了这个问题: Neo4j cannot read certain nodes. Throws NotFoundException. Corrupt database 但是他得到的答案对我没有好处,因为它涉及遍历数据库并重做索引,而且我什至无法读取那些损坏的节点/关系,所以我无法修复它们的索引(尝试过并得到相同错误)。

总的来说,我在使用 neo4j 时遇到了很多稳定性问题(在多个平台上,而不仅仅是 Windows)。如果没有找到合适的解决方案来解决这个问题,我将不得不切换到不同的数据库。

提前致谢!

【问题讨论】:

  • 我尝试编写一个脚本来查询所有节点(显然上述异常失败),并且从异常字符串中我得到了有问题的节点的 id 并将其删除。我想在循环中运行它,直到没有更多错误,但是当我执行删除部分时,我收到了这个错误:文件“C:\Python27\lib\site-packages\py2neo\neo4j.py”,行1076,在 _execute 中引发 CustomCypherError(e) InvalidRecordException: PropertyRecord[2083536] not in use
  • 我正在研究使用 neo4j 作为主要数据存储。您是否能够修复损坏问题,或者您是否已经切换到不同的数据库? Neo4j 看起来非常适合我正在构建的应用程序,但我担心可靠性。谢谢!
  • 你好 Venkat D,我真的不知道,因为我不再从事那个项目了。老实说,neo4j 感觉很不稳定,我对此不太满意,但我不知道替代方案是否更好。此外,在使用它时,我对基于节点的 dbs 还是很陌生,所以这可能会导致混乱。

标签: neo4j cypher py2neo


【解决方案1】:

我不久前写了一个工具,可以让您复制损坏的商店并保持良好记录完好无损。

您可能想检查一下。我假设您使用的是 Neo4j 的 2.1.x 版本。

https://github.com/jexp/store-utils/tree/21

对于 2.0.x,请查看:

https://github.com/jexp/store-utils/tree/20

【讨论】:

  • 谢谢,这周我会在某个地方调查并更新结果。
【解决方案2】:

要验证您的数据存储是否一致,请按照http://www.markhneedham.com/blog/2014/01/22/neo4j-backup-store-copy-and-consistency-check/ 中提到的步骤操作。

你说的“同时写一批关系”是指batch inserter API吗?

如果是这样,请注意批处理插入器 API 需要彻底关闭,请参阅 http://docs.neo4j.org/chunked/stable/batchinsert.html 上的大红色警告。

【讨论】:

  • 我正在使用“py2neo.neo4j.WriteBatch()”,我在这个文档中找到了它:book.py2neo.org/en/latest/batches 是吗?那里没有大红色警告......它说“这样的请求还具有在单个事务中执行的优势。”所以听起来这不是你发给我的?
  • 不,这不是批处理插入器 API,因为批处理插入器 API 没有事务的概念。确保使用一致性检查器。
  • 一致性检查器有什么用?我已经知道数据库已损坏,甚至损坏节点的 ID(看起来它们存在但没有将 neo4j 弄乱的 PropertyRecord)。所以我很想知道如何解决它。
  • 顾名思义,一致性检查器将检查一致性。修复损坏的存储是一项非常重要的任务,需要基于对内部数据结构的深入了解进行大量手动工作。学习这些的最好方法是阅读github.com/neo4j/neo4j的单元测试
  • 因为我在一家初创公司工作并且时间和资源非常有限,所以我正在寻找一个简单的解决方案并且无法深入研究 neo4j。无论如何,谢谢。
【解决方案3】:

是否已对损坏的节点架构进行了索引,并且您是否尝试通过此索引标签/属性来读取它们?如果是这样,您可能会在突然关闭后遇到损坏的索引。

假设是这种情况,您可以尝试在服务器未运行时删除图形存储目录中的schema 子目录,并让数据库在重新启动时重建索引。虽然这不是从损坏的索引中恢复的官方方法,但它有时可以工作。显然,我建议您在尝试之前备份您的商店。

【讨论】:

  • 谢谢,但索引没有问题(我实际上删除了它们所在的整个索引,以防万一)。即使是诸如“START z=node(*) RETURN z”之类的简单查询也会在到达损坏的节点时引发错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 2023-01-16
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
相关资源
最近更新 更多