viernes, 4 de diciembre de 2009

Migracion de MySql a Derby/HsqlDb

Problemas para migrar de Mysql a Derby
1) Derby no tiene las funciones de MySql como era de esperarse
2) Derby no tiene la habilidad de desactivar los foreign constraints para hacer cargas masivas
3) Derby no agrupa por funciones definidas por el usuario
Problemas para migrar de Mysql a HsqlDb
1) Hsqldb si permite columnas con auto incremento o identidad, pero deben ser forzosamente las llaves primarias, a menos que se defina una secuencia y un trigger
2) Los Triggers deben ser clases Java que importan de la clase Trigger de la api de Hsqldb, por tanto no se puede exportar directamente el esquema de mysql a DDL
HsqlDb si permite desactivar constraints
Los clientes para Hsqldb pueden ser DbVisualizer, Aqua Data Studio y RazonSQL
Los clientes para Derby pueden ser Aqua Data Studio y SquirrelSQL

La herramienta recomendada para migrar de MySql a Derby llamada DDLUtils de Apache es buena opcion si no tuviera bugs, el proposito de esta herramienta es obtener el esquema de la base de datos origen a un archivo xml y los datos de la bd a otro archivo xml, para despues con la misma herramienta exportar tanto el esquema como los datos a la nueva base de datos destino. El archivo de esquema que genera la herramienta se genera correctamente, sin embargo el archivo de los datos, tiene muchos errores, se cortan tanto los valores como los nombres de los campos.

Existe un servidor embebido de MySql que se podria utilizar para Java pero por los comentarios que hay en internet, no es viable ya que no es un jar, sino un .dll, exclusivo para windows y hay muchos problemas para convertir las cadenas del mysql a java, puesto que mysql esta desarrollado en C y por la interfaz con java requeriria mucho trabajo, por lo tanto no es viable.

Instrucciones para ajustar el DDL de una base de datos de MySql para una de HSQLDB
  • REMOVER UNSIGNED
  • REMOVER () PARENTESIS DESPUES DE INT
  • TEXT DEBE SER VARCHAR
  • AUTO_INCREMENT DEBE SER IDENTITY
  • CAMBIAR PRIMARY KEY POR UNIQUE
  • EL COMANDO DEFAULT SE DEBE PONER ANTES DE NOT NULL
  • REEMPLAZAR '''' POR ''
    REMOVER ZEROFILL
Los inserts quedan igual, no requieren modificacion
Las vistas son dificil de migrar a menos que sean muy sencillas
Los ALTER para agregar los constraints no requieren modificacion
Los Query's deben ser modificados para los Selects que utilizan Order By en la sentencia Select deben estar todos los campos que sean referenciados en la sentencia Order By o se generara una Excepcion.

Crear funciones Java para Derby
Es necesario crear la clase y los metodos de tipo estatico, despues empaquetar en un jar y ejecutar los siguientes comandos en Derby
Para instalar el Jar:
call sqlj.install_jar('c:\derby\lib\derbyFunciones.jar', 'user3.udfdemo', 0);
call syscs_util.syscs_set_database_property ('derby.database.classpath', 'user3.udfdemo');
Para crear la funcion en Derby:
create function concat(char, char) RETURNS CHAR PARAMETER STYLE JAVA NO SQL LANGUAGE JAVA EXTERNAL NAME 'test.FuncionesDerby.concat'
Para desinstalar el Jar:
call SQLJ.remove_jar('user3.udfdemo',0);