首批通过分布式安全可靠测评,为关键业务系统打造
桌面版 ODC 启动失败/h2数据库损坏 Chuck not found
更新时间:2025-06-17 09:01
问题现象
Windows 系统下,桌面版 ODC 启动失败,报错日志中提示:"java.lang.IllegalStateException: Chunk *** not found"。
Caused by: java.lang.IllegalStateException: Chunk 225780 not found [1.4.200/9]
at org.h2.mvstore.DataUtils.newIllegalStateException(DataUtils.java:950) ~[h2-1.4.200.jar!/:?]
at org.h2.mvstore.MVStore.getChunk(MVStore.java:1230) ~[h2-1.4.200.jar!/:?]
at org.h2.mvstore.MVStore.readBufferForPage(MVStore.java:1214) ~[h2-1.4.200.jar!/:?]
at org.h2.mvstore.MVStore.readPage(MVStore.java:2209) ~[h2-1.4.200.jar!/:?]
at org.h2.mvstore.MVMap.readPage(MVMap.java:672) ~[h2-1.4.200.jar!/:?]
at org.h2.mvstore.Page$NonLeaf.getChildPage(Page.java:1043) ~[h2-1.4.200.jar!/:?]
at org.h2.mvstore.Cursor.hasNext(Cursor.java:53) ~[h2-1.4.200.jar!/:?]
at org.h2.mvstore.MVMap$2$1.hasNext(MVMap.java:802) ~[h2-1.4.200.jar!/:?]
at org.h2.mvstore.db.LobStorageMap.init(LobStorageMap.java:109) ~[h2-1.4.200.jar!/:?]
at org.h2.engine.Database.open(Database.java:791) ~[h2-1.4.200.jar!/:?]
at org.h2.engine.Database.openDatabase(Database.java:307) ~[h2-1.4.200.jar!/:?]
at org.h2.engine.Database.<init>(Database.java:301) ~[h2-1.4.200.jar!/:?]
at org.h2.engine.Engine.openSession(Engine.java:74) ~[h2-1.4.200.jar!/:?]
at org.h2.engine.Engine.openSession(Engine.java:192) ~[h2-1.4.200.jar!/:?]
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:171) ~[h2-1.4.200.jar!/:?]
at org.h2.engine.Engine.createSession(Engine.java:166) ~[h2-1.4.200.jar!/:?]
at org.h2.engine.Engine.createSession(Engine.java:29) ~[h2-1.4.200.jar!/:?]
at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:340) ~[h2-1.4.200.jar!/:?]
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:173) ~[h2-1.4.200.jar!/:?]
at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:152) ~[h2-1.4.200.jar!/:?]
at org.h2.Driver.connect(Driver.java:69) ~[h2-1.4.200.jar!/:?]
at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) ~[HikariCP-3.4.5.jar!/:?]
at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:358) ~[HikariCP-3.4.5.jar!/:?]
at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-3.4.5.jar!/:?]
问题原因
桌面版 ODC 的 h2database 元数据库损坏,具体请参考 GitHub 的 IllegalStateException: Chunk not found in v1.4.200/9 和 Cursor sporadically fail with 'IllegalStateException: Chunk {number} not found'。
适用版本
Windows 系统下,ODC V3.x 和 V4.x。
解决方法
方法一:对元数据库文件进行修复
步骤 1: 下载恢复工具
注意
需要根据 h2 对应的版本进行下载,ODC 目前支持 1.4.200。
步骤 2:生成恢复 SQL 语句
查看元数据文件路径。桌面版 ODC 的元数据维护在嵌入式数据库 h2database 中:
Windows 系统下的数据文件路径 %USERPROFILE%\AppData\Roaming\odc\。
修复元数据库文件。
cd %USERPROFILE%\AppData\Roaming\odc\Mac 系统下的数据文件路径
/Users/{user}/Library/Application Support/odc。cd ~/"Library/Application Support/odc" ls odc*.db #查看以下 2 个文件,即 h2database 数据库对应的数据文件 #odc2.0.mv.db odc2.0.trace.db
将损坏的 ODC 元数据库文件 odc2.0.mv.db拷贝至 h2\bin\路径下。
进入 cmd 执行 java -cp h2-1.4.200.jar org.h2.tools.Recover,路径下会生成 odc2.0.h2.sql,如下图所示。

步骤 3:执行恢复 SQL 语句
生成新的数据库 odc2.1。参考命令如下:
java -cp h2-1.4.200.jar org.h2.tools.RunScript -url jdbc:h2:./odc2.1 -user sa -password '' -script odc2.0.h2.sql执行完成后,路径下会产生文件 odc2.1.mv.db。
步骤 4:拷贝恢复的数据库文件至 ODC 安装路径
将 odc2.1.mv.db 文件拷贝至元数据库文件所在路径下,并将其重命名为 odc2.0.mv.db。
重启 ODC。
方法二:对元数据库文件进行替换
ODC V3.x/V4.x 版本使用 h2database 均为 1.4.200 版本。可以将其它未出现该问题的客户端上的 h2database 文件 odc2.0.mv.db 替换到问题机器的目录下。
注意
此方式会丢失原 ODC 中存储的连接信息。