Durante la actualización de Moodle se recibe el siguiente error en el momento de verificar el cumplimiento de los requisitos mínimos: MySQL version 5.5.31 is required and you are running 5.5.5.10.1.33.
Análisis de las causas del problema
El problema sucede cuando se intenta actualizar Moodle en un sistema que previamente tenía MySQL como motor de bases de datos pero migró posteriormente a MariaDB generando un conflicto para la revisión de versiones. Desafortunadamente el mensaje desplegado por Moodle no brinda suficiente información para concluir esto inicialmente.
Solución del problema
Editar el archivo config.php en el directorio principal de Moodle y modificar el tipo de base de datos a MariaDB.
El procedimiento que se describe a continuación permite modificar la contraseña del usuario administrador (root) de MySQL 5. Es útil para los casos en que esta se olvida y por lo tanto ya no es posible acceder a sus funciones de administración.
Procedimiento.
Detener el servicio si se está ejecutando actualmente.
# service mysql5 stop
Iniciar el servicio con el modificador de skip-grant-tables.
# mysqld_safe –skip-grant-tables &
Realizar una conexión al motor de base de datos a través de la herramienta de línea de comando.
# mysql -u root
Realizar la actualización de la contraseña. Téngase en cuenta que se deberá modificar la palabra NUEVO_PASSWORD por la nueva contarseña que se desee asignar al usuario root.
mysql> use mysql; mysql> update user set password=PASSWORD(“NUEVO_PASSWORD”) where User=’root’; mysql> flush privileges; mysql> quit
De manera análoga a como se realizó el tunel SSH utilizando Linux, también es posible implementarlo en Windows gracias al uso de herramientas de terceros como Putty.
Para la verificación de la conexión a la base de datos en lugar de la herramienta básica de línea de comando (que también debe funcionar normalmente) se utilizará MySQL Workbench que es la herramienta de administración gráfica que provee el motor de bases de datos.
Implementación de la solución.
Crear la especificación del tunel en Putty.
Este paso sólo es necesario realizarlo una única vez mientras se configura el perfil en Putty, en ocasiones posteriores sólo será necesario invocarlo.
Ejecute Putty.exe.
Session en Putty.exe
En la Session (lado izquierdo) especifique la siguiente información.
1. Nombre del servidor SSH. desarrollo.com para este ejemplo.
2. Puerto del servicio SSH. Es el puerto 22 por defecto. Elija además el tipo de conexión (Connection type) SSH.
3. Especifique un nombre para almacenar la sesión (Saved Sessions). MiTunel para este ejemplo.
4. Presione el botón guardar (Save) para almacenar la configuración recién especificada.
Connection > SSH en Putty.exe
En las opciones de Connection > SSH elija la casilla de verificación Don’t start a shell para evitar que se cree una consola de comandos interactiva ya que sólo se desea crear el tunel.
Connection > SSH > Tunnels en Putty.exe
Determine la información relacionada con los lados del tunel.
5. Especifique el puerto local desde el cual se iniciará el tunel. 3307 en este caso.
6. Especifique el destino y su puerto donde terminará el tunel. localhost:3306 para este ejemplo.
Presione el botón agregar (Add) para almacenar los extremos del tunel.
Finalmente almacena la configuración establecida regresando a la sección de Session y presionando el botón de guardar (Save).
Establecer un tunel previamente especificado.
Esto se puede hacer de dos maneras, una desde la interfaz gráfica de Putty seleccionando MiTunel en la lista de las sesiones guardadas (Saved Sessions), presionando el botón cargar (Load) y abriendo la sesión presionando el botón (Open).
Una segunda alternativa es desde la línea de comando ejecutando la siguiente instrucción.
C:rutaaputty.exe -load MiTunel
En ambos casos el resultado es el mismo, aparecerá una ventana de login para realizar la autenticación con el servidor remoto (6).
Autenticación de usuario con SSH.
Realizar la conexión a MySQL a través del tunel SSH.
Como se mencionó inicialmente para la verificación de la conexión se utilizará MySQL Workbench.
Connect to database
Debe tenerse muy en cuenta que gracias al tunel recién creado, la aplicación cliente de la base de datos interpretará que el motor de base de datos se encuentra ubicado localmente (9) y que su puerto es el 3307 (10) -ver 5 y 6-.
Este es el panorama del esquema de red de la oficina del grupo de desarrollo.
Esquema de la red
Un servidor (centro) alberga los proyectos web (Apache) de los cuales el grupo de desarrollo manipula sus archivos (SSH + Samba), así como sus bases de datos (MySQL). El servidor cuenta con dos interfaces de red las cuales separan físicamente el acceso de la red privada (eth1) de la red pública o Internet (eth0).
Los desarrolladores utilizan los clientes desde la red privada para la cual no hay ningún tipo de filtro en el servidor y pueden acceder a la totalidad de sus servicios. Desde el exterior, el servidor implementa un firewall que sólo permite la consulta web de los proyectos y el acceso al SSH. Como fácilmente se concluye, el firewall de la interfaz pública (eth0) filtra explícitamente el acceso a los servicios de MySQL y Samba que son considerados como inseguros.
El problema.
Se requiere ahora que los desarrolladores puedan acceder al servidor desde sus clientes a través de Internet.
El problema se divide en dos aproximaciones.
Manipular el software, el código y los datos remotamente.
Manipular el software y el código localmente, y los datos remotamente.
La solución.
Manipular el software, el código y los datos remotamente (1).
Este es el caso mas simple. Como los aplicativos son web se acceden a través de un navegador, su código es manipulado a través de SSHFS (ver instrucciones para Linux y Windows) y sus datos son manipulados a través de la web con PHPMyAdmin.
Manipular el software y el código localmente y los datos remotamente (2).
Este caso es mas elaborado que el anterior ya que el software y el código reside localmente porque lo es muy fácil de manipular, sin embargo los datos (la base de datos MySQL) de los proyectos continúan viviendo en el servidor de desarrollo.
Dado que el puerto de acceso a MySQL se encuentra filtrado para el exterior por razones de seguridad es inicialmente imposible conectarse a la base de datos desde el cliente a través de Internet. La solución es crear un tunel SSH desde el cliente remoto hasta el servidor a través del medio inseguro (Internet) y desde allí, ahora un lugar seguro, realizar la conexión con el puerto de la base de datos que en este caso reside en el mismo servidor.
Implementación de la solución (2).
Por razones que serán obvias, es necesario que los usuarios remotos cuenten con cuentas (nombre de usuario/contraseña) en el sistema operativo del servidor de desarrollo y que estas estén habilitadas para acceder al mismo a través de SSH.
Las siguientes acciones se realizan desde el cliente remoto.
Establecer el tunel SSH entre el cliente remoto y el servidor de desarrollo.
Con la instrucción anterior estamos creando un tunel entre el cliente remoto y el servidor desarrollo.com con el usuario desarrollador y utilizando al protocolo SSH. Se le está indicando además que el tunel se deberá establecer entre el puerto 3307 local y el puerto 3306 del servidor remoto, en este caso el mismo localhost. Es muy importante tener en cuenta que la referencia de este último servidor remoto se realiza previa conexión a desarrollo.com, es decir que su acceso se hace desde este y no directamente desde el cliente que inicia la conexión del tunel ejecutando el comando.
Otro aspecto interesante a tener en cuenta es que los puertos utilizados no necesariamente deben ser diferentes ya que uno es local (3307 en este ejemplo) y el otro es remoto (3306 el estándar de MySQL), sin embargo en el caso de que ya se cuente con una instalación local de MySQL (utilizando el puerto 3306) será entonces necesario utilizarlos diferentes como se ha planeado en este artículo.
Realizar la conexión a MySQL a través del tunel SSH.
Después de establecido el tunel entre cliente y servidor la conexión se realiza directamente con el puerto local (3307) del cliente remoto como si el servicio se estuviera ejecutando en la misma máquina cliente, el tunel se encarga de transmitir la información encriptada y realizar las conversiones necesarias a cada uno de los lados.
$ mysql -h 127.0.0.1 -u bd_usuario -p -P 3307bd_nombre
Tenga en cuenta que el inicio de conexión (connect) a una base de datos toma cierto tiempo ya que el motor de bases de datos realiza una carga previa de los nombres de las tablas y de los campos de estas. Si desea evitar esta precarga de información puede utilizar el parámetro -A en la invocación al cliente de MySQL (mysql).
Scripts de conexión.
A pesar de que el procedimiento es -extremadamente- simple, he creado un par de scripts para facilitar y automatizar el proceso de creación del puente SSH y de conexión a la base de datos a través de línea de comando.
Los scripts pueden ser descargados de aqui y configurados utilizando cualquier editor de texto. tunssh_connection se encarga de establecer la conexión del túnel SSH mientras que tunssh_mysql realiza la conexión a la base de datos MySQL remota a través del túnel SSH.
La instalación de estos paquetes se puede realizar de dos maneras. Utilizando Tasksel, que yo he llamado el método rápido, o instalando -casi- individualmente los paquetes que se deseen. En mi opinión personal prefiero el segundo método ya que controlo directamente que se está instalando en el servidor.
Tasksel es una herramientas de Debian que se incluye en la mayoría de las distribuciones hijas (como Ubuntu) y permite instalar en bloque muchos paquetes según agrupaciones predefinidas, entre ellas la instalacion de un LAMP Server.
Instalación de Apache.
Instalación del servidor HTTP.
# apt-get install apache2
# apt-get install wwwconfig-common
Modificar la ubicación del DOCUMENT_ROOT.
Por defecto el árbol de directorios que se publica a través del servidor web se ubica en /var/www, si se desea modificar esta ubicación es necesario realizar los siguientes pasos.
Crear el directorio donde se almacenarán los documentos web.
# mkdir -p /home/www/public
Modificar la configuración de Apache para incluír a este nuevo directorio.
# vi /etc/apache2/sites-enabled/000-default
Reemplazar las ocurrencias de /var/www por la ruta deseada, es decir, los valores de DocumentRoot y su correspondiente Directory.
Estos son los pasos que se siguieron para instalar los paquetes de [L]AMP: Apache, MySQL y PHP en mi equipo de desarrollo ahora que estoy estrenando Ubuntu Intrepid (8.10) -nuevamente-.
La instalación ubica por defecto al repositorio de archivos del motor de base de datos en /var/db/mysql. Esta ubicación no es necesariamente la idónea, para nuestro caso no disponemos del espacio suficiente en esa partición y es por eso que es necesario moverla.
Los ajustes siguientes son los necesarios para transladar el repositorio de archivos de MySQL a /home/datos_mysql.
Existen varios archivos base de configuración en la ruta /usr/local/share/mysql para elegir según la configuración de hardware del servidor y su finalidad.
my-small.cnf
Para sistemas de bajos recursos con 64MB de RAM o menos.
my-medium.cnf
Para sistemas hasta con 128MB de RAM, ideal para servidor web
my-large.cnf
Para sistemas con 512MB de RAM, ideal para servidor MySQL dedicados
my-huge.cnf
Para sistemas con 1GB o 2GB de RAM, ideal para datacenters.
Actualiza el usuario y grupo propietario de los archivos.
# chown -R mysql:mysql /var/db/mysql
Se inicia manualmente el motor de base de datos para verificar que todo esté funcionando correctamente.
# /usr/local/bin/mysqld_safe --user=mysql &
Se modifica la contraseña del usuario administrador (root). Modifique la cadena rootpassword por el valor que considere apropiado.
Habilita el inicio automático del motor de base de datos al inicio del servidor.
# vi /etc/rc.conf
mysql_enable=”YES”
Si se desea desactivar el acceso externo al servidor de bases de datos se deberá realizar la siguiente modificación. Esto es útil cuando sólo nos interesa permitir conexiones desde el servidor de páginas que se encuentra ubicado en el mismo equipo y no desde el exterior.
# vi /var/db/mysql/my.cnf
(quitar el comentario)
skip-networking
Reiniciar el servicio de MySQL.
# /usr/local/etc/rc.d/mysql-server restart
Revise el archivo de registro por mensajes de error o de advertencia que le permitan depurar cualquier problema existente en el motor de base de datos. El archivo de registro se encuentra ubicado en /var/db/mysql y su nombre corresponde al siguiente formato: hostname.domainname.err, para este artículo será entonces: webserver.mydomain.com.err.