Liferay: Migrando de HSQLDB a MySQL

 Liferay viene con una base de datos HSQLDB por defecto. La intención es que con cero instalación tengamos nuestro portal funcionando con sus datos de ejemplo. Sin embargo, el log de liferay al arrancar nos avisa que estamos usando la base de datos HSQLDB, no adecuada para un entorno de producción y nos ruega encarecidamente configurar Liferay con una base de datos en serio, como MySQL, Oracle, etc.

Por supuesto, con las prisas de todo proyecto, ni puñetero caso. Y tras unos meses de desarrollo y con algo más de tiempo, llega el momento de hacer la migración. Este es el mejor tutorial que he encontrado para hacerlo y en el que me he basado. Pero como todo informático experimentado sabe, las cosas nunca van bien a la primera. Aquí mis pasos, problemas y soluciones, no tan detallados como en el tutorial.

Primero de todo, por supuesto, paramos nuestro portal liferay. Del directorio …/liferay-6.0.6/data/hsql cogemos los dos ficheros lportal.properties y lportal.script que son los que tienen nuestros datos en HSQLDB. Hacemos copia de seguridad, por supuesto, los borramos de ahí (junto al directorio hsql) porque ya no los usaremos.

El fichero hsql.script hay que cambiarlo con un editor de textos con lo que indica el enlace anterior

  • Cambiar un par de líneas en las que aparece PUBLIC por LPORTAL. Esta última palabra será el nombre de la base de datos en MySQL donde vamos a hacer la migración. Las líneas donde aparece PUBLIC son las de CREATE SCHEMA y SET SCHEMA.
  • Cambiar todas las fechas 1970-01-01 por 1970-01-02, porque MySQL no admite la primera por lo visto.

Con la herramienta MySQL migration Toolkit hacemos la migración de HSQLDB a MySQL. Primero, antes de arrancar la herramienta, debemos poner el hsqldb.jar en el directorio C:\Program Files\MySQL\MySQL Tools for 5.0\java\lib para que la herramienta tenga disponible el driver de la base de datos HSQLDB.

Una vez arrancada la herramienta, los parámetros de conexión a la base de datos son

Source – HSQLDB
Driver Class: org.hsqldb.jdbcDriver
Connection String: jdbc:hsqldb:file:LIFERAY_INSTALLATION\data\hsql\lportal (Sin extension)
Username: sa
Password: <empty>

Target – MySQL
Host: localhost
Port: 3306
Username: root
Password: <empty>

Por supuesto, el path de la conexión HSQLDB será donde tengamos copiado nuestro fichero lportal.script. Es necesario que el lportal.properties esté en el mismo directorio.

Seguimos con los pasos de la herramienta y nos da hasta cuatro opciones de las que podemos elegir las que queramos

  • Crear las tablas directamente en la base de datos MySQL
  • Crear un script con la creación de tablas para MySQL
  • Insertar los datos en la base de datos MySQL
  • Crear un script con los insert para MySQL

Bueno, el tutorial dice que basta con hacerlo directamente sobre MySQL y así debería ser, pero a mí me han surgido problemas.

La herramienta protesta porque algunas tablas de HSQLDB tiene columnas de tipo texto con longitudes muy, muy grandes y aconseja campos tipo BLOB. Esto hace que la herramienta directamente no cree esas tablas.

Si generamos el script de creación de tablas y lo ejecutamos, ya no tenemos esos problemas con esos campos, pero protesta porque en una tabla concreta se usa un index con uno de esas columnas de texto gigantes y MySQL no lo permite.

En cuanto a los insert, la opción directa no funciona porque faltan tablas. Así que generamos el script y nos quedamos con él, es lo único de los cuatro pasos que nos sirve.

¿Y cómo he creado las tablas entonces?. Pues he dejado que sea Liferay el que lo haga por mí. Borré el directorio liferay-6.0.6/data/hsql, con lo que si arrancamos liferay empezaría desde cero. Pero antes de arrancarlo lo configuro para que use MySQL

  • Pongo el jar con el driver de MySQL en un sitio que lo encuentre Liferay, en concreto lo puse en ../liferay-6.0.6/tomcat-xxxx/ROOT/WEB-INF/Lib/mysql-connector.jar.
  • Me aseguro que el fichero ../liferay-6.0.6/tomcat-xxxx/bin/setenv.bat o setenv.sh (el que usemos) tiene en sus JAVA_OPTS un -Dexternal-properties=portal-ext.properties. Esto hará que se lea el fichero portal-ext.properties
  • Ese fichero está en …/liferay-6.0.6/tomcat-xxxx/webapps/ROOT/WEB-INF/classes/portal-ext.properties. Lo editamos y ponemos la configuración para MySQL

jdbc.default.driverClassName=com.mysql.jdbc.Driver
jdbc.default.url=jdbc:mysql://localhost/lportal?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
jdbc.default.username=un usuario
jdbc.default.password=una password

Por supuesto, en la url pondremos lportal o el nombre que nos guste, pero debe ser el mismo que el que hayamos puesto cuando hicimos la migración de HSQLDB. Sólo queda arrancar liferay y esperar que cree todas las tablas. Matamos liferay, hacemos un backup de las tablas recién creadas sin datos, sólo la estructura y ya tenemos un script que crea las tablas. El comando para ello puede ser algo como

mysqldump -u usuario -p –no-data –databases lportal > crea_tablas_liferay.sql

Ahora ya podemos borrar en MySQL la base de datos completa, volver a crearla y ejecutar los scripts de creación de tablas e inserción de datos. Desde la consola de MySQL

drop database lportal;
create database lportal;
use lportal;
source /path/crea_tablas_liferay.sql
source /path/Inserts.sql

donde path es donde tengamos los scripts e Inserts.sql el el script de inserciones obtenido con MySQL migration Tool. Me tropecé también con un pequeño detalle de MySQL mayúsculas/minúsculas, así que tenlo en cuenta antes de crear las tablas e insertar los datos si estás en linux.

Y listo, arrancando ahora Liferay debemos tenerlo igual que antes, pero trabajando sobre MySQL en vez de sobre HSQLDB.

Otro enlace que me fue útil es este, aunque es para otra herramienta de Atlassian.

Esta entrada ha sido publicada en Liferay, Uncategorized y etiquetada como , , . Guarda el enlace permanente.

Una respuesta en “Liferay: Migrando de HSQLDB a MySQL

  1. Inti dijo:

    Muy interesante tu manual,quisiera ponerme en contacto con tu persona para que me brindes ayuda. ¿Serías tan amable de indicarme de que manera podemos ponernos en contacto?

    saludos,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.