How to convert H2Database database file to MySQL database .sql file?

后端 未结 5 1451
你的背包
你的背包 2021-02-01 10:41

I have some data in H2Database file and I want to convert it to MySQL .sql database file. What are the methods I can follow?

5条回答
  •  佛祖请我去吃肉
    2021-02-01 11:10

    I created a Groovy script that does the migration from h2 to mysql. From there you could do a mysqldump. It requires that the tables exists in the Mysql database. It should work for ohter DBMS with minor changes.

    @Grapes(
    [ 
        @Grab(group='mysql', module='mysql-connector-java', version='5.1.26'),
        @Grab(group='com.h2database', module='h2', version='1.3.166'),
        @GrabConfig(systemClassLoader = true)
    ])
    
    import groovy.sql.Sql
    
    def h2Url='jdbc:h2:C:\\Users\\xxx\\Desktop\\h2\\sonardata\\sonar'
    def h2User='sonar'
    def h2Passwd='sonar'
    
    def mysqlUrl='jdbc:mysql://10.56.xxx.xxx:3306/sonar?useunicode=true&characterencoding=utf8&rewritebatchedstatements=true'
    def mysqlUser='sonar'
    def mysqlPasswd='xxxxxx'
    def mysqlDatabase='sonar'
    
    
    sql = Sql.newInstance(h2Url, h2User, h2Passwd, 'org.h2.Driver' )
    
    def tables = [:]
    
    sql.eachRow("select * from information_schema.columns where table_schema='PUBLIC'") {
        if(!it.TABLE_NAME.endsWith("_MY")) {
            if (tables[it.TABLE_NAME] == null) {
                tables[it.TABLE_NAME] = []
            }
            tables[it.TABLE_NAME] += it.COLUMN_NAME;
        }
    }
    
    tables.each{tab, cols ->
        println("processing $tab")
        println("droppin $tab"+"_my")
    
        sql.execute("DROP TABLE IF EXISTS "+tab+"_my;")
        sql.execute("create linked table "+tab+"_my ('com.mysql.jdbc.Driver', '"+mysqlUrl+"', '"+mysqlUser+"', '"+mysqlPasswd+"', '"+mysqlDatabase+"."+tab.toLowerCase()+"');")
    
        sql.eachRow("select count(*) as c from " + tab + "_my"){println("deleting $it.c entries from mysql table")}
        result = sql.execute("delete from "+tab+"_my")
        colString = cols.join(", ")
        sql.eachRow("select count(*) as c from " + tab){println("starting to copy $it.c entries")}
        sql.execute("insert into " + tab + "_my ("+colString+") select "+colString+" from " + tab)
    }
    

提交回复
热议问题