MYSQL 导出 到 H2
近期想将开发中系统的数据库随身携带,以便随时学习。最好的办法当然是将数据库随身携带,所以想到了导出到H2中。H2的压缩模式很厉害,在MYSQL中1G左右的空间,压缩后占用6、7M。非常适合将数据导出H2中随时启动以查看表结构。
由于MYSQL的导出SQL不标准,无法直接导入到H2中,所以我写了如下脚本将将MYSQL转化为H2脚本。
mysqldump --add-drop-table=FALSE --add-locks=FALSE --lock-tables=FALSE --quote-names=FALSE --set-charset=FALSE --comments=FALSE -uroot -proot riil_product > mysql.sqlsed '/^\/\*!.*\*\/;/d;s/[ ]*ENGINE=.*DEFAULT[ ]CHARSET=[^ ^;]*[ ]*//g;s/double(\([0-9]*\),\([0-9]*\))/number(\1,\2)/g;s/ON UPDATE CURRENT_TIMESTAMP//g;s/ USING BTREE//g;/^\/\*!/,/\*\//d;/^SET/d;' mysql.sql|sed '/CREATE TABLE \([^ ]*\) (/{h};/^)COMMENT=/{G;s/\n//;s/^.*COMMENT=\([^;]*\)[;]*CREATE TABLE \([^ ]*\) ($/);\nCOMMENT ON TABLE \2 IS \1;/}' > h2.sql其中最主要的是将表的COMMENT转化为H2格式,如:
CREATE TABLE IF NOT EXISTS `tb_log` ( `a_time` timestamp NOT NULL COMMENT '操作时间') ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='审计日志';/*!40101 SET character_set_client = @saved_cs_client */;-- 转化为 --CREATE TABLE tb_log ( a_time datetime NOT NULL COMMENT '操作时间',);COMMENT ON TABLE t_admin_audit_log IS '审计日志';
导出H2脚本STRINGDECODE解决
当导出H2时,所有中文变为STRINGDECODE,不方便查看,且不易导入到其它数据库中,可以修改H2代码来进行修正(建议生成补丁JAR文件,优先加载到classpath,方便以后删除),函数位置:org.h2.util.StringUtils.quoteStringSQL(String),将“else if (c < ' ' || c > 127)”分支删除即可。