修复受损的Neo4j数据库(2.3.2社区版)

7
我的neo4j-2.3.2-community数据库的磁盘空间已满 (80G)。我对它进行了干净的关闭,然后添加了更多磁盘,并试图重新启动它,但只得到了晦涩的错误消息,并且它拒绝启动。
今天早上,当我意识到磁盘已满并且不再接受任何插入时,我将其关闭。直到今晚我才尝试重新启动它,对于日志中关机和重启之间的明显间隔,我表示歉意。该数据库仍处于原型/概念验证阶段。我过去一周一直在运行加载数据的作业。我真的非常不想重新开始这个数据加载过程。它太慢了。
我希望有人告诉我是否有类似“neo4j --force_repair”的命令行选项可以解决问题。我的数据加载器足够聪明,在尝试加载新记录之前,会检查其成功插入数据库的最后记录,因此,如果我们失去了一些记录,应该还好。
以下是我在console.log中看到的内容。
2016-01-31 16:25:56.648+0000 INFO  Successfully shutdown Neo4j Server
2016-01-31 16:25:56.810+0000 INFO  Successfully stopped database
2016-01-31 16:25:56.811+0000 INFO  Successfully shutdown database
2016-02-01 01:16:10.591+0000 INFO  Successfully shutdown Neo4j Server
2016-02-01 01:16:10.593+0000 ERROR Failed to start Neo4j: Starting Neo4j failed: Component 'org.neo4j.server.database.LifecycleManagingDatabase@2d9e9010' was successfully initialized, but failed to start. Please see attached cause exception. Starting Neo4j failed: Component 'org.neo4j.server.database.LifecycleManagingDatabase@2d9e9010' was successfully initialized, but failed to start. Please see attached cause exception.
org.neo4j.server.ServerStartupException: Starting Neo4j failed: Component 'org.neo4j.server.database.LifecycleManagingDatabase@2d9e9010' was successfully initialized, but failed to start. Please see attached cause exception.
    at org.neo4j.server.exception.ServerStartupErrors.translateToServerStartupError(ServerStartupErrors.java:67)
    at org.neo4j.server.AbstractNeoServer.start(AbstractNeoServer.java:234)
    at org.neo4j.server.Bootstrapper.start(Bootstrapper.java:97)
    at org.neo4j.server.CommunityBootstrapper.start(CommunityBootstrapper.java:48)
    at org.neo4j.server.CommunityBootstrapper.main(CommunityBootstrapper.java:35)
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.server.database.LifecycleManagingDatabase@2d9e9010' was successfully initialized, but failed to start. Please see attached cause exception.
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:462)
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:111)
    at org.neo4j.server.AbstractNeoServer.start(AbstractNeoServer.java:194)
    ... 3 more
Caused by: java.lang.RuntimeException: Error starting org.neo4j.kernel.impl.factory.CommunityFacadeFactory, /home/neo4j/neo4j-community-2.3.2/data/graph.db
    at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.newFacade(GraphDatabaseFacadeFactory.java:143)
    at org.neo4j.kernel.impl.factory.CommunityFacadeFactory.newFacade(CommunityFacadeFactory.java:43)
    at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.newFacade(GraphDatabaseFacadeFactory.java:108)
    at org.neo4j.server.CommunityNeoServer$1.newGraphDatabase(CommunityNeoServer.java:66)
    at org.neo4j.server.database.LifecycleManagingDatabase.start(LifecycleManagingDatabase.java:95)
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:452)
    ... 5 more
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component 'org.neo4j.kernel.recovery.Recovery@4ec23a22' failed to initialize. Please see attached cause exception.
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.init(LifeSupport.java:434)
    at org.neo4j.kernel.lifecycle.LifeSupport.init(LifeSupport.java:66)
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:102)
    at org.neo4j.kernel.NeoStoreDataSource.start(NeoStoreDataSource.java:600)
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:452)
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:111)
    at org.neo4j.kernel.impl.transaction.state.DataSourceManager.start(DataSourceManager.java:112)
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:452)
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:111)
    at org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.newFacade(GraphDatabaseFacadeFactory.java:139)
    ... 10 more
Caused by: java.lang.IllegalArgumentException: Unknown entry type -1 for version -1. At position LogPosition{logVersion=252, byteOffset=100663356} and entry version V2_1
    at org.neo4j.kernel.impl.transaction.log.entry.LogEntryVersion.entryParser(LogEntryVersion.java:207)
    at org.neo4j.kernel.impl.transaction.log.entry.VersionAwareLogEntryReader.readLogEntry(VersionAwareLogEntryReader.java:92)
    at org.neo4j.kernel.impl.transaction.log.LogEntryCursor.next(LogEntryCursor.java:54)
    at org.neo4j.kernel.recovery.LatestCheckPointFinder.find(LatestCheckPointFinder.java:77)
    at org.neo4j.kernel.recovery.PositionToRecoverFrom.apply(PositionToRecoverFrom.java:53)
    at org.neo4j.kernel.recovery.DefaultRecoverySPI.getPositionToRecoverFrom(DefaultRecoverySPI.java:135)
    at org.neo4j.kernel.recovery.Recovery.init(Recovery.java:72)
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.init(LifeSupport.java:424)
    ... 19 more
1个回答

15

这看起来像是交易日志只被部分写入了。如果是真的,数据存储本身不太可能损坏。

警告:在 data/graph.db 文件夹中进行任何手动更改之前,请确保已经备份了一份副本。

在继续之前,请阅读上面的段落。已经备份了吗?如果是,请尝试通过 rm neostore.transaction.db.* 删除 data/graph.db 中的事务日志文件。然后尝试启动 Neo4j。如果它仍然无法启动,请粘贴包含最新启动序列的 data/graph.db/messages.log 片段 - 这应该可以提供更多见解。


(我正在尝试 - 几分钟后告诉您...)使用关系型数据库时,我经常将事务日志放在与主数据存储不同的卷上。我通常会将事务日志放在最高性能的卷上。我还喜欢将它们分开,因为我可以更轻松地单独跟踪和管理事务日志(归档、数量和大小等)。对于Neo4j来说这是最佳实践吗? - rotten
看起来问题已经解决了。 :-) 谢谢!-- 80G中的62G是那些交易日志。 (!) 显然它们从不默认旋转或归档?有没有办法知道何时不再需要它们,以便我可以清除它们?在我的原型数据库中,我大约有1M个节点和可能是关系的10倍(计算它们需要很长时间)。 - rotten
1
您需要设置配置选项 keep_logical_logs。在企业版中,您需要保留逻辑日志以进行 a) 集群传播和 b) 在线备份。在社区版中,通常可以使用 keep_logical_logs=false。将 tx 日志放入单独的目录/磁盘没有简单的方法 - 在 SSD 驱动器的世界中,无论如何都没有必要这样做。 - Stefan Armbruster
我遇到了同样的问题,不幸的是,在下一次重启后删除我的事务日志会给我带来另一个错误。记得备份! - c z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接