Cómo mover un directorio de datos MySQL a una nueva ubicación en Ubuntu 20.04

Introducción

Índice
  1. Introducción
  • Prerrequisitos
  • Paso 1: mover el directorio de datos MySQL
  • Paso 2: señalar la nueva ubicación de los datos
  • Paso 3: Configuración de las reglas de control de acceso de AppArmor
  • Paso 4: Reiniciar MySQL
  • Conclusión
  • Las bases de datos crecen con el tiempo y, a veces, superan el espacio disponible en el sistema de archivos. También puede encontrarse con problemas de entrada/salida (E/S) cuando se encuentran en la misma partición que el resto del sistema operativo. La matriz redundante de discos independientes (RAID), el almacenamiento en bloque de red y otros dispositivos pueden ofrecer redundancia y otras funciones deseables. Ya sea que esté agregando más espacio, evaluando formas de optimizar el rendimiento o desee aprovechar otras funciones de almacenamiento, este tutorial lo guiará en la reubicación del directorio de datos de MySQL.

    Prerrequisitos

    Para completar esta guía, necesitarás:

    • Un servidor Ubuntu 20.04 con un usuario no rootsudo con privilegios y un firewall habilitado. Puede obtener más información sobre cómo configurar un usuario con estos privilegios en nuestra guía Configuración inicial del servidor con Ubuntu 20.04 .

    • Un servidor MySQL. Si aún no has instalado MySQL, consulta nuestra guía sobre cómo instalar MySQL en Ubuntu 20.04 .

    En este tutorial, moveremos los datos a un dispositivo de almacenamiento en bloque montado en /mnt/volume-nyc1-01. Puede aprender a configurar uno en la siguiente documentación sobre volúmenes de almacenamiento en bloque en DigitalOcean .

    Independientemente del almacenamiento subyacente que utilice, esta guía puede ayudarlo a mover el directorio de datos a una nueva ubicación.

    Paso 1: mover el directorio de datos MySQL

    Para prepararnos para trasladar el directorio de datos de MySQL, verifiquemos la ubicación actual iniciando una sesión MySQL interactiva con las credenciales administrativas. Ejecute el siguiente comando para abrir el indicador del servidor MySQL:

    1. sudo mysql

    Nota : Si configuró su usuario root MySQL para autenticarse usando una contraseña, puede conectarse a MySQL como este usuario con el siguiente comando:

    1. mysql -u root -p

    Cuando se le solicite, proporcione la contraseña del usuario MySQL. Luego, desde el indicador MySQL, ejecute la siguiente SELECTinstrucción. Esto devolverá el directorio de datos activo de esta instancia MySQL, que siempre se registra en datadirla variable MySQL:

    1. SELECT @@datadir;
    Output+-----------------+| @@datadir       |+-----------------+| /var/lib/mysql/ |+-----------------+1 row in set (0.00 sec)

    Esta salida confirma que MySQL está configurado para usar el directorio de datos predeterminado, /var/lib/mysql/, por lo que ese es el directorio que debe mover. Una vez que haya confirmado esto, escriba exitpara salir del monitor y regresar al símbolo del sistema:

    1. exit
    OutputBye

    Para garantizar la integridad de los datos, apague MySQL antes de realizar cambios en el directorio de datos:

    1. sudo systemctl stop mysql

    Tenga en cuenta que systemctlno se muestra el resultado de todos los comandos de administración de servicios, por lo que si desea verificar si tuvo éxito, use el siguiente comando:

    1. sudo systemctl status mysql

    Puedes confirmar que está apagado si la Activelínea en la salida indica que está inactive (dead)como se resalta en el siguiente ejemplo:

    Output● mysql.service - MySQL Community Server     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:     Active: inactive (dead) since Wed 2022-03-23 19:03:49 UTC; 5s ago    Process: 3415 ExecStart=/usr/sbin/mysqld (code=exited, status=0/SUCCESS)   Main PID: 3415 (code=exited, status=0/SUCCESS)     Status: "Server shutdown complete"

    Ahora que el servidor está apagado, puede copiar el directorio de la base de datos existente, /var/lib/mysql, a la nueva ubicación, /mnt/volume-nyc1-01, con rsync. El uso de la -abandera conserva los permisos y otras propiedades del directorio, mientras que -vproporciona una salida detallada para que pueda seguir el progreso:

    Nota: Asegúrese de que no haya una barra diagonal al final del directorio, ya que puede agregarse si utiliza la función de completar con tabulaciones. Cuando hay una barra diagonal al final, rsyncse volcará el contenido del directorio en el punto de montaje en lugar de transferirlo a un mysqldirectorio que lo contenga.

    1. sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01

    Una vez que se complete el rsynccomando, cambie el nombre de la carpeta actual con una .bakextensión y manténgala hasta que haya confirmado que el traslado se realizó correctamente. Al cambiarle el nombre, evitará la confusión que podría surgir entre los archivos de la nueva ubicación y la antigua:

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

    Ahora está listo para continuar con el siguiente paso y comenzar la configuración.

    Paso 2: señalar la nueva ubicación de los datos

    MySQL tiene varias formas de anular los valores de configuración. De forma predeterminada, datadirse establece en /var/lib/mysqlen el /etc/mysql/mysql.conf.d/mysqld.cnf archivo. Edite este archivo en su editor de texto preferido para reflejar el nuevo directorio de datos. Aquí usaremos nano:

    1. sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

    Busque la línea que comienza con datadir=. Quite el comentario de la línea eliminando el signo de almohadilla ( #) y cambie la ruta para reflejar la nueva ubicación. En este caso, el contenido del archivo actualizado será el siguiente:

    /etc/mysql/mysql.conf.d/mysqld.cnf

    . . .datadir=/mnt/volume-nyc1-01/mysql. . .

    Una vez que hayas realizado esta actualización, guarda y sal del archivo. Si estás usando nano, puedes hacerlo presionando CTRL + X, luego Y, y ENTER. Ahora es casi el momento de volver a abrir MySQL, pero antes de eso, hay una cosa más que configurar para tener éxito.

    Paso 3: Configuración de las reglas de control de acceso de AppArmor

    En este paso, debe indicarle a AppArmor que permita que MySQL escriba en el nuevo directorio creando un alias entre el directorio predeterminado y la nueva ubicación. AppArmor es un módulo de seguridad del núcleo de Linux que permite a los administradores de sistemas restringir las capacidades del programa a través de perfiles de programa, en lugar de a través de los propios usuarios. Comience abriendo y editando el aliasarchivo de AppArmor:

    1. sudo nano /etc/apparmor.d/tunables/alias

    En la parte inferior del archivo, descomente la siguiente línea y agregue la regla de alias:

    /etc/apparmor.d/tunables/alias

    . . .alias /var/lib/mysql/ - /mnt/volume-nyc1-01/mysql/,. . .

    Cuando haya terminado, guarde y salga del archivo.

    Para que los cambios surtan efecto, reinicie AppArmor:

    1. sudo systemctl restart apparmor

    Nota: Si omitió el paso de configuración de AppArmor, recibirá el siguiente mensaje de error:

    OutputJob for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.

    Dado que este mensaje no establece una conexión explícita entre AppArmor y el directorio de datos, este error puede tardar algún tiempo en detectarse.

    Una vez que haya configurado correctamente AppArmor, puede pasar al siguiente paso.

    Paso 4: Reiniciar MySQL

    Ahora es el momento de iniciar MySQL. Sin embargo, si lo hace, se encontrará con otro error. En lugar de un problema de AppArmor, este error lo causa mysql-systemd-start, un script que admite la administración de MySQL a través de systemd. Puede inspeccionar este script con el siguiente comando:

    1. nano /usr/share/mysql/mysql-systemd-start

    Este script comprueba la existencia de un directorio, -do de un enlace simbólico, -Lque coincida con la ruta del directorio de datos predeterminado. Si no encuentra ninguno de ellos, el script generará un error y evitará que MySQL se inicie:

    /usr/share/mysql/mysql-systemd-start

    . . .if [ ! -d /var/lib/mysql ]  [ ! -L /var/lib/mysql ]; then echo "MySQL data dir not found at /var/lib/mysql. Please create one." exit 1fiif [ ! -d /var/lib/mysql/mysql ]  [ ! -L /var/lib/mysql/mysql ]; then echo "MySQL system database not found. Please run mysql_install_db tool." exit 1fi. . .

    Después de inspeccionar este archivo, ciérrelo sin realizar ningún cambio.

    Dado que necesita un directorio apropiado o un enlace simbólico para iniciar el servidor, debe crear la estructura de directorio mínima para pasar la verificación del entorno del script:

    1. sudo mkdir /var/lib/mysql/mysql -p

    Ahora está listo para iniciar MySQL:

    1. sudo systemctl start mysql

    Confirme que MySQL se está ejecutando verificando el estado:

    1. sudo systemctl status mysql
    Output● mysql.service - MySQL Community Server     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:     Active: active (running) since Wed 2022-03-23 20:51:18 UTC; 4s ago    Process: 17145 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=   Main PID: 17162 (mysqld)     Status: "Server is operational"      Tasks: 38 (limit: 1132)     Memory: 376.7M     CGroup: /system.slice/mysql.service             └─17162 /usr/sbin/mysqld

    Para garantizar que el nuevo directorio de datos esté realmente en uso, inicie el monitor MySQL:

    1. mysql -u sammy -p

    Ahora consulte nuevamente el valor del directorio de datos:

    1. SELECT @@datadir;
    Output+----------------------------+| @@datadir                  |+----------------------------+| /mnt/volume-nyc1-01/mysql/ |+----------------------------+1 row in set (0.01 sec)

    Después de reiniciar MySQL y confirmar que está utilizando la nueva ubicación, aproveche la oportunidad para asegurarse de que su base de datos esté completamente funcional. Una vez que haya terminado, salga de la base de datos como se muestra a continuación y regrese al símbolo del sistema:

    1. exit
    OutputBye

    Ahora que ha verificado la integridad de los datos existentes, puede eliminar el directorio de datos de respaldo:

    1. sudo rm -Rf /var/lib/mysql.bak

    Luego reinicie MySQL una última vez:

    1. sudo systemctl restart mysql

    Y por último, confirma que funciona como se espera comprobando el estado:

    1. sudo systemctl status mysql
    Output● mysql.service - MySQL Community Server     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:     Active: active (running) since Wed 2022-03-23 20:53:03 UTC; 4s ago    Process: 17215 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=   Main PID: 17234 (mysqld)     Status: "Server is operational"      Tasks: 38 (limit: 1132)     Memory: 368.9M     CGroup: /system.slice/mysql.service             └─17234 /usr/sbin/mysqld

    Si la Activelínea indica active(running)esto, confirma que MySQL está funcionando.

    Conclusión

    En este tutorial, aprendió a mover el directorio de datos de MySQL a una nueva ubicación y a actualizar las listas de control de acceso de AppArmor de Ubuntu para adaptarlas al cambio. Aunque estábamos usando un dispositivo de almacenamiento en bloque, las instrucciones que se incluyen 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 gestión de los directorios de datos de MySQL, consulte las siguientes secciones en la documentación oficial de MySQL:

    • El directorio de datos MySQL
    • Configuración de múltiples directorios de datos
    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

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

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion