2012-07-06 106 views

回答

1

的H2数据库允许您使用SCRIPT SQL语句或Script command line tool创建SQL脚本。可能你需要调整脚本,然后才能对MySQL数据库运行它。

+0

我试图做到这一点。但它失败了。你能给我一个示例脚本吗? – 2012-07-07 16:59:25

+0

正如我写的,你可能必须修改脚本,然后才能对MySQL运行它。 – 2012-07-07 21:06:21

+0

我必须做些什么修改?总是我得到错误。我使用MySQL 5.1.61。 – 2012-07-08 02:52:28

5

由H2数据库生成的SQL脚本不与MySQL支持的SQL完全兼容。您将不得不手动更改SQL脚本。这要求你很好地了解H2和MySQL。

为了避免这个问题,替代,可能简单的从H2将数据复制到MySQL的方式是与SQuirreL DB Copy Plugin插件一起使用第三方工具,如SQuirreL SQL。 (首先,你需要SQuirrel安装SQL以及对松鼠DB复制插件的顶部。)

+0

我将SQuirreL SQL与SQuirreL DB Copy Plugin插件一起使用。但它确实没有工作,它给 复制失败:未选择(SQL埃罗代码= 1046)数据库 失败的SQL是: CREARE表..... .... ... .. (没有绑定变量) 如何解决这个问题。 – 2012-07-11 08:58:05

+0

好吧,我想你应该在SQuirreL DB Copy插件邮件列表中询问。但是我想知道,如果错误消息是“没有数据库选择” - 你选择了一个数据库吗? – 2012-07-11 10:07:55

+0

在左上角有一个名为“目录”的下拉列表,在那里选择要将表格复制到的数据库。 此问题可能已经解决,但今天我遇到了同样的问题,并将此评论添加到具有相同问题的其他人 – 2015-06-03 08:27:39

2

我创建一个Groovy脚本,它从H2到MySQL迁移。从那里你可以做一个mysqldump。它要求表存在于Mysql数据库中。它应该适用于较小的更改的其他DBMS。

@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) 
} 
6

在回答托马斯·穆勒,SquirrelSQL为我工作得很好。 下面是该过程适用于Windows的H2数据库转换:

  1. 转到“驱动列表”,这里的一切都是由默认的红色。

  2. 选择“H2”驱动程序,并在“Extra Class Path”中指定“h2-1.3.173.jar”的完整路径(例如 示例)。 H2驱动程序应在列表中显示蓝色 检查。

  3. 选择目标驱动器(PostgreSQL的,MySQL的),并且 做同样的,例如对PostgreSQL,指定 的完整路径“PostgreSQL相关9.4-1201.jdbc41.jar”中上等路径。 H2:配置您的JDBC链,例如复制/粘贴您在启动H2时获得的jdbc链,然后针对您的目标数据库执行相同的操作:单击“别名”,然后单击“+”在“+”上,配置和“测试”。

  4. 当你在你的别名双击,你应该看到一个新的标签数据库里面的一切。转到源数据库中的表格,在所有表格上进行多重选择,然后右键单击:“复制表格”。

  5. 转到从别名目标数据库,并做了“粘贴表”。当完全复制所有表时,也会生成外键引用。

  6. 检查您的主键:从H2到PostgreSQL,我失去了主键约束和自动递增功能。 您也可以通过右键单击重命名列和表:“重构”。我使用它在完全复制后重命名保留字列,方法是禁用名称检查选项。

    这对我很好。

相关问题