近期想将开发中系统的数据库随身携带,以便随时学习。最好的办法固然是将数据库随身携带,因此想到了导出到H2中。H2的压缩模式很厉害,在MYSQL中1G左右的空间,压缩后占用六、7M。很是适合将数据导出H2中随时启动以查看表结构。
因为MYSQL的导出SQL不标准,没法直接导入到H2中,因此我写了以下脚本将将MYSQL转化为H2脚本。 mysql
mysqldump --add-drop-table=FALSE --add-locks=FALSE --lock-tables=FALSE --quote-names=FALSE --set-charset=FALSE --comments=FALSE -uroot -proot riil_product > mysql.sql sed '/^\/\*!.*\*\/;/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代码来进行修正(建议生成补丁JAR文件,优先加载到classpath,方便之后删除),函数位置:org.h2.util.StringUtils.quoteStringSQL(String),将“else if (c < ' ' || c > 127)”分支删除便可。 sql