如何将H2Database数据库文件转换为MySQL数据库.sql文件?

9

我有一些数据存储在H2Database文件中,我想将其转换为MySQL .sql数据库文件。我可以采用哪些方法?

5个回答

9

回答Thomas Mueller,对我来说SquirrelSQL运行良好。 以下是在Windows上转换H2数据库的过程:

  1. 进入“驱动程序列表”,默认情况下所有内容都显示为红色。

  2. 选择“H2”驱动程序,并在“额外类路径”中指定“h2-1.3.173.jar”的完整路径(例如)。H2驱动程序应在列表中显示为蓝色复选框。

  3. 选择目标驱动程序(PostgreSQL、MySQL),并执行同样的操作,例如对于PostgreSQL,在额外的类路径中指定“postgresql-9.4-1201.jdbc41.jar”的完整路径。

  4. 进入“别名”,然后单击H2上的“+”:配置JDBC链,例如复制/粘贴启动H2时获得的jdbc链,然后对目标数据库执行相同的操作:单击“+”,配置并“测试”。

  5. 当您双击别名时,您应该在新选项卡中看到数据库中的所有内容。进入源数据库中的表格,多选所有表格并右键单击:“复制表格”。

  6. 进入别名中的目标数据库,然后执行“粘贴表格”操作。当所有表格一起复制时,外键引用也会生成。

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

    对我来说这很有效。


嘿@Elo,我正在尝试按照你所解释的做,但是我遇到了这个错误:错误:ERROR:列“content”的类型为oid,但表达式的类型为bytea。你有什么想法吗? - user14073111
抱歉 @user14073111,我无法提供帮助:我没有遇到这个问题,而且我已经不再使用这些数据库了。 - Elo
如果你想知道在SQuirrel设置中如何禁用列名检查,可以前往“文件”->“全局首选项”->“DB复制”选项卡->向下滚动到“列类型映射组”,然后取消勾选“检查目标数据库关键字的复制表中的列名”和“测试复制表中的列名是否适用于目标表”。我花了一些时间才找到它,希望这能帮助到某些人。 - Alhassan Abdulkadir

6
H2数据库生成的SQL脚本与MySQL支持的SQL不完全兼容。您需要手动更改SQL脚本。这要求您对H2和MySQL都很熟悉。
为避免此问题,将数据从H2复制到MySQL的另一种选择是使用第三方工具,例如SQuirreL SQLSQuirreL DB Copy Plugin插件一起使用。(首先需要安装SQuirreL SQL,然后在其上安装SQuirreL DB Copy Plugin。)

我使用了SQuirreL SQL和SQuirreL DB Copy Plugin插件。但是它不起作用,它会显示:复制失败:未选择数据库(SQL错误代码=1046)失败的SQL语句是: CREARE TABLE ..... .... ... ..(没有绑定变量)如何解决这个问题。 - Lasith Malinga
好的,我想你应该在SQuirreL DB Copy插件邮件列表上询问。但是我想知道,如果错误消息是“没有选择数据库”-那么你选择了一个数据库吗? - Thomas Mueller
在左上角有一个下拉菜单叫做“目录”,在那里选择要复制表格的数据库。这个问题可能已经解决了,但我今天遇到了同样的问题,为了帮助其他人解决相同的问题而添加了这个评论。 - Manoj N V

3

我创建了一个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)
}

1
H2数据库允许您使用SCRIPT SQL语句或脚本命令行工具创建SQL脚本。在针对MySQL数据库运行脚本之前,可能需要微调脚本。

我试过做了,但失败了。你能给我一个例子脚本来做吗? - Lasith Malinga
正如我所写的那样,在你运行脚本之前,你可能需要对其进行修改以便能够在MySQL上运行。 - Thomas Mueller
我需要做哪些修改?我总是得到错误。我使用的是MySQL 5.1.61。 - Lasith Malinga
MySQL和H2不完全兼容。您需要进行的确切修改取决于SQL脚本。 - Thomas Mueller
我添加了另一个答案:使用"SQuirreL DB Copy Plugin"而不是H2的脚本功能。请参见下文。 - Thomas Mueller

0

1
这个工具售价699美元;试用版故意破坏数据。 - Leif Neland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接