Vous êtes sur la page 1sur 6

Cambiar el directorio de datos de MySQL

o MariaDB en CentOS 7
Publicado el marzo 12, 2017 Gabriel Canepa

Además de ejecutar mysql_secure_installation luego de instalar el servidor de base de


datos, hay otro punto importante que quizás queramos tener en cuenta. Los datos que
guardamos ocupan espacio de disco, por defecto en el directorio /var/lib/mysql. Si nosotros
disponemos de una unidad de red podemos cambiar el directorio de datos al punto de
montaje correspondiente. Sin ir más lejos, una unidad Samba nos serviría para cumplir con
este objetivo. Debemos tener cuidado de que el crecimiento esperado de las bases de datos
en /var no interfiera con otros servicios que utilizan el mismo filesystem.

Cambiar el directorio de datos


Para cambiar el directorio de datos de MySQL o MariaDB en CentOS 7, debemos seguir
estos pasos:

Paso 1 – Verificar el directorio de datos actual. En la Fig. 1 vemos que se trata de


/var/lib/mysql:

1 mysql -u root -p -e "SELECT @@datadir;"

Figura 1 – Cambiar
el directorio de datos de MySQL o MariaDB

Paso 2 – Detener el servicio y asegurarnos de que no continúe ejecutándose:


1 systemctl stop mariadb
2 systemctl is-active mariadb

El comando anterior debe devolver la palabra inactive como salida si el servicio está en
efecto detenido.

Paso 3 – Copiar los datos al nuevo directorio

Ahora podemos copiar los datos presentes en /var/lib/mysql al nuevo directorio de datos
(/mnt/datos-mysql, por ejemplo):

1 cp -R -p /var/lib/mysql/* /mnt/datos-mysql

Paso 4 – Editar el archivo de configuración /etc/my.cnf de la siguiente manera. Bajo las


secciones indicadas deberemos agregar las líneas que aparecen a continuación:

1 [mysql]
2 datadir=/mnt/mysql-data
3 socket=/mnt/mysql-data/mysql.sock

1 [client]
2 port=3306
3 socket=/mnt/mysql-data/mysql.sock

Paso 5 – Agregar el contexto de SELinux necesario para que podamos almacenar los
archivos de las bases de datos en /mnt/datos-mysql, y luego reiniciar el servicio. También
podemos verificar que el directorio de datos haya cambiado utilizando el mismo comando
que en el
Paso 1.

semanage fcontext -a -t mysqld_db_t "/mnt/mysql-data(/.*)?"

restorecon -R /mnt/mysql-data

systemctl start mariadb

mysql -u root -p -e "SELECT @@datadir;"

semanage fcontext -a -t mysqld_db_t "/mnt/mysql-data(/.*)?"


1
restorecon -R /mnt/mysql-data
2
chown -R mysql:mysql /mnt/mysql-data
3
systemctl start mariadb
4
mysql -u root -p -e "SELECT @@datadir;"

¡Eso es todo! En solamente 5 pasos habremos cambiado el directorio de datos de MySQL o


MariaDB.

Nos leemos en el próximo post.


Puede darse el caso en el que necesitemos mover el directorio en el cuál una base de
datos MySQL almacena la información; por ejemplo, a un filesystem mas grande.

El proceso es sencillo y existen varios tutoriales para realizarlo, por ejemplo:

https://www.digitalocean.com/community/tutorials/how-to-move-a-mysql-data-
directory-to-a-new-location-on-ubuntu-16-04

https://www.digitalocean.com/community/tutorials/how-to-change-a-mysql-
data-directory-to-a-new-location-on-centos-7

Sin embargo, en Centos / RHEL hay un par de detalles a tomar en cuenta,


especialmente aquellos que requieren modificar el contexto de seguridad SeLinux de
los directorio.

El primer paso es detener la ejecución del servicio, en mi caso el paquete instalado


es mariadb-server:

systemctl stop mariadb

Mover el directorio.
Ya que detuvimos el servicio vamos a realizar una copia del directorio de datos
(/var/lib/mysql en la mayoría de los casos) supongamos que el destino será
/disk2/mysql:

sudo rsync -av /var/lib/mysql/ /disk2/mysql

Renombramos el directorio original para evitar que nos de un falso positivo al hacer
la prueba del servicio:

sudo mv /var/lib/mysql /var/lib/mysql.bak


Configuración.
Ahora indicaremos en la configuración del servidor y del cliente la ubicación del nuevo
directorio, así como el path del archivo de socket:
Editamos el archivo /etc/my.cnf.
Modificamos los parámetros datadir y socket de la siguiente manera:

[mysqld]
datadir=/disk2/mysql
socket=/disk2/mysql/mysql.sock

Editamos también el archivo /etc/my.cnf/client.cnf

[client]
port=3306
socket=/disk2/mysql.sock

Ahora nos aseguramos que mysql pueda usar en el directorio asignando el contexto de
seguridad:

chcon -R -u system_u -r object_r -t mysqld_db_t /disk2/mysql/

Podemos proceder a iniciar el servicio:

systemctl start mariadb

Si todo ha salido bien, no obtendremos mensaje de error alguno y podremos acceder


normalmente a nuestra base de datos; para poder validar que efectivamente el cambio esté
aplicado:

$ mysql -u root -p

select @@datadir;

+----------------------------+
| @@datadir |
+----------------------------+
| /disk2/mysql/ |
+----------------------------+
1 row in set (0.01 sec)

Configuración Apache-PHP
Esta última parte aplica únicamente si tenemos un webserver apache ejecutando en el mismo
servidor y usando la base de datos.
Es necesario decirle a apache dónde buscar el socket de la base de datos, para esto editamos
los siguientes dos parámetros en el archivo /etc/php.ini
MYSQL_PDO
pdo_mysql.default_socket=/disk2/mysql/mysql.sockMYSQL
mysql.default_socket = /disk2/mysql/mysql.sock

Reiniciamos también el webserver:

systemctl restart httpd

De este modo habremos realizado el cambio de directorio.