You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    java -cp h2-1.4.192.jar org.h2.tools.RunScript -url jdbc:h2:./h2db -script migrate.sql
    
    migrate.sql包含部分ALTER语句
  • 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]

解决方案

应急恢复步骤(生产环境优先)

  1. 立即停止应用,完整备份当前损坏的h2db.mv.db和h2db.trace.db文件,避免进一步损坏
  2. 删除损坏的数据库文件:
    rm h2db.mv.db h2db.trace.db
    
  3. 使用迁移时生成的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
    
  4. 启动应用,验证所有功能正常,尤其是缓存表创建逻辑

根本原因

H2 2.X系列的MVStore存储引擎在小版本间(如2.1.212与2.1.214)存在内部结构的不兼容变更,用旧版本创建的数据库文件被新版本写入后,会破坏MVStore的一致性,导致重启后出现Chunk丢失的错误。

预防措施

  1. 迁移全程使用应用最终要部署的目标H2版本执行所有操作,禁止跨版本操作数据库文件
  2. 迁移完成后,用目标版本执行数据库检查与修复:
    java -cp h2-2.1.214.jar org.h2.tools.Recover -url jdbc:h2:./h2db
    
  3. 生产环境定期备份数据库文件,保留至少最近3次的完整备份,确保故障时可快速回退

内容的提问来源于stack exchange,提问作者Shubham kapoor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:40:34