如何将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
相关产品推荐
相关产品推荐

