¿Cómo cambiar el directorio de datos MySQL?


158

¿Es posible cambiar mi directorio de datos MySQL predeterminado a otra ruta? ¿Podré acceder a las bases de datos desde la ubicación anterior?


3
¿Hay alguna respuesta disponible para esta pregunta si el sistema en Win8?
Jonathan M


Para usuarios de mac, todo lo que necesita es esto y el paso 1-4 de la respuesta de @ user1341296.
despedida el

Respuestas:


270
  1. Detenga MySQL con el siguiente comando:

    sudo /etc/init.d/mysql stop
  2. Copie el directorio de datos existente (ubicado por defecto /var/lib/mysql) usando el siguiente comando:

    sudo cp -R -p /var/lib/mysql /newpath
  3. edite el archivo de configuración de MySQL con el siguiente comando:

    sudo gedit /etc/mysql/my.cnf   # or perhaps /etc/mysql/mysql.conf.d/mysqld.cnf
  4. Busque la entrada datadiry cambie la ruta (que debería estar /var/lib/mysql) al nuevo directorio de datos.

  5. En la terminal, ingrese el comando:

    sudo gedit /etc/apparmor.d/usr.sbin.mysqld
  6. Busque líneas que comiencen por /var/lib/mysql. Cambio /var/lib/mysqlen las líneas con la nueva ruta.

  7. Guarde y cierre el archivo.

  8. Reinicie los perfiles de AppArmor con el comando:

    sudo /etc/init.d/apparmor reload
  9. Reinicie MySQL con el comando:

    sudo /etc/init.d/mysql restart
  10. Ahora inicie sesión en MySQL y podrá acceder a las mismas bases de datos que tenía antes.


33
Lo anterior no pudo resolver el problema para mí en Ubuntu 12.04 (Precise). Descubrí que hay que editar el archivo /etc/apparmor.d/tunables/alias para incluir una línea "alias / var / lib / mysql / -> / newpath /," Con esto en su lugar, no necesitaba ninguna cambios en cualquiera de los otros archivos de AppArmor. Funcionó inmediatamente después de reiniciar AppArmor con "/etc/init.d/apparmor restart" y MySQL con "reiniciar mysql".
marzo

2
Apparmor no es relevante en CentOS. Hay SELinux en su lugar. Puede leer sobre cómo deshabilitar o administrar aquí blogs.oracle.com/jsmyth/entry/selinux_and_mysql
Noam

12
en la edición de mak (que es necesario) no olvides la coma al final de la líneaalias /var/lib/mysql/ -> /newpath/,
Michael

44
No puedo enfatizar lo suficiente lo importante que es el comentario de Michel: AGREGAR COMA DE REMOLQUE y salvar algunas neuronas. Perdón por las gorras.
alx

2
No funciona para mi Me falla el trabajo para mysql.service. Consulte 'systemctl status mysql.service' y 'journalctl -xn' para obtener detalles al intentar reiniciar mysqld, y el error es que el disco está lleno. Tiene 500GB de espacio libre ...
Frank H.

17

Rápido y fácil de hacer:

# Create new directory for MySQL data
mkdir /new/dir/for/mysql

# Set ownership of new directory to match existing one
chown --reference=/var/lib/mysql /new/dir/for/mysql

# Set permissions on new directory to match existing one
chmod --reference=/var/lib/mysql /new/dir/for/mysql

# Stop MySQL before copying over files
service mysql stop

# Copy all files in default directory, to new one, retaining perms (-p)
cp -rp /var/lib/mysql/* /new/dir/for/mysql/

Edite el /etc/my.cnfarchivo y, debajo, [mysqld]agregue esta línea:

datadir=/new/dir/for/mysql/

Si está utilizando CageFS (con o sin CloudLinux) y desea cambiar el directorio MySQL, DEBE agregar el nuevo directorio a este archivo:

/etc/cagefs/cagefs.mp

Y luego ejecuta este comando:

cagefsctl --remount-all

1
Me alegra saber: P
sMyles

Muchísimas gracias, y para agregar si quieres hacer un script completo como lo hice, puedes usar esto: sed -i 's | datadir = / var / lib / mysql | datadir = / data / var / lib / mysql | g' / etc / my.cnf
berimbolo

Esto no funcionó para mí. Intenté esto y muchas otras alternativas diferentes. Estoy llegando a la misma conclusión que user3338098 cuando dice que esta es la única forma en que funciona: serverfault.com/questions/503887/…
Volksman

@Volksman todo lo que dice el enlace es que tuvo que quitar y reinstalar ... es probable que ambos tengan algún otro problema específico del servidor, ya que tanto MySQL como MariaDB son compatibles con la configuración de datadir, y recientemente hice esto (hace 6 meses) en otro servidor sin problemas
sMyles

@sMyles sí, se eliminó e instaló, pero después de montar / var / lib / mysql en otro lugar, es decir, una mega partición a diferencia de la / var fue montada previamente. Si hay un problema específico con nuestros sistemas, sería genial saber que es así. Esto fue en una nueva instalación estándar de stock del sistema operativo Centos 7 con RAID 10 con 8x HDD, pero generalmente los detalles de la matriz de discos son transparentes para el software.
Volksman

15

tendría que copiar los datos actuales al nuevo directorio y cambiar my.cnfsu MySQL.

[mysqld]
datadir=/your/new/dir/
tmpdir=/your/new/temp/

Debe copiar la base de datos cuando el servidor no se está ejecutando .


Bueno, eso es lo que no puedo hacer. Quiero cambiar el directorio pero quiero crear nuevas bases de datos en un nuevo directorio. Y desea acceder al directorio antiguo y a las nuevas bases de datos de directorios.
MySQL DBA

1
@MySQL DBA: si usa algún ln -slince simbólico estático, ¿no lo logrará?
RageZ el

Bueno, estoy un poco confundido con el uso de este comando. Como expliqué antes, quiero crear nuevas bases de datos en un nuevo directorio. ¿Es posible con el enlace simbólico?
MySQL DBA

1
puede crear un nuevo directorio, usar un enlace simbólico para que el archivo aparezca en el nuevo directorio y cambiar sumy.cnf
RageZ

2
rechazado porque no funciona como se detalla en serverfault.com/a/733998/279553
user3338098

14

Primero debes detener el servidor mysql. p.ej

# /etc/init.d/mysql stop

Después de eso, debe copiar el antiguo directorio de datos (por ejemplo, / var / lib / mysql) incl. privilegios para su nuevo directorio a través de

# cp -R -p /var/lib/mysql /new/data/dir

ahora puede cambiar /etc/mysql/my.cnflos datos nuevos y reiniciar el servidor

# /etc/init.d/mysql restart

55
rechazado porque no funciona como se detalla en serverfault.com/a/733998/279553
user3338098

7

Si, como yo, está en Debian y desea mover el directorio mysql a su hogar o una ruta en / home / ..., la solución es:

  • Detener mysql por "sudo service mysql stop"
  • cambie la variable "datadir" a la nueva ruta en "/etc/mysql/mariadb.conf.d/50-server.cnf"
  • Haga una copia de seguridad de / var / lib / mysql: "cp -R -p / var / lib / mysql / path_to_my_backup"
  • elimine este directorio: "sudo rm -R / var / lib / mysql"
  • Mover datos al nuevo directorio: "cp -R -p / path_to_my_backup / path_new_dir
  • Cambiar el acceso mediante "sudo chown -R mysql: mysql / path_new_dir"
  • Cambie la variable "ProtectHome" por "false" en "/etc/systemd/system/mysqld.service"
  • Recargar systemd por "sudo systemctl daemon-reload"
  • Reinicie mysql con "service mysql restart"

Un día para encontrar la solución para mí en la documentación de mariadb. Espero que esto ayude a algunos chicos!


El archivo /etc/systemd/system/mysqld.service no está aquí. ¿Alguna idea de dónde debo mirar?
Ron Piggott

1
Para aquellos que usan MariaDB, el archivo de servicio se encuentra en /lib/systemd/system/mariadb@.service
Ron Piggott

5

Quería mantener una base de datos en mi máquina, pero también tener datos en mi disco duro externo y cambiar entre usar los dos.

Si está en una Mac e instaló MySQL usando Homebrew, esto debería funcionar para usted. De lo contrario, solo tendrá que sustituir las ubicaciones apropiadas para MySQL datadiren su máquina.

#cd to my data dir location
cd /usr/local/var/

#copy contents of local data directory to the new location
cp -r mysql/ /Volumes/myhd/mydatadir/

#temporarily move the old datadir
mv mysql mysql.local

#symlink to the new location
ln -s /Volumes/myhd/mydatadir mysql

Luego, cuando quieras volver, simplemente haz lo siguiente:

mv mysql mysql.remote

mv mysql.local mysql

y está utilizando su base de datos local nuevamente. Espero que ayude.


1
esto no aborda exactamente la pregunta como se dijo, sin embargo, esto era exactamente lo que estaba buscando, y es una forma ordenada de manejar un caso / error que my.cnf no maneja bien los espacios: bugs.mysql.com /bug.php?id=26033 . Voy a vincular esta solución en ese informe de error.
gabe

rechazado porque no funciona como se detalla en serverfault.com/a/733998/279553
user3338098

5

Primero pare mysqld

mysql_install_db --user=mysql \
                 --basedir=/opt/mysql/mysql \
                 --datadir=/opt/mysql/mysql/data

Luego cambie datadir en su /etc/mysql/my.cnf
Start mysqld

Notas:
# 1: probablemente tenga que ajustar la configuración de SELinux (pruebe con SELinux deshabilitado en caso de problemas), Apparmor (Ubuntu) también puede ser un problema.

# 2: vea la referencia de base de datos de instalación de MySQL


4

Primero pare su mysql

sudo service mysql stop

Copie los datos de MySQL a la nueva ubicación.

sudo cp -rp /var/lib/mysql /yourdirectory/

si usa apparmor, edite el siguiente archivo y haga lo siguiente

sudo vim /etc/apparmor.d/usr.sbin.mysqld

Reemplace where / var / lib / por / yourdirectory / luego agregue el siguiente si no existe al archivo

    /yourdirectory/mysql/ r,
    /yourdirectory/mysql/** rwk,

Guarda el archivo con el comando

:wq

Edite el archivo my.cnf

sudo vim /etc/mysql/my.cnf

Reemplace where / var / lib / por / yourdirectory / luego guarde con el comando

:wq

finalmente comience mysql

sudo service mysql start

@ver más sobre raid0, optimización ici


rechazado porque no funciona como se detalla en serverfault.com/a/733998/279553
user3338098

tal vez esto no funcione para otra distribución, pero si está utilizando ubuntu, esto funciona bien para mí y cambio la ruta para cada nuevo servidor ubuntu instalado para habilitar raid0.
naddame

2
Sé que la gente está rechazando esto, pero quiero decirte que esto me salvó el día. ¡Gracias!
Daniel Loureiro

3

Esta solución funciona en Windows 7 usando Workbench. Necesitará privilegios de administrador para hacer esto. Crea una unión (como un acceso directo) a donde realmente desee almacenar sus datos

Abra Workbench y seleccione INSTANCE - Startup / Shutdown Stop the server

Instale Junction Master desde https://bitsum.com/junctionmaster.php

Navegue a C: \ ProgramData \ MySQL \ MySQL Server 5.6

Haga clic con el botón derecho en Datos y seleccione "MOVER y luego ENLACE la carpeta para ..." Acepte el destino del punto de advertencia en "Su nuevo directorio de datos aquí sin las comillas" Haga clic en MOVER Y ENLACE

Ahora vaya a "Su nuevo directorio de datos aquí sin las comillas"

Haga clic con el botón derecho en Datos Vaya a la pestaña de seguridad Haga clic en Editar Haga clic en Agregar tipo SERVICIO DE RED y luego en Comprobar nombres Haga clic en Aceptar Haga clic en la casilla de verificación Permitir control total y luego en Aceptar

Regrese a Workbench e inicie el servidor

Este método funcionó para mí usando MySQL Workbench 6.2 en Windows 7 Enterprise.


2

Todo como @ user1341296 dijo, más ...

Es mejor que no cambie. /etc/mysql/my.cnf En su lugar, desea crear un nuevo archivo /etc/mysql/conf.d/ext.cnf(cualquier nombre, pero la extensión debería ser cnf)

Y pon en él tu cambio:

[mysqld]
datadir=/vagrant/mq/mysql

De este modo

  • No necesita cambiar el archivo existente (más fácil para los scripts de automatización)
  • No hay problemas con la actualización de la versión de MySQL (¡y sus configuraciones!).

2

En caso de que sea un usuario de Windows y aterrice aquí para descubrir que todas las respuestas son para usuarios de Linux, ¡no se decepcione! No dejaré que pierdas el tiempo como lo hice.

Un poco de tonterías antes de la solución:

MySQL usa un directorio de datos para almacenar los datos de diferentes bases de datos que crea. Bueno, al final, tiene que almacenarlos en forma de archivos con un poco de malabarismo agregado en la aplicación y el formato de archivo para garantizar que la Base de datos promete que aprendió en las clases de Bases de datos intactas.

Ahora desea asegurarse de que haya espacio suficiente para almacenar grandes bases de datos que pueda crear en el futuro, y por eso pensó: ¡Hola! Quiero ponerlo en otra unidad que tenga más espacio.

Entonces haces lo siguiente.

Paso - 1 : Detener el servicio MySQL.

  Window Key + R - will open Run
  servies.msc    - will open services manager
  Locate MySQL80 (80 is for version 8.0, look for the one you've).
  Stop it.       (Right click, Stop)

Paso - 2 : encontrar el directorio de datos actual

 Goto C:\ProgramData\MySQL\MySQL Server 8.0

De forma predeterminada, debería haber una carpeta con el nombre aquí Data, esta es la que utiliza MySQL en la configuración predeterminada (siempre que no hayan encontrado otra ubicación mejor), pero veamos eso.

Buscar my.iniarchivo, debería estar allí.

Ábralo en un editor (Notepad ++ quizás).

Haga un CTRL + F para averiguarlo datadiren el archivo.

Lo que se menciona aquí es la ubicación real actualmente en uso por MySQL para el directorio de datos. Esto es lo que quieres cambiar.

Paso - 3 : Reemplazarlo con un nuevo directorio de datos.

Digamos que desea que su nuevo directorio de datos sea W: __ MySQL_Data. Cambiemos el datadirvalor del my.iniarchivo a este valor. Mantenga el valor anterior comentado para que no tenga que recordarlo.

 # Path to the database root
 # datadir=C:/ProgramData/MySQL/MySQL Server 8.0/Data
   datadir=W:/__MySQL_Data

Ahora use xcopypara copiar el valor predeterminado datadira W:\. Inicie el símbolo del sistema (Window + R, cmd, Enter)

 >> xcopy "\C:\ProgramData\MySQL\MySQL Server 8.0" "W:\" /E /H /K /O /X

Y cambie el nombre de la carpeta copiada al nuevo datadirvalor que cambió. Aquí:W:/__MySQL_Data

¿Por qué no simplemente copiar? Bueno, porque eso no es COOL !, esto le ayuda a no perder permisos en la carpeta copiada, de modo que cuando reinicie MySQL80, no dará un error estúpido: "El servicio MySQL80 en la computadora local se inició y luego se detuvo. Algunos servicios se detienen automáticamente si no están en uso por otros servicios o programas ". - Cortesía: Microsoft

Paso - 4 : reiniciar el servicio

 Well, go back to the Services Manager to Start again, 
 "MySQL80" that you stopped, to restart it again.

Paso - 5 : ¡Listo! ¡Ahora vuelve al trabajo!


1
Gracias, eso fue útil, pero advertencia: my.ini no puede ser escrito por un usuario normal a menos que cambie sus permisos. Ah, y ProgramData es una carpeta oculta, por lo que debe cambiar la configuración de la carpeta Explorer para verla.
JonP

1

A menudo necesito hacer esto cuando actualizo máquinas, moviéndome de una caja a otra. Además de mover / var / lib / mysql a una mejor ubicación, a menudo necesito restaurar viejas tablas de bases de datos de una antigua instalación de MySQL. Para hacer esto...

  1. Deja de mysql. Siga las instrucciones anteriores, es necesario.
  2. Copie los directorios de la base de datos (habrá uno para cada una de las bases de datos de su instalación anterior) en la nueva ubicación de DATADIR. Pero omita los directorios "mysql" y "performance_schema".
  3. Permisos correctos entre los directorios de bases de datos copiados. La propiedad debería ser mysql: mysql, los directorios deberían ser 700 y los archivos deberían ser 660.
  4. Reinicie mysql. Dependiendo de su instalación, los archivos DB de la versión anterior deben actualizarse.

perdón por el voto negativo, esta solución puede ser correcta, no la he probado.
user3338098

1

Tuvimos que mover MySQL al /homedirectorio porque estaba mapeado desde otro disco físico. Para simplificar la vida, en lugar de cambiar el directorio en my.cnf, hemos asignado el nuevo directorio /home/mysqlen el lugar del directorio original /var/lib/mysql. Funciona para nosotros como un encanto (probado en CentOS 7.1).

Cree el nuevo directorio y establezca los permisos correctos.

mkdir -p /home/mysql
chmod 755 /home/mysql
chown mysql:mysql /home/mysql

Detenga MySQL si se está ejecutando.

systemctl stop mysql

Mueve el directorio de datos.

mv -f /var/lib/mysql/* /home/mysql

Crea una montura permanente y ejecútala.

echo "/home/mysql /var/lib/mysql none    bind   0 0" >> /etc/fstab
mount -a

Reinicia el servidor.

systemctl start mysql

1

Si desea hacer esto mediante programación (sin entrada de texto manual con gedit), aquí hay una versión para un Dockerfile basada en la respuesta del usuario 1341296 anterior:

FROM spittet/ruby-mysql
MAINTAINER you@gmail.com

RUN cp -R -p /var/lib/mysql /dev/shm && \
    rm -rf /var/lib/mysql && \
    sed -i -e 's,/var/lib/mysql,/dev/shm/mysql,g' /etc/mysql/my.cnf && \
    /etc/init.d/mysql restart

Disponible en Docker Hub aquí: https://hub.docker.com/r/richardjecooke/ruby-mysql-in-memory/


0

Primero, debe saber dónde está su archivo de configuración? ¿Dónde está tu archivo de configuración?

SI lo instaló con apt-get o yum install。

el archivo de configuración puede aparecer en

/etc/mysql/my.cnf

el archivo de datos puede aparecer en

/ var / lib / mysql

y lo que debes hacer es

  1. deja de mysql
  2. cambiar los datos de mysql a nuevo directorio
  3. cambiar el archivo de configuración
  4. recarga el archivo de configuración
  5. reiniciar mysql

y luego trabajos realizados.

Pero si no lo instaló con apt o yum, puede que no le guste el directorio, y puede encontrar los archivos mysql con

whereis mysql


rechazado porque no funciona como se detalla en serverfault.com/a/733998/279553
user3338098

0

Bajo SuSE 13.1, esto funciona bien para mover el directorio de datos mysql a otra parte, por ejemplo a / home / example_user /, y para darle un nombre más informativo:

En / var / lib /:

# mv -T mysql /home/example_user/mysql_datadir
# ln -s /home/example_user/mysql_datadir ./mysql

Reinicé mysql:

# systemctl restart mysql.service

pero sospecha que incluso eso no fue necesario.


0

Para uno de los entornos, cambié el directorio de datos mysql a una nueva ubicación, pero durante el reinicio del servidor mysql, me tomó tiempo. Así que verifiqué el puerto y descubrí que otro proceso estaba escuchando en el puerto mysql. Así que maté el proceso y reinicié el servidor mysql y funcionó bien.

Seguí los pasos a continuación para cambiar el directorio de datos que funcionó excelente. cambiar el directorio de datos mysql en Linux


¡Bienvenido a Stack Overflow! Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
Tim Diekmann

0

Los pasos anteriores son básicos y básicos. Los seguí y todavía recibí el error de "mysql no pudo iniciarse".

Para que la nueva carpeta almacene datos mysql, debe asegurarse de que la carpeta tenga permisos y propiedad mysql: mysql.

Además de esto, necesita verificar los permisos y la propiedad del directorio padre de mysql si tiene, por ejemplo, / data / mysql /. Aquí el directorio / data / debe ser root: root. Arregle el error de "mysql no pudo iniciarse" después de cambiar la propiedad del directorio padre de / mysql. El sistema operativo en mi VM es RHEL 7.6.


Probé selinux en RHEL7.6 cambiando SELINUX = imponer a SELINUX = permisivo, no funcionó para mí.
user3325137William

0

También es posible vincular el datadir. Al menos en macOS, entorno de desarrollo.

(homebrew) ej.

# make sure you're not overwriting anything important, backup existing data
mv /usr/local/var/mysql [your preferred data directory] 
ln -s [your preferred data directory] /usr/local/var/mysql

Reinicie mysql.


-1

Si está utilizando SE Linux, configúrelo en modo permisivo editando / etc / selinux / config y cambiando SELINUX = imponer a SELINUX = permisivo


como se detalla aquí serverfault.com/questions/503887/… selinux no tiene la culpa, hay algún otro problema que impide el cambio de la datadirpropiedad
user3338098
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.