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

如何将H2数据库mv.db备份迁移至MySQL(含Schema变更场景)

H2 mv.db 到 MySQL 的 Schema 适配迁移方案

1. 恢复H2备份到临时实例

  • 把你的mv.db文件放到单独目录,用H2控制台启动临时服务:
    java -cp h2-*.jar org.h2.tools.Server -web -webPort 8082
  • 打开浏览器访问http://localhost:8082,JDBC URL填jdbc:h2:file:/path/to/your/mv/db/file(无需加.mv.db后缀),登录后确认所有表和数据可正常访问。

2. 按新Schema导出H2数据

因为Schema有列重命名/删除调整,需手动映射字段导出CSV:

  • 对每个要迁移的表,执行H2的CSV导出命令,只保留MySQL新表需要的字段,并重命名匹配新列名:
    CALL CSVWRITE('/tmp/export/user_data.csv', 'SELECT id, old_username AS username, old_email AS email FROM user')
    • 示例中old_username是H2旧列名,username是MySQL新列名;不需要的列直接从SELECT语句中剔除。
  • 若有数据类型差异(比如H2的BOOLEAN对应MySQL的TINYINT(1)),导出时直接转换:
    SELECT id, CASE WHEN old_active THEN 1 ELSE 0 END AS active FROM user

3. 在MySQL中创建新Schema

提前在MySQL内建好调整后的表结构,确保字段类型、约束与新需求一致,示例:

CREATE TABLE user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(255) NOT NULL UNIQUE,
    email VARCHAR(255) NOT NULL,
    active TINYINT(1) DEFAULT 0
);

4. 导入CSV到MySQL

用MySQL的LOAD DATA命令高效导入:

LOAD DATA INFILE '/tmp/export/user_data.csv'
INTO TABLE user
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS; -- 若CSV第一行是表头则添加此句
  • 若遇权限问题,先执行SET GLOBAL local_infile = 1;,再修改MySQL配置文件开启local_infile。

5. 验证迁移结果

  • 核对表行数:分别在H2和MySQL中执行SELECT COUNT(*) FROM user,确保数值一致。
  • 抽样检查关键数据,重点对比重命名、类型转换后的字段值。
  • 验证关联表外键关系,比如订单表的user_id是否能正确关联用户表的id。

额外注意事项

  • 大表分批次导出:单表数据量超100万时,用LIMIT拆分导出,避免内存溢出:
    CALL CSVWRITE('/tmp/export/user_part1.csv', 'SELECT id, username, email FROM user LIMIT 0, 500000')
  • 统一字符集:导出CSV时指定编码,H2的CSVWRITE支持CHARSET参数:
    CALL CSVWRITE('/tmp/export/user_data.csv', 'SELECT ...', 'charset=UTF-8')
  • 特殊字符处理:H2的CSVWRITE会自动用引号包裹含逗号、引号的字段,导入时需对应设置ENCLOSED BY '"'。

内容的提问来源于stack exchange,提问作者S.P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:25:58