2012-07-06 22 views

Respuesta

1

La base de datos H2 le permite crear un script SQL utilizando la instrucción SQL SCRIPT o el Script command line tool. Es posible que necesite modificar el script antes de poder ejecutarlo en la base de datos MySQL.

+0

Traté de hacerlo. Pero falla.¿Me puede dar un script de ejemplo –

+0

Cuando escribí, puede que tenga que modificar el script antes de poder ejecutarlo contra MySQL. –

+0

¿Cuáles son las modificaciones que debo hacer? siempre estoy recibiendo un error. Estoy usando mysql 5.1.61. –

5

El script SQL generado por la base de datos H2 no es totalmente compatible con el SQL admitido por MySQL. Tendría que cambiar el script SQL manualmente. Esto requiere que conozcas bastante bien H2 y MySQL.

Para evitar este problema, una forma alternativa, probablemente más simple de copiar los datos de H2 a MySQL es utilizar una herramienta de terceros como SQuirreL SQL junto con el complemento SQuirreL DB Copy Plugin. (Primero debe instalar SQuirreL SQL y además el complemento SQuirreL DB Copy.)

+0

Utilicé SQuirreL SQL junto con el plugin SQuirreL DB Copy Plugin. Pero sí hay trabajo que da Copia falló: Sin base de datos seleccionada (Código Erro SQL = 1,046) SQL Error era: TABLA CREARE ..... .... ... .. (Sin variables de vinculación) Cómo solucionar esto. –

+0

Bueno, supongo que deberías preguntar en la lista de correo de SQuirreL DB Copy Plugin. Pero me pregunto, si el mensaje de error es "No database select", ¿seleccionó una base de datos? –

+0

En la esquina superior izquierda, hay un menú desplegable llamado "Catálogo", allí selecciona la base de datos a la que desea copiar las tablas. Es posible que este problema se haya resuelto, pero hoy hago clic en el mismo problema y agrego este comentario para que otra persona tenga el mismo problema –

2

Creé un script de Groovy que realiza la migración de h2 a mysql. Desde allí podrías hacer un mysqldump. Requiere que las tablas existan en la base de datos Mysql. Debería funcionar para DBMS con cambios menores.

@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

En respuesta a Thomas Mueller, SquirrelSQL funcionó bien para mí. Aquí se describe el procedimiento para Windows para convertir una base de datos H2:

  1. Ir a "lista de los conductores", donde todo es de color rojo por defecto.

  2. Seleccione el controlador "H2" y especifique la ruta completa a "h2-1.3.173.jar" (para el ejemplo ) en "Ruta de clase adicional". El controlador H2 debe mostrar una marca azul en la lista.

  3. seleccione la unidad de destino (PostgreSQL, MySQL), y hacer lo mismo, por ejemplo, para PostgreSQL, especifique la ruta completa a "postgresql-9.4-1201.jdbc41.jar" en Camino de calidad superior.

  4. Vaya a "Alias", luego haga clic en "+" para H2: configure su cadena JDBC, por ejemplo copie y pegue la cadena jdbc que obtiene cuando ejecute H2 y haga lo mismo con su base de datos de destino: haga clic en "+", configure y "prueba".

  5. Cuando hace doble clic en su alias, debería ver todo lo que está dentro de su base de datos en una nueva pestaña. Vaya a las tablas en la base de datos de origen, haga una selección múltiple en todas sus tablas y haga clic con el botón derecho: "Copiar tabla".

  6. Vaya a su base de datos de destino desde Alias, y haga una "Tabla de pegar". Cuando todas las tablas se copian por completo, también se generan las referencias de clave externa.

  7. Comprueba tus claves principales: de H2 a PostgreSQL, perdí las restricciones de la clave principal y la capacidad de autoincremento. También puede cambiar el nombre de columnas y tablas haciendo clic con el botón derecho: "refactorizar". Lo usé para cambiar el nombre de las columnas de palabras reservadas después de la copia completa, al deshabilitar las opciones de verificación de nombre.

    Esto funcionó bien para mí.

Cuestiones relacionadas