【问题标题】:H2 - General error: "java.lang.NullPointerException" [50000-182]H2 - 一般错误:“java.lang.NullPointerException”[50000-182]
【发布时间】:2015-02-06 05:49:55
【问题描述】:

我有一个相当大 (>2.5 GB) 的 h2 数据库文件。驱动程序版本为 1.4.182。一切正常,但最近数据库停止工作,但出现异常:

Błąd ogólny: "java.lang.NullPointerException"
General error: "java.lang.NullPointerException" [50000-182] HY000/50000 (Help)
org.h2.jdbc.JdbcSQLException: Błąd ogólny: "java.lang.NullPointerException"
General error: "java.lang.NullPointerException" [50000-182] 
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) 
    at org.h2.message.DbException.get(DbException.java:168) 
    at org.h2.message.DbException.convert(DbException.java:295) 
    at org.h2.engine.Database.openDatabase(Database.java:297) 
    at org.h2.engine.Database.<init>(Database.java:260) 
    at org.h2.engine.Engine.openSession(Engine.java:60) 
    at org.h2.engine.Engine.openSession(Engine.java:167) 
    at org.h2.engine.Engine.createSessionAndValidate(Engine.java:145) 
    at org.h2.engine.Engine.createSession(Engine.java:128) 
    at org.h2.engine.Engine.createSession(Engine.java:26) 
    at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:347) 
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:108) 
    at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:92) 
    at org.h2.Driver.connect(Driver.java:72) 
    at org.h2.server.web.WebServer.getConnection(WebServer.java:750) 
    at org.h2.server.web.WebApp.test(WebApp.java:895) 
    at org.h2.server.web.WebApp.process(WebApp.java:221) 
    at org.h2.server.web.WebApp.processRequest(WebApp.java:170) 
    at org.h2.server.web.WebThread.process(WebThread.java:137) 
    at org.h2.server.web.WebThread.run(WebThread.java:93) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.NullPointerException 
    at org.h2.mvstore.db.ValueDataType.compare(ValueDataType.java:102) 
    at org.h2.mvstore.MVMap.compare(MVMap.java:741) 
    at org.h2.mvstore.Page.binarySearch(Page.java:388) 
    at org.h2.mvstore.MVMap.put(MVMap.java:179) 
    at org.h2.mvstore.MVMap.put(MVMap.java:133) 
    at org.h2.mvstore.db.TransactionStore.rollbackTo(TransactionStore.java:491) 
    at org.h2.mvstore.db.TransactionStore$Transaction.rollback(TransactionStore.java:785) 
    at org.h2.mvstore.db.MVTableEngine$Store.initTransactions(MVTableEngine.java:223) 
    at org.h2.engine.Database.open(Database.java:736) 
    at org.h2.engine.Database.openDatabase(Database.java:266) 
... 17 more 

问题出现在我的应用程序和使用 H2 Web 前端。 我尝试了similar question 的解决方案,但我无法将 H2 降级到 1.3.x,因为它无法读取 1.4.x 数据库文件。

我的问题是

如何处理?是否有可能让它再次工作?我曾尝试将 H2 降级到 1.4.177,但没有帮助。

有没有办法至少将数据恢复为其他格式?我可以使用其他数据库(Sqlite 等),但是我需要一种方法来获取这些数据。

编辑:更新堆栈跟踪

编辑 2: 使用恢复工具的结果:

$ java -cp h2-1.4.182.jar org.h2.tools.Recover
Exception in thread "main" java.lang.IllegalStateException: Unknown tag 50 [1.4.182/6]
   at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:762)
   at org.h2.mvstore.type.ObjectDataType.read(ObjectDataType.java:222)
   at org.h2.mvstore.db.TransactionStore$ArrayType.read(TransactionStore.java:1792)
   at org.h2.mvstore.db.TransactionStore$ArrayType.read(TransactionStore.java:1759)
   at org.h2.mvstore.Page.read(Page.java:843)
   at org.h2.mvstore.Page.read(Page.java:230)
   at org.h2.mvstore.MVStore.readPage(MVStore.java:1813)
   at org.h2.mvstore.MVMap.readPage(MVMap.java:769)
   at org.h2.mvstore.Page.getChildPage(Page.java:252)
   at org.h2.mvstore.MVMap.getFirstLast(MVMap.java:351)
   at org.h2.mvstore.MVMap.firstKey(MVMap.java:218)
   at org.h2.mvstore.db.TransactionStore.init(TransactionStore.java:169)
   at org.h2.mvstore.db.TransactionStore.<init>(TransactionStore.java:117)
   at org.h2.mvstore.db.TransactionStore.<init>(TransactionStore.java:81)
   at org.h2.tools.Recover.dumpMVStoreFile(Recover.java:593)
   at org.h2.tools.Recover.process(Recover.java:331)
   at org.h2.tools.Recover.runTool(Recover.java:192)
   at org.h2.tools.Recover.main(Recover.java:155)

我还注意到已经创建了另外两个文件(.txt 和 .sql),但它们似乎不包含数据。

【问题讨论】:

  • 这是旧版本 (1.4.177) 的堆栈跟踪,您能发布最新版本 (1.4.182) 的堆栈跟踪吗?
  • 是的,你是对的。我更新了堆栈跟踪,但它似乎是一样的。
  • 您是否尝试过使用Recover 工具?这是在包org.h2.tools 中。另请参阅此工具的文档。
  • 我担心这个数据库文件已经损坏,无法修复。我有兴趣分析这个问题。可以把数据库文件发给我吗?
  • 我已经更改了后备箱中 H2 的恢复工具,所以理论上它即使在这种情况下也应该继续。你可以测试一下吗?您需要在 code.google.com/p/support/source/checkout 的主干中自己构建 H2

标签: java database nullpointerexception h2


【解决方案1】:

上周我在 JIRA 数据库中遇到了同样的情况,我花了几个小时在谷歌上搜索了这个问题,但是没有可以解决这种情况的答案。

我决定看一下 H2 源代码,我可以用非常简单的代码恢复整个数据库。我可能不了解情况的全貌,例如根本原因,它发生在什么条件下,等等。 但是,原因是:当你连接到 h2 文件时,H2 引擎会查看 auditLog 并回滚正在进行的事务,有一些数据类型未知(id 为 17),并且 H2 由于识别过程中的异常而无法回滚类型(id 17)。

我的代码很简单,将 h2 lib 添加到您的构建路径中,然后手动连接到文件并清除 auditLog,因为我认为这只是日志,不会产生太大影响(有人可能会纠正我)。 希望您也能解决您的问题。

public static void main(final String[] args) {
    // open the store (in-memory if fileName is null)
    final MVStore store = MVStore.open("C:\\temp\\h2db.mv.db");

    final MVMap<Object, Object> openMap = store.openMap("undoLog");

    openMap.clear();

    // close the store (this will persist changes)
    store.close();
}

【讨论】:

  • 非常感谢,它也对我有用!我在这里做了一个简单的项目:github.com/nyg/h2-recover
  • 这对我也有用。非常感谢!干杯!
  • 太棒了,谢谢!!我有一个系统,一些用户非常喜欢预生产演示,他们坚持立即使用它。你用这个拯救了一天,而整个事件激励我真正准备好切换到合适的生产数据库!
  • 上述脚本对我没有帮助。切换到 1.4.199 成功了github.com/h2database/h2database/issues/…
  • 太好了,非常感谢,仍然适用于 Jira 8.11。我用这个 sn-p 做了一个简短的groovy script
【解决方案2】:

这个问题的另一种解决方案:

  1. 转到您的主文件夹(在 linux 中为 ~)。

  2. 将所有名为 [*.mv.db] 的文件移动到具有不同名称的备份。例如:mv xyz.mv.db xyz.mv.db.backup

  3. 重新启动数据库。

这似乎清除了用于 H2 撤消功能的 MVStore 元数据,并解决了 MV Store 比较中的 NPE。

【讨论】:

    【解决方案3】:

    我也遇到过类似的问题:

    [HY000][50000] Allgemeiner Fehler: "java.lang.NullPointerException"
    General error: "java.lang.NullPointerException" [50000-176]
    java.lang.NullPointerException
    

    我尝试将 IntelliJ 连接到 H2 文件数据库。 H2 驱动程序版本为 1.3.176,但 DB 文件版本为 1.3.161。于是在 IntelliJ 中将驱动降级到 1.3.161 就彻底解决了问题。

    【讨论】:

      猜你喜欢
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 2014-03-10
      • 2016-07-25
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多