近期想將開發中系統的數據庫隨身攜帶,以便隨時學習。最好的辦法固然是將數據庫隨身攜帶,因此想到了導出到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