Mover un Directorio de Datos MySQL a una Nueva Ubicación en Ubuntu 16.04
Introducción
Cómo Mover un Directorio de Datos MySQL a una Nueva Ubicación en Ubuntu 16.04. Las bases de datos crecen con el tiempo, a veces superando el espacio en el sistema de archivos. También puede encontrarse con contención de E / S cuando se encuentran en la misma partición que el resto del sistema operativo. RAID, almacenamiento en bloque de red y otros dispositivos pueden ofrecer redundancia y otras características deseables. Ya sea que esté agregando más espacio, evaluando formas de optimizar el rendimiento o buscando aprovechar otras características de almacenamiento, este tutorial lo guiará a través de la reubicación del directorio de datos de MySQL.
Prerrequisitos
Para completar este tutorial, necesitará:
- Un servidor Ubuntu 16.04 con un usuario no root con privilegios
sudo
. Puede obtener más información sobre cómo configurar un usuario con estos privilegios en nuestra Configuración inicial del servidor con la tutorial Ubuntu 16.04 - Un servidor MySQL Si aún no ha instalado MySQL, la guía Cómo instalar MySQL en Ubuntu 16.04puede ayudarlo.
En este ejemplo, estamos moviendo los datos a un dispositivo de almacenamiento de bloques montado en /mnt/volume-nyc1-01
.
Independientemente del almacenamiento subyacente que utilice, esta guía puede ayudarlo a trasladar el directorio de datos a una nueva ubicación.
Paso 1. Mover el Directorio de Datos MySQL
Para prepararnos para mover el directorio de datos de MySQL, verifiquemos la ubicación actual iniciando una sesión MySQL interactiva usando las credenciales administrativas.
mysql -u root -p
Cuando se le solicite, proporcione la contraseña de root de MySQL. Luego, desde el indicador de MySQL, seleccione el directorio de datos:
select @@datadir;
Output
+-----------------+
| @@datadir |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)
Este resultado confirma que MySQL está configurado para usar el directorio de datos predeterminado, /var/lib/mysql/,
así que ese es el directorio que necesitamos mover. Una vez que haya confirmado esto, escriba exit
para salir
del monitor.
Para garantizar la integridad de los datos, cerraremos MySQL antes de realizar cambios en el directorio de datos:
sudo systemctl stop mysql
systemctl
no muestra el resultado de todos los comandos de administración de servicios, por lo que si quiere asegurarse de que haya tenido éxito, use el siguiente comando:
sudo systemctl status mysql
Puede estar seguro de que se apaga si la línea final de la salida le dice que el servidor está detenido:
Output
. . .
Jul 18 11:24:20 ubuntu-512mb-nyc1-01 systemd[1]: Stopped MySQL Community Server.
Ahora que el servidor está cerrado, copiaremos el directorio de la base de datos existente a la nueva ubicación con rsync
. El uso del indicador -a
conserva los permisos y otras propiedades del directorio, mientras que -v
proporciona un resultado detallado para que pueda seguir el progreso.
Nota. Asegúrese de que no haya una barra inclinada en el directorio, que puede agregarse si usa la terminación de tabulación. Cuando hay una barra inclinada, rsync
volcará el contenido del directorio en el punto de montaje en lugar de transferirlo a un directorio que contenga mysql
:
sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01
Una vez que la rsync
esté completa, cambie el nombre de la carpeta actual con una extensión .bak y consérvela hasta que hayamos confirmado que la jugada fue exitosa. Al volver a nombrarlo, evitaremos la confusión que pueda surgir de los
archivos tanto en la ubicación nueva como en la antigua:
sudo mv /var/lib/mysql /var/lib/mysql.bak
Ahora estamos listos para dirigir nuestra atención a la configuración.
Paso 2. Apuntando a la Nueva Ubicación de Datos
MySQL tiene varias formas de anular los valores de configuración. De forma predeterminada, el datadir
se establece en /var/lib/mysql
en el archivo /etc/mysql/mysql.conf.d/mysqld.cnf
. Edite este archivo para reflejar
el nuevo directorio de datos:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Busque la línea que comienza con datadir=
y cambie la ruta que sigue para reflejar la nueva ubicación.
En nuestro caso, el archivo actualizado se ve como el resultado a continuación:
. . .datadir=/mnt/volume-nyc1-01/mysql
. . .
Este parece ser el momento adecuado para volver a abrir MySQL, pero hay una cosa más que configurar antes de que podamos hacerlo con éxito.
Paso 3. Configuración de las Reglas de Control de Acceso de AppArmor
Tendremos que decirle a AppArmor que permita a MySQL escribir en el nuevo directorio creando un alias entre el directorio predeterminado y la nueva ubicación. Para hacer esto, edite el archivo de alias
AppArmor:
sudo nano /etc/apparmor.d/tunables/alias
En la parte inferior del archivo, agregue la siguiente regla de alias:
. . .
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .
Para que los cambios surtan efecto, reinicie AppArmor:
sudo systemctl restart apparmor
Nota. Si se saltó el paso de configuración de AppArmor, se encontrará con el siguiente mensaje de error:
Output
Job for mysql.service failed because the control process
exited with error code. See "systemctl status mysql.service"
and "journalctl -xe" for details.
La salida de systemctl
y journalctl
concluye con:
Output
Jul 18 11:03:24 ubuntu-512mb-nyc1-01 systemd[1]:
mysql.service: Main process exited, code=exited, status=1/FAILURE
Dado que los mensajes no establecen una conexión explícita entre AppArmor y el directorio de datos, este error puede tardar un tiempo en resolverse.
Paso 4. Reiniciar MySQL
El siguiente paso es iniciar MySQL, pero si lo hace, se encontrará con otro error. Esta vez, en lugar de un problema de AppArmor, el error ocurre porque la secuencia de comandos mysql-systemd-start
comprueba la existencia de un directorio,
-d
, o un enlace simbólico, -L
, que coincide con dos rutas predeterminadas. No funciona si no se encuentran:
. . .
if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then
echo "MySQL data dir not found at /var/lib/mysql. Please create one."
exit 1
fi
if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then
echo "MySQL system database not found. Please run mysql_install_db tool."
exit 1
fi
. . .
Como necesitamos que estos inicien el servidor, crearemos la estructura de directorios mínima para pasar la verificación del entorno del script.
sudo mkdir /var/lib/mysql/mysql -p
Ahora estamos listos para iniciar MySQL.
sudo systemctl start mysql
sudo systemctl status mysql
Para asegurarse de que el nuevo directorio de datos esté realmente en uso, inicie el monitor MySQL.
mysql -u root -p
Mire nuevamente el valor para el directorio de datos:
Output
+----------------------------+
| @@datadir |
+----------------------------+
| /mnt/volume-nyc1-01/mysql/ |
+----------------------------+
1 row in set (0.01 sec)
Ahora que ha reiniciado MySQL y ha confirmado que está usando la nueva ubicación, aproveche la oportunidad para asegurarse de que su base de datos sea completamente funcional. Una vez que haya verificado la integridad de los datos existentes, puede eliminar el directorio de datos de la copia de seguridad:
sudo rm -Rf /var/lib/mysql.bak
Reinicie MySQL una vez más para asegurarse de que funciona como se espera:
sudo systemctl restart mysql
sudo systemctl status mysql
Conclusión
En este tutorial, hemos movido el directorio de datos de MySQL a una nueva ubicación y hemos actualizado las ACL de AppArmor de Ubuntu para adaptar el ajuste. Aunque estábamos usando un dispositivo de almacenamiento en bloques, las instrucciones aquí deberían ser adecuadas para redefinir la ubicación del directorio de datos, independientemente de la tecnología subyacente.
Para obtener más información sobre la administración de los directorios de datos de MySQL, consulte estas secciones en la documentación oficial de MySQL:
Fuente. Artículo traducido y con muy ligeras modificaciones de: https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-debian