H2DB从1.X迁移至2.X后出现Chunk not found错误求助
H2DB 1.X迁移至2.X后"Chunk X not found"错误的解决方案
问题背景
近期将H2DB从1.X版本迁移至2.X版本,迁移后应用使用H2DB 2.1.214版本启动运行正常,但重启应用后创建缓存表时出现Chunk 849734 not found错误,使用H2控制台连接也报相同错误,导致生产环境用户无法访问应用。即使使用创建数据库文件的2.1.212版本访问,同样报错。
迁移执行步骤
- Step1:在1.X版本上执行迁移SQL
migrate.sql包含部分ALTER语句java -cp h2-1.4.192.jar org.h2.tools.RunScript -url jdbc:h2:./h2db -script migrate.sql - Step2:从1.X版本导出数据库备份
java -cp h2-1.4.192.jar org.h2.tools.Script -url jdbc:h2:./h2db -script h2db.zip -options compression zip - Step3:用2.1.212版本导入备份完成迁移
java -cp h2-2.1.212.jar org.h2.tools.RunScript -url jdbc:h2:./h2db -script h2db.zip -options compression zip FROM_1X
错误详情
Exception in thread "main" org.h2.jdbc.JdbcSQLNonTransientException: General error: "Chunk 849734 not found [2.1.212/9]"; SQL statement: CREATE CACHED TABLE "PUBLIC"."ABC_XYZ"( "ID" BIGINT SELECTIVITY 100 NOT NULL, "MACHINE_ID" BIGINT SELECTIVITY 1, "WHEN_CREATED" BIGINT SELECTIVITY 100 NOT NULL, "STATE" INTEGER SELECTIVITY 1, "WHEN_STATE_LAST_CHANGED" BIGINT SELECTIVITY 1, "WHO_CHANGED_STATE_LAST" BIGINT SELECTIVITY 1 ) [50000-212] at org.h2.message.DbException.getJdbcSQLException(DbException.java:554) at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) at org.h2.message.DbException.get(DbException.java:212) at org.h2.mvstore.db.Store.convertMVStoreException(Store.java:170) at org.h2.mvstore.db.Store.createTable(Store.java:220) at org.h2.schema.Schema.createTable(Schema.java:781) at org.h2.command.ddl.CreateTable.update(CreateTable.java:109) at org.h2.engine.MetaRecord.prepareAndExecute(MetaRecord.java:77) at org.h2.engine.Database.executeMeta(Database.java:660) at org.h2.engine.Database.executeMeta(Database.java:634) at org.h2.engine.Database.<init>(Database.java:357) at org.h2.engine.Engine.openSession(Engine.java:92) at org.h2.engine.Engine.openSession(Engine.java:222) at org.h2.engine.Engine.createSession(Engine.java:201) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:338) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:122) at org.h2.util.JdbcUtils.getConnection(JdbcUtils.java:288) at org.h2.util.JdbcUtils.getConnection(JdbcUtils.java:270) at org.h2.tools.Shell.runTool(Shell.java:146) at org.h2.tools.Shell.main(Shell.java:80) Caused by: org.h2.mvstore.MVStoreException: Chunk 849734 not found [2.1.212/9]
解决方案
应急恢复步骤(生产环境优先)
- 立即停止应用,完整备份当前损坏的
h2db.mv.db和h2db.trace.db文件,避免进一步损坏 - 删除损坏的数据库文件:
rm h2db.mv.db h2db.trace.db - 使用迁移时生成的
h2db.zip备份文件,直接用应用部署的H2版本(2.1.214)重新执行迁移:java -cp h2-2.1.214.jar org.h2.tools.RunScript -url jdbc:h2:./h2db -script h2db.zip -options compression zip FROM_1X - 启动应用,验证所有功能正常,尤其是缓存表创建逻辑
根本原因
H2 2.X系列的MVStore存储引擎在小版本间(如2.1.212与2.1.214)存在内部结构的不兼容变更,用旧版本创建的数据库文件被新版本写入后,会破坏MVStore的一致性,导致重启后出现Chunk丢失的错误。
预防措施
- 迁移全程使用应用最终要部署的目标H2版本执行所有操作,禁止跨版本操作数据库文件
- 迁移完成后,用目标版本执行数据库检查与修复:
java -cp h2-2.1.214.jar org.h2.tools.Recover -url jdbc:h2:./h2db - 生产环境定期备份数据库文件,保留至少最近3次的完整备份,确保故障时可快速回退
内容的提问来源于stack exchange,提问作者Shubham kapoor
相关产品推荐
相关产品推荐

