¿Cómo muevo el directorio de datos MySQL?

57

Estoy tratando de mover el directorio de datos de mi base de datos MySQL a una segunda matriz de discos que tengo como punto de montaje /array2/.

El problema que tengo es que he intentado todo y después de modificar la ubicación de datadir en my.cnf mysql no se iniciará nuevamente.

Todo lo que obtengo es:

start: Job failed to start
Jonny Flowers
fuente

Respuestas:

62

Olvidé la armadura de la aplicación.

Para cualquiera que esté interesado, hice lo siguiente para mover la carpeta.

Detenga el servidor mysql:

stop mysql

Crea el nuevo directorio:

mkdir /array2/mysql

Copie SOLO las carpetas de la base de datos:

cp -R /var/lib/mysql /array2/mysql
cp -R /var/lib/mysql/users /array2/mysql

Copia de seguridad del my.cnfarchivo:

cp /etc/mysql/my.cnf /root/my.cnf.backup

Edite el my.cnfarchivo:

nano /etc/mysql/my.cnf

Cambie todas las menciones del antiguo datadir y socket a su nueva ubicación

La mía se convirtió en:

datadir=/array2/mysql
socket=/array2/mysql/mysql.sock

Actualice los permisos del directorio:

chown -R mysql:mysql /array2/mysql

Cambie el nombre del directorio anterior:

mv /var/lib/mysql /var/lib/mysql-old

Crea un enlace simbólico, por si acaso:

ln -s /array2/mysql /var/lib/mysql 

Informe a AppArmor sobre el nuevo datadir:

echo "alias /var/lib/mysql/ -> /your/new/datadir/," >> /etc/apparmor.d/tunables/alias

Recargar los perfiles de apparmor

sudo /etc/init.d/apparmor reload

Entonces comienza mysql:

start mysql
Jonny Flowers
fuente
Esta es una buena respuesta, pero es posible que necesite un paso más para permitir que los clientes se conecten a mysql. Agregue un nuevo grupo con una línea debajo ... [clientes] socket = / array2 / mysql / mysql.sock donde la porción socket = apunta a la nueva ubicación de su archivo mysql.sock.
Night Owl
1
Si no desea ser molestado a fusionar /etc/apparmor.d/usr.sbin.mysqldcada vez mysql recibe una actualización, puede agregar /array2/mysql/** rwk,a /etc/apparmor.d/local/usr.sbin.mysqldsu lugar. Mysql todavía tendrá acceso al antiguo directorio de datos, pero eso probablemente no sea un problema.
drevicko
sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf. ¿Por qué solo las carpetas de la base de datos?
int_ua
Para cualquiera que mueva su datadir a ZFS (como lo hice yo), asegúrese de agregar también: innodb_use_native_aio=0en la [mysqld]sección de su my.cnfarchivo, ya que ZFS en Linux no es compatible con AIO. dev.mysql.com/doc/refman/5.5/en/…
Andrew Ensley
23

Descubrí que AppArmor era el culpable al examinar el syslog, y pude cambiar con éxito la mysqlubicación de los datos siguiendo este proceso.

Tenga en cuenta que, en los archivos editados a continuación, +se agregaron líneas que comienzan con, y -se eliminaron las líneas que comienzan con . En realidad, no debe escribir / pegar los +signos al agregar líneas a estos archivos.

Cloné el mysqldirectorio a la nueva ubicación:

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

Luego edité la datadirlínea en /etc/mysql/my.cnf:

sudo vi /etc/mysql/my.cnf
-datadir     = /var/lib/mysql
+datadir     = /new_dir/mysql

Luego edité /etc/apparmor.d/usr.sbin.mysqld:

sudo vi /etc/apparmor.d/usr.sbin.mysqld
-  /var/lib/mysql/ r,
-  /var/lib/mysql/** rwk,
+  /new_dir/mysql/ r,
+  /new_dir/mysql/** rwk,

Entonces reinicié mysql.

Brian Moore
fuente
13

Ten cuidado

Si tiene tablas InnoDB, DEBE copiar sobre los archivos ibdata*y ib_logfile*o no podrá usar las tablas. Conseguirás:

'Table' databaseName.tableName 'no existe'

errores

Ejecute este comando de copia para copiar sobre los archivos ibdata*y ib_logfile*.

sudo cp -p /var/lib/mysql/ib* /array2/mysql/
Dave
fuente
esto debería ser un comentario, no es una respuesta completa
Postadelmaga
4

Acabo de intentar otra forma, que algunos pueden encontrar útil:

copia con permisos intactos:

rsync -avzh /var/lib/mysql /path/to/new/place

copia de seguridad (en caso de que algo salga mal):

mv /var/lib/mysql /var/lib/_mysql

cree un nuevo directorio vacío en lugar del antiguo:

mkdir /var/lib/mysql

enlazar montar la nueva ubicación a la antigua:

mount -B /path/to/new/place /var/lib/mysql

Espero que ayude a alguien, porque la simulación no funcionó para mí, y esta fue la forma más sencilla

snapfractalpop
fuente
3

Si mueve su datadir, no solo necesita otorgar los nuevos permisos de datadir, sino que debe asegurarse de que todos los directorios principales tengan permiso.

Moví mi datadir a un disco duro, montado en Ubuntu como:

/media/*user*/Data/

y mi datadir era Bases de datos .

Tuve que establecer permisos en 771 para cada uno de los directorios de medios, usuarios y datos:

sudo chmod 771 *DIR*

Si esto no funciona, otra forma de hacer que mysql funcione es cambiar el usuario en /etc/mysql/my.cnf a root; aunque sin duda hay algunos problemas para hacerlo desde una perspectiva de seguridad.

Kohjah Breese
fuente
2

Prefiero usar la opción de montaje con enlace, así evito más cambios en la configuración de Apparmor y Mysql.


Por ejemplo:

Supongamos que quiero mover todo adentro /var/www. Digamos que este directorio es mi entorno de desarrollo y está montado en una partición diferente

  1. Primero necesitamos detener mysql :

    sudo systemctl stop mysql.service
    
  2. Movimos archivos (conservando permiso)

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

    Esto generará un directorio /var/www/mysql/con todo el contenido.

  3. Eliminamos todo en el directorio anterior:

    sudo rm -r /var/lib/mysql/*
    
  4. Montamos el nuevo directorio con bindopción en el anterior.
    edite /etc/fstaby agregue esta línea:

    /var/www/mysql /var/lib/mysql  none  bind 0 0
    

    Esto montará /var/www/mysqlen nuestro directorio vacío. /var/lib/mysql
    La bindopción aquí hace la magia, se llenará /var/lib/mysqlcon el contenido de /var/www/mysqlMySQL y Aparecerá como si nada hubiera cambiado.

  5. Ahora hacemos el montaje:

    sudo mount -a
    

    y reinicie mysql.

Postadelmaga
fuente
0

¿Te das cuenta de que si sigues los comandos al pie de la letra de la respuesta aceptada, fallará?

cp -R / var / lib / mysql / array2 / mysql

Copiará / var / lib / mysql a / array2 / mysql / mysql.

Cuando establezca su archivo de configuración, será mejor que ponga en / array2 / mysql / mysql como el directorio o de lo contrario su mysqld no podrá iniciarse.

Los mejores comandos de copia serían:

cp -R / var / lib / mysql / array2 / cp -R / var / lib / mysql / users / array2 / mysql

Sólo mis 2 centavos de valor.

Ellison Chan
fuente