Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将H2数据库文件转换为MySQL数据库.sql文件?_Mysql_H2 - Fatal编程技术网

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

如何将H2数据库文件转换为MySQL数据库.sql文件?,mysql,h2,Mysql,H2,文件中有一些数据,我想将其转换为MySQL.sql数据库文件。我可以遵循哪些方法?H2数据库允许您使用SQL语句或创建SQL脚本。在MySQL数据库上运行脚本之前,可能需要调整脚本。H2数据库生成的SQL脚本与MySQL支持的SQL不完全兼容。您必须手动更改SQL脚本。这要求您非常了解H2和MySQL 为了避免这个问题,将数据从H2复制到MySQL的另一种可能更简单的方法是使用第三方工具,例如与插件一起使用。(首先需要安装SQuirreL SQL,最重要的是安装SQuirreL DB Copy插

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

H2数据库允许您使用SQL语句或创建SQL脚本。在MySQL数据库上运行脚本之前,可能需要调整脚本。

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


为了避免这个问题,将数据从H2复制到MySQL的另一种可能更简单的方法是使用第三方工具,例如与插件一起使用。(首先需要安装SQuirreL SQL,最重要的是安装SQuirreL DB Copy插件。)

我创建了一个Groovy脚本,用于从h2迁移到mysql。从那里你可以做一个mysqldump。它要求表存在于Mysql数据库中。它应该适用于ohter 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)
}

作为对托马斯·穆勒的回答,SquirreSQL对我来说工作得很好。 以下是Windows转换H2数据库的过程:

  • 转到“驱动程序列表”,其中所有内容默认为红色

  • 选择“H2”驱动程序,并指定“H2-1.3.173.jar”的完整路径(对于 示例)在“额外类路径”中。H2驱动程序应显示蓝色 签入列表

  • 选择您的目标驱动程序(PostgreSQL、MySQL),然后 执行相同的操作,例如对于PostgreSQL,指定 额外类路径中的“postgresql-9.4-1201.jdbc41.jar”

  • 转到“别名”,然后为H2单击“+”:配置您的JDBC链,例如,复制/粘贴启动H2时获得的JDBC链,并为目标数据库执行相同操作:单击“+”,配置和“测试”

  • 双击别名时,应该可以在新选项卡中看到数据库中的所有内容。转到源数据库中的表,对所有表进行多选,然后右键单击“复制表”

  • 从Alias转到目标数据库,并执行“粘贴表”。当所有表一起复制时,也会生成外键引用

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

    这对我很有效


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

    按照此处显示的步骤操作


    我试着去做。但它失败了。你能给我一个例子脚本到ITA我写的,你可能必须修改脚本,然后才能对MySQL运行它。我必须做什么修改?我总是犯错误。Im使用mysql 5.1.61。mysql和H2不完全兼容。您需要做的修改完全取决于SQL脚本。我添加了另一个答案:使用“SquirrelDB Copy插件”而不是H2的脚本功能。见下文。我使用了SquirrelSQL和SquirrelDB复制插件。但它不提供复制失败的工作:未选择任何数据库(SQL Erro Code=1046)失败的SQL was:CREARE表。。(没有绑定变量)如何解决这个问题。我想你应该在SQuirreL DB Copy插件邮件列表中询问。但我想知道,如果错误消息是“No database select”-是否选择了数据库?在左上角,有一个名为“Catalog”的下拉列表,其中选择了要将表复制到的数据库。这个问题可能已经解决了,但我今天遇到了同样的问题,并为其他有同样问题的人添加了此评论。此工具的成本为699美元;试用版故意破坏了dataHey@Elo,我正试图按照你解释的那样做,我得到了这个错误:错误:错误:列“内容”的类型是oid,但表达式的类型是bytea。你知道吗?抱歉@user14073111,帮不上忙:我没有这个问题,我不再处理这些数据库了。