我有一个非常大的(> 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 DB文件。
我的问题是:
如何处理?是否有可能让它再次发挥作用?我已经尝试将H2降级到1.4.177,但它没有帮助。
有没有办法至少将数据恢复到其他格式?我可以使用其他DB(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),但它们似乎并不包含数据。
答案 0 :(得分:10)
上周我用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();
}
答案 1 :(得分:1)
此问题的另一种解决方案:
转到您的主文件夹(〜在linux中)。
将名为[* .mv.db]的所有文件移动到具有不同名称的备份。例如:mv xyz.mv.db xyz.mv.db.backup
重新启动数据库。
这似乎清除了用于H2撤消功能的MVStore元数据,并从MV Store比较中解析了NPE。
答案 2 :(得分:0)
我遇到了类似的问题:
[HY000][50000] Allgemeiner Fehler: "java.lang.NullPointerException"
General error: "java.lang.NullPointerException" [50000-176]
java.lang.NullPointerException
我尝试将IntelliJ连接到H2文件DB。 H2驱动程序版本为1.3.176,但DB文件版本为1.3.161。所以在IntelliJ中将驱动程序降级到1.3.161完全解决了这个问题。