【问题标题】:How to convert H2Database database file to MySQL database .sql file?如何将 H2Database 数据库文件转换为 MySQL 数据库 .sql 文件?
【发布时间】:2012-07-06 18:30:54
【问题描述】:

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

【问题讨论】:

    标签: mysql h2


    【解决方案1】:

    在回答 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. 从 Alias 转到您的目标数据库,然后执行“粘贴表”。全部复制所有表时,还会生成外键引用。

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

      这对我很有效。

    【讨论】:

    • 嘿@Elo,我正在尝试按照您的解释执行此操作,但出现此错误:错误:错误:列“内容”是 oid 类型,但表达式是 bytea 类型。你有什么想法吗?
    • 对不起@user14073111,我没遇到过这个问题,我不再使用这些数据库了。
    【解决方案2】:

    H2数据库生成的SQL脚本与MySQL支持的SQL不完全兼容。您必须手动更改 SQL 脚本。这要求您对 H2 和 MySQL 都非常了解。

    为避免此问题,将数据从 H2 复制到 MySQL 的另一种可能更简单的方法是使用 3rd 方工具,例如 SQuirreL SQLSQuirreL DB Copy Plugin 插件。 (首先你需要安装 SQuirreL SQL 和 SQuirreL DB Copy Plugin。)

    【讨论】:

    • 我将 SQuirreL SQL 与 SQuirreL DB Copy Plugin 插件一起使用。但它没有工作它给复制失败:没有选择数据库(SQL错误代码= 1046)失败的SQL是:CREARE TABLE ........................... ..(没有绑定变量)如何解决这个问题。
    • 好吧,我想你应该在 SQuirreL DB Copy Plugin 邮件列表中询问。但我想知道,如果错误消息是“没有选择数据库” - 你选择了数据库吗?
    • 在左上角,有一个名为“Catalog”的下拉菜单,选择要复制表的数据库。这个问题可能已经解决了,但我今天遇到了同样的问题,并为其他有同样问题的人添加了这条评论
    【解决方案3】:

    我创建了一个从 h2 迁移到 mysql 的 Groovy 脚本。从那里你可以做一个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)
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我试过了。但它失败了。你能给我一个示例脚本吗
      • 正如我所写,您可能必须先修改脚本,然后才能针对 MySQL 运行它。
      • 我需要做哪些修改?我总是出错。我正在使用 mysql 5.1.61。
      • MySQL 和 H2 不完全兼容。您需要做的修改完全取决于 SQL 脚本。
      • 我添加了另一个答案:使用“SQuirreL DB Copy Plugin”而不是H2的脚本功能。见下文。
      【解决方案5】:

      您可以使用 fullconvert 来转换数据库。它很容易使用。

      按照此处显示的步骤进行操作

      https://www.fullconvert.com/howto/h2-to-mysql

      【讨论】:

      • 这个工具售价 699 美元;试用版故意破坏数据
      猜你喜欢
      • 2013-02-03
      • 1970-01-01
      • 2016-05-21
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2011-02-01
      • 2018-02-12
      • 2015-02-13
      相关资源
      最近更新 更多