【发布时间】:2012-07-06 18:30:54
【问题描述】:
我在H2Database 文件中有一些数据,我想将其转换为 MySQL .sql 数据库文件。我可以遵循哪些方法?
【问题讨论】:
我在H2Database 文件中有一些数据,我想将其转换为 MySQL .sql 数据库文件。我可以遵循哪些方法?
【问题讨论】:
在回答 Thomas Mueller 时,SquirrelSQL 对我来说工作得很好。 下面是 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,我失去了主键约束和自动增量功能。 您还可以通过右键单击重命名列和表:“重构”。我用它在完整复制后重命名保留字列,方法是禁用名称签入选项。
这对我很有效。
【讨论】:
H2数据库生成的SQL脚本与MySQL支持的SQL不完全兼容。您必须手动更改 SQL 脚本。这要求您对 H2 和 MySQL 都非常了解。
为避免此问题,将数据从 H2 复制到 MySQL 的另一种可能更简单的方法是使用 3rd 方工具,例如 SQuirreL SQL 和 SQuirreL DB Copy Plugin 插件。 (首先你需要安装 SQuirreL SQL 和 SQuirreL DB Copy Plugin。)
【讨论】:
我创建了一个从 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)
}
【讨论】:
H2 数据库允许您使用SCRIPT SQL 语句或Script command line tool 创建 SQL 脚本。您可能需要先调整脚本,然后才能针对 MySQL 数据库运行它。
【讨论】:
【讨论】: