Neo4j使用大量事务日志恢复数据库(在旧版索引目录中)

时间:2014-02-12 08:23:06

标签: transactions neo4j

neo4j documentation对交易有这个说法:

// Now, transaction handling in Neo4j is very easy
try ( Transaction tx = graphDb.beginTx() )
{
    // Database operations go here
    tx.success();
}

我知道这闻到了腥味,只有在遇到问题后才调查它。它应该是:

// Transaction handling in neo4j is slightly less easier , omg a tx.close() :D 
try ( Transaction tx = graphDb.beginTx() )
{
    // Database operations go here
    tx.success();
}
finally {
  tx.close()
}

我运行了大量的批量全文索引操作,现在我似乎无法启动db了。 (在使用6g堆的嵌入式应用程序中执行此操作时,使用shell时出现GC错误,其他异常)。

如何销毁事务日志(是的,我将在此之后以批量插入器模式运行数据库)?

P.S。,

➜  index  pwd
/Users/hassan/code/scala/avro/chunks.db/index
➜  index  ls
lucene            lucene.log.2      lucene.log.v0     lucene.log.v10    lucene.log.v12    lucene.log.v14    lucene.log.v3     lucene.log.v5     lucene.log.v7     lucene.log.v9
lucene-store.db   lucene.log.active lucene.log.v1     lucene.log.v11    lucene.log.v13    lucene.log.v2     lucene.log.v4     lucene.log.v6     lucene.log.v8

是否会删除*.log诀窍或将这些日志注册到重要位置 - 即,删除它们会导致进一步的问题吗?

建议:

shell应该有一些逻辑来处理这样的情况。应该让我做出一些选择。

  1. 至少增加堆大小(即使它没有帮助)。
  2. 提议删除某些交易日志等(至少如果有工具,可以确保用户可以干净地完成)。
  3. 更好的是,事务重放逻辑应该知道如何在JVM堆的范围之外工作(就像任何事务数据库一样)。

2 个答案:

答案 0 :(得分:2)

实际上,第一个try()版本与第二个版本相同。

Neo4j的事务实现AutoClosable,因此java try-with-resource处理将在try块的末尾正确调用tx.close()

为了不保留逻辑日志,您可以添加如下配置选项:

keep_logical_logs=false

or

keep_logical_logs=2 days

or

keep_logical_logs=500M

答案 1 :(得分:1)

删除索引目录中的日志文件似乎可以解决问题。在启动期间不会抛出任何异常,因此我认为数据库是健康的。如果他们愿意,neo4j开发者可以充实它。