MariaDB / Cómo cambiar el directorio de datos en Ubuntu y Windows
Para cambiar dónde guarda MariaDB sus datos, detén el servidor de forma ordenada, copia el directorio de datos completo y modifica la opción datadir y los permisos de acceso. Cambiar solo la opción no traslada las bases existentes, y una copia normal con el servidor en funcionamiento puede ser incoherente; prepara primero una copia de seguridad independiente y una ventana sin escrituras.
Alcance y preparativos
El directorio de datos contiene las bases y los archivos de gestión de los motores de almacenamiento. La variable del servidor datadir identifica su ubicación actual. Este procedimiento cambia la ruta de una instancia independiente, en el mismo equipo y con la misma versión de MariaDB. Una actualización de versión, un cambio de sistema operativo, la replicación, un clúster Galera o un volumen de contenedor requieren otro plan.
Conéctate con una cuenta administrativa de MariaDB y guarda estos resultados SQL. En una instalación habitual de Ubuntu con autenticación local mediante socket puedes usar sudo mariadb. En Windows, utiliza bin\mariadb.exe -u root -p desde la instalación. Adapta la cuenta a la autenticación real de la instancia.
SELECT VERSION(), @@datadir, @@port;
SHOW VARIABLES WHERE Variable_name IN (
'log_error', 'log_bin_basename', 'innodb_data_home_dir',
'innodb_log_group_home_dir', 'aria_log_dir_path'
);
- Copia independiente: conserva una copia restaurable en otra ubicación y comprueba la restauración si hay datos de producción. Mantener la carpeta original no sustituye esa copia. La introducción a las copias de seguridad de MariaDB explica las modalidades lógica y física.
- Rutas y capacidad: anota el origen real y un destino con espacio suficiente.
/var/lib/mysql/y la versión de Windows11.4son ejemplos que debes adaptar. - Archivos externos: revisa por separado los registros binarios con rutas absolutas, tablespaces externos, claves de cifrado, enlaces simbólicos y puntos de reanálisis de Windows. No todos los archivos se trasladan al cambiar
datadir. - Mantenimiento: detén las escrituras de aplicaciones, tareas programadas y mecanismos que reinicien automáticamente el servidor. No permitas escrituras externas hasta terminar las comprobaciones.
No ejecutes mariadb-install-db en el destino al mover una instancia existente. Esa herramienta inicializa una nueva instancia; este procedimiento copia íntegramente la que ya existe.
Trasladar el directorio en Ubuntu
Localizar la configuración y el montaje de destino
Una instalación habitual mediante paquetes en Ubuntu 24.04 utiliza /etc/mysql/mariadb.conf.d/50-server.cnf, aunque la ruta depende de la instalación. Revisa argumentos y ajustes adicionales con systemctl cat, y las opciones leídas de archivos con mariadbd --print-defaults. No publiques la salida sin revisar si contiene información sensible.
sudo systemctl cat mariadb
sudo mariadbd --print-defaults
sudo du -sh /var/lib/mysql
df -h /data
findmnt -T /data
Si /data no existe, prepara y monta primero el disco de destino. Confirma con df y findmnt que se trata del sistema de archivos previsto. La documentación de archivos de opciones de MariaDB explica que las opciones posteriores y los argumentos pueden sobrescribir valores anteriores. Haz una copia del archivo que realmente lee el servicio antes de editarlo.
Detener el servidor y copiar todos los datos
El ejemplo utiliza el servicio mariadb, la cuenta del sistema mysql y el destino /data/mariadb/. Instala rsync antes de la parada si hace falta. Comprueba el estado inactive y que el proceso del servidor haya terminado. is-active puede devolver un código distinto de cero cuando el servicio está inactivo. No copies tras una parada fallida ni mientras otra instancia utilice el mismo directorio.
sudo systemctl stop mariadb
sudo systemctl is-active mariadb
sudo systemctl status mariadb --no-pager
El destino debe estar vacío; no mezcles archivos de distintas instancias. Las órdenes crean la carpeta, asignan propietario y permisos y copian también los archivos ocultos y de los motores. -a conserva, entre otros atributos, propietario y permisos. cp -a también puede conservarlos, pero una copia simple no garantiza el mismo comportamiento.
sudo mkdir -p /data/mariadb
sudo chown mysql:mysql /data/mariadb
sudo chmod 750 /data/mariadb
sudo rsync -aHAX --numeric-ids /var/lib/mysql/ /data/mariadb/
sudo rsync -aHAXnci --numeric-ids /var/lib/mysql/ /data/mariadb/
El primer rsync copia los archivos; el segundo compara sus sumas de comprobación sin modificar nada. Comprueba que ambos terminan correctamente e investiga cualquier diferencia que muestre el segundo. La barra final del origen significa «copiar el contenido». Si el destino no conserva ACL, listas de control de acceso, o atributos extendidos, resuelve el error revisando el sistema de archivos y las opciones.
Cambiar datadir y las reglas de seguridad
Modifica la entrada existente de datadir dentro de un grupo de opciones de servidor que el servicio lea. Evita añadir entradas contradictorias en varios archivos.
[mysqld]
datadir=/data/mariadb
Un propietario correcto no siempre basta. AppArmor limita el acceso a archivos de cada programa en Linux. Comprueba los perfiles activos y busca mensajes DENIED del núcleo asociados al ejecutable de MariaDB.
sudo aa-status
sudo journalctl -k -b --no-pager
Si el perfil aplicado solo permite la ruta anterior, adapta sus reglas locales o un alias que realmente utilice. La guía de fallos de arranque de MariaDB describe este alias en /etc/apparmor.d/tunables/alias. Verifica que el perfil activo lo use, respalda el archivo y comprueba que sudo systemctl reload apparmor termine correctamente. Los perfiles dependen de la distribución y el paquete; este alias no es obligatorio en todas las instalaciones.
alias /var/lib/mysql/ -> /data/mariadb/,
Revisa también ReadWritePaths, ProtectSystem y otras restricciones en systemctl cat mariadb. Para un disco separado puedes añadir esta dependencia mediante sudo systemctl edit mariadb. No formatea el disco ni sustituye el montaje permanente configurado en /etc/fstab. Consulta RequiresMountsFor en systemd.
[Unit]
RequiresMountsFor=/data/mariadb
El ejemplo evita /home y /root, que la protección predeterminada del servicio puede bloquear. Si se necesita más acceso de escritura, permite la ruta concreta en vez de desactivar toda la protección. La documentación de MariaDB sobre systemd explica estas restricciones.
Iniciar y comprobar la ruta activa
Si has modificado la unidad del servicio, recarga la configuración y arranca MariaDB. La consulta debe devolver /data/mariadb/. Mover los datos no exige cambiar también el socket del cliente; evita ajustes ajenos al traslado.
sudo systemctl daemon-reload
sudo systemctl start mariadb
sudo systemctl status mariadb --no-pager
sudo mariadb -e "SELECT @@datadir;"
Si el arranque falla o aparece la ruta antigua, mantén las aplicaciones desconectadas y utiliza el diagnóstico posterior.
Trasladar el directorio en Windows
Identificar servicio, cuenta y my.ini
Ejecuta estas órdenes en PowerShell como administrador para conocer el nombre real, la cuenta de inicio de sesión y los argumentos. Sustituye MariaDB y la versión 11.4 en todos los ejemplos. El nombre predeterminado de la guía de instalación MSI para Windows puede no coincidir con el servicio registrado.
Get-CimInstance Win32_Service |
Where-Object { $_.PathName -match 'mariadbd|mysqld' } |
Select-Object Name, State, StartName, PathName
sc.exe qc MariaDB
Localiza el my.ini indicado mediante --defaults-file. Si no se especifica, consulta las rutas de búsqueda que muestra --help --verbose de ese ejecutable y los archivos presentes. Activa Ver → Mostrar → Extensiones de nombre de archivo en el Explorador para evitar guardar my.ini.txt. Anota @@datadir y respalda la configuración activa en otra ubicación.
Detener el servicio y copiar archivos
El ejemplo traslada C:\Program Files\MariaDB 11.4\data a una nueva carpeta vacía C:\MariaDB. Confirma el estado Stopped antes de copiar. Si el destino ya existe, revisa su contenido y no fusiones datos ajenos.
Stop-Service -Name 'MariaDB'
Get-Service -Name 'MariaDB'
New-Item -ItemType Directory -Path 'C:\MariaDB'
robocopy "C:\Program Files\MariaDB 11.4\data" "C:\MariaDB" /E /COPY:DAT /DCOPY:DAT /R:1 /W:1 /XJ /XF my.ini
$copyExit = $LASTEXITCODE
if ($copyExit -ge 8) { throw "Robocopy failed: $copyExit" }
La orden incluye subcarpetas, pero excluye my.ini, que se seguirá usando en su ubicación original. /COPY:DAT copia datos, atributos y fechas; los permisos del destino se ajustan después. /XJ excluye uniones de directorio, por lo que cualquier contenido externo debe planificarse aparte. Según la referencia de Microsoft Robocopy, los códigos de salida iguales o superiores a 8 indican un fallo. Para 0–7 revisa igualmente errores, discrepancias y archivos extra inesperados en el resumen.
Dar permisos al servicio y cambiar datadir
Abre services.msc y consulta Propiedades → Iniciar sesión del servicio. En Propiedades → Seguridad → Editar → Agregar de la carpeta nueva, concede Modificar a su cuenta real. El usuario SQL root es distinto de la cuenta de Windows que ejecuta el servicio. No hace falta dar control total a Everyone.
Usa la siguiente orden solo si has confirmado la cuenta virtual NT SERVICE\MariaDB. Si el servicio tiene otro nombre o utiliza un usuario local o de dominio, adapta la identidad. (OI)(CI)M concede permisos de modificación heredables por archivos y subcarpetas. La referencia de Microsoft icacls detalla la sintaxis.
icacls "C:\MariaDB" /grant "NT SERVICE\MariaDB:(OI)(CI)M"
icacls "C:\MariaDB"
Modifica el grupo de servidor existente en el my.ini original y guarda el archivo en el mismo lugar. Las barras normales evitan problemas con escapes de barras inversas. Mantén --defaults-file apuntando a ese archivo; no traslades también la configuración durante esta tarea.
[mysqld]
datadir=C:/MariaDB
Iniciar el servicio y conectar
Inicia MariaDB y abre el cliente. Introduce la contraseña cuando se solicite, sin escribirla directamente después de -p en la orden.
Start-Service -Name 'MariaDB'
Get-Service -Name 'MariaDB'
& 'C:\Program Files\MariaDB 11.4\bin\mariadb.exe' -u root -p
Ejecuta SELECT @@datadir; y confirma C:\MariaDB\ o su forma equivalente con barras normales. El estado Running no demuestra por sí mismo que se hayan abierto los datos correctos.
Verificar datos existentes, escritura y persistencia
Compara bases, cantidades de filas representativas y valores conocidos con los registros previos. Comprueba después que el nombre de prueba siguiente no exista y ejecuta el SQL con una conexión administrativa. Si ya existe, elige otro nombre único y cámbialo en todas las instrucciones. No crees objetos de prueba dentro de una base de negocio.
SELECT @@datadir;
CREATE DATABASE datadir_move_check_13862;
CREATE TABLE datadir_move_check_13862.probe (id INT PRIMARY KEY);
INSERT INTO datadir_move_check_13862.probe VALUES (1);
SELECT * FROM datadir_move_check_13862.probe;
La última consulta debe devolver una fila con id = 1. Mantén bloqueadas las escrituras externas, reinicia ordenadamente el servicio una vez más, vuelve a conectar y ejecuta:
SELECT @@datadir;
SELECT * FROM datadir_move_check_13862.probe;
Deben conservarse la ruta nueva y la fila 1. Elimina únicamente la base de prueba con la instrucción siguiente y verifica la conexión, lectura y escritura de la aplicación antes de reanudar el tráfico. La aparición de una carpeta no demuestra que toda la información de InnoDB se haya trasladado correctamente.
DROP DATABASE datadir_move_check_13862;
Conserva el origen hasta completar las comprobaciones y cumplir la política de retención. Actualiza las tareas de copia de seguridad y supervisión para incluir la ubicación nueva.
Diagnosticar fallos o una ruta que no cambia
- Aparece el datadir anterior: comprueba si editaste otro archivo, si una opción posterior o un argumento sustituye el valor, o si el cliente se conectó al puerto o socket de otra instancia.
- Permission denied o imposibilidad de crear archivos: revisa la cuenta del servicio, el acceso a través de todas las carpetas superiores y la escritura en destino. En Ubuntu revisa AppArmor y systemd; en Windows, la ACL de la cuenta real.
- Faltan bases o tablas de sistema: busca un nivel de carpeta adicional o una copia incompleta. No inicialices el destino ni borres
ibdata1o archivos de registro para intentar arreglarlo. - Falla tras reiniciar el equipo: comprueba el montaje permanente, el orden de arranque y las letras de unidad.
En Ubuntu, examina la hora y la ruta del fallo en los registros. namei ayuda a revisar los permisos de cada directorio superior.
sudo journalctl -u mariadb -b -n 100 --no-pager
sudo journalctl -k -b --no-pager
namei -l /data/mariadb
sudo systemctl cat mariadb
En Windows, consulta la ubicación de log_error, los archivos .err de los directorios nuevo y antiguo y el Visor de eventos. Un mensaje genérico como el error de servicio 1067 no establece la causa. El diagnóstico de arranque de MariaDB ofrece comprobaciones por tipo de error.
Cuándo y cómo volver al origen
Si aún no se han permitido escrituras externas en la ubicación nueva, detén MariaDB, confirma que haya terminado y restaura la configuración guardada o el valor original de datadir. Revierte únicamente el alias de AppArmor o el ajuste adicional de systemd creado para este traslado. Conserva los demás ajustes. Si cambiaste la unidad, ejecuta daemon-reload antes de arrancar y comprueba la ruta original y los datos.
Si ya se han realizado escrituras reales en el destino, el origen conservado está desactualizado. Apuntar simplemente a él puede perder esos cambios. Bloquea otra vez las escrituras, respalda los datos recientes y prepara un traslado inverso con el servidor detenido o una recuperación adecuada. No mezcles archivos de ambos directorios ni ejecutes ambas copias simultáneamente.
