Cambiar el directorio de datos de MySQL en servidores cPanel/WHM

Nos encontramos muchas veces con que la partición /var está completamente ocupada o muy llena, y lo más probable es que sea debido a las bases de datos localizadas en /var/lib/mysql que crecen generalmente en consonancia con nuestros proyectos.

El problema con los servidores cPanel es que muchas veces y de forma lógica, lo particionamos de esta manera:

# df -kh
S.ficheros          Tamaño Usado  Disp Uso% Montado en
/dev/sdb1              20G  15G  4G   50% /
/dev/sdb2             50G  30G   20G  50% /home

/     Partición raíz de instalación.

/home           Partición de datos.

Para cualquier persona que conoce cPanel la segunda partición, la de datos, está clara. Todas las webs y proyectos de que disponemos en el servidor o que tienen nuestros clientes están en /home.

Pero no así las bases de datos, que quedarían en la partición raíz, que es una partición generalmente de menor capacidad y orientada a que contenga los elementos y librerías de instalación.

Vamos a explicar como cambiar el directorio de datos de MySQL en servidores cPanel/WHM para poder, no solo solucionar los problemas de espacio de nuestra partición raíz, si no además tener centralizado todo lo referente a datos típico de cPanel /home

Pasos para cambiar directorio de base de datos

1. Realizamos un Backup (Recomendable)

Siempre que sea posible la recomendación es hacer un backup completo de las bases de datos (en el que se incluyen las tablas de sistema) antes de cambiar el directorio de datos. Esta acción puede prevenir ante cualquier problema en el caso que algo pueda ir mal.

Sin embargo, a veces no es posible ya que el servidor pudiera no tener suficiente espacio para abordar el tamaño que ocupa el backup.

Aún con la total recomendación del backup; tanto en la teoría como en la práctica en nuestra experiencia, nos indican que esta guía ha sido posible realizarse sin necesidad de este paso, siendo una elección personal de cada uno.

# tar -cvf mysql.tar /var/lib/mysql

O en el caso que la copia fuera tan grande como para llenar la partición, la alojaríamos en otra partición que conozcamos que tiene espacio suficiente, por ejemplo

# tar -cvf /home/mysql.tar /var/lib/mysql

2. Editamos el fichero my.cnf

# vi /etc/my.cnf

A continuación añadimos lo siguiente. La primera línea es la que realmente nos va a servir para hacer el cambio, pero la segunda línea puede ser fundamental para que no nos de problemas para localizar los procesos .sock de MySQL

datadir=/home/mysql
socket=/home/mysql/mysql.sock

AVISO: NO reiniciar el servicio MySQL tras añadir este configuración ya que puede ser problemático. Hay que seguir haciendo cosas antes de este reinicio.

3. Creamos el nuevo directorio que alojará los datos del MySQL (en concordancia con el paso anterior), y le cambiamos el propietario al que corresponde.

# mkdir /home/mysql
# chown -R mysql:mysql /home/mysql/

4. Es ahora cuando realizamos la migración de los datos de MySQL hacia la nueva ubicación. Utilizaremos el comando RSYNC.

# nohup rsync -avp /var/lib/mysql/ /home/mysql

El comando nohup seguirá sincronizando incluso aunque tu sesión venza. Además podremos ver el estado de la sincronización ejecutando lo siguiente:

# tail -f nohup.out

SIEMPRE es recomendable, casi obligatorio, realizar la sincronización al menos dos veces. Cuando se trata con datos de gran tamaño o si el servidor tiene carga elevada el proceso de sincronización puede llevar un tiempo mayor; tiempo en el que se han podido producir nuevos cambios importantes sobre lo original.

Al ejecutar por segunda vez la sincronización, se estima que durante el cambio, muy pocos si no ningún dato, se perderán en el proceso. Para asegurar la no perdida de datos, y si es posible abordarlo, la segunda sincronización (o la que vaya a ser la definitiva, pero nunca la primera), se realizará con el servicio de MySQL parado. Con los comandos que exponemos a continuación la segunda y sucesivas sincronizaciones serán mucho más rápidas que la primera.

AVISO: En caso que no puedas afrontar una parada del servicio MySQL sería cuestión de realizar los siguientos comandos (copiar/pegar) lo más rápido y diligente posible.

5. Siguiendo la forma recomendada antes indicada, querremos parar el servicio MySQL para realizar una última sincronización sin perdida de datos.

# /etc/init.d/mysqld stop

6. Volvemos a resincronizar completamente los datos de una forma más rápida que la anterior.

# rsync -avp --delete /var/lib/mysql/ /home/mysql/

7.  Actualizamos los enlaces simbólicos de los ficheros de socket a /tmp

# rm -rf /tmp/mysql.sock
# ln -sf /home/mysql/mysql.sock /tmp/mysql.sock
# ln -sf /home/mysql/mysql.sock /var/lib/mysql/mysql.sock

8.  Ya con la segunda (y completa) sincronización realizada, y con los cambios que realizaste en el punto 2) en el fichero my.cnf, ya es hora de reiniciar el servicio MySQL para que arranque. Todo debería funcionar en estos momentos.

# /etc/init.d/mysqld start

Pruebas de verificación correcto cambio de directorio de base de datos

a. Comprueba que incluso los ficheros logs de MySQL aparecen en la ubicación nueva . Siguiendo con el ejemplo (/home/mysql/hostname.err)

b. Prueba a crear una base de datos básica de pruebas para comprobar. El nombre por ejemplo «holamundo».

# mysqladmin create holamundo

c. Comprobamos que la base de datos se ha creado adecuadamente en el directorio que corresponde.

# ls -d /home/mysql/holamundo

Podemos eliminar esta base de datos una vez comprobado todo.

Para finalizar el cambio de directorio de base de datos

Tras confirmar que todo funciona correctamente eliminamos el contenido de la antigua ubicación. Contenido que en estos momentos ocupa espacio de forma innecesaria. El comando PWD es únicamente para verificar que estamos en el directorio adecuado, antes de realizar el borrado completo del contenido.

# cd /var/lib/mysql
# pwd  
# rm -rf *

AVISO:  Como se puede ver NO se borra el directorio /mysql, sólo el contenido. Esto es porque el directorio aún estando vacio seguirá siendo necesario para alberga el fichero socket .sock.

El porqué se ha realizado de esta forma es una elección de nuevo personal, y nuestra solución ha sido la aplicada en el paso 7) con lo que ha hecho de esta manera:

# ln -sf /home/mysql/mysql.sock /var/lib/mysql/mysql.sock

En el caso que el fichero socket se estime que debe estar alojado en /home/mysql  y ejecutado allí, probablemente se tenga que cambiar en todos los PHP.INI para que la ruta sea la nueva. Lo cual puede ser más trabajoso.

Esta solución adoptada funciona bien, es más rápida y cumple el objetivo, sin tener que estar mirando la configuración de Apache o PHP para con el MySQL.

Comparte este tutorial:

No hay comentarios en este tutorial

Sé el primero en enviar un comentario: