Come posso spostare la directory dei dati MySQL?


57

Sto cercando di spostare la directory dei dati del mio database MySQL su un secondo array di dischi che ho come punto di montaggio /array2/.

Il problema che sto riscontrando è che ho provato di tutto e dopo aver modificato la posizione di datadir in my.cnf mysql non si riavvierà.

Tutto quello che ottengo è:

start: Job failed to start

Risposte:


62

Hai dimenticato l'armatura dell'app.

Per chiunque sia interessato ho fatto quanto segue per spostare la cartella.

Arresta il server mysql:

stop mysql

Crea la nuova directory:

mkdir /array2/mysql

Copia SOLO le cartelle del database:

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

Eseguire il backup del my.cnffile:

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

Modifica il my.cnffile:

nano /etc/mysql/my.cnf

Cambia tutte le menzioni del vecchio datadir e socket nella nuova posizione

Il mio divenne:

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

Aggiorna le autorizzazioni della directory:

chown -R mysql:mysql /array2/mysql

Rinomina la vecchia directory:

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

Crea un collegamento simbolico, nel caso in cui:

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

Informare AppArmor sul nuovo datadir:

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

Ricarica i profili apparmor

sudo /etc/init.d/apparmor reload

Quindi avviare mysql:

start mysql

Questa è una buona risposta ma potrebbe essere necessario un ulteriore passaggio per consentire ai client di connettersi a mysql. Aggiungi un nuovo gruppo con una riga sotto di esso ... [client] socket = / array2 / mysql / mysql.sock dove la porzione socket = punta alla nuova posizione del tuo file mysql.sock.
Nottambulo

1
Se non vuoi essere disturbato a unire /etc/apparmor.d/usr.sbin.mysqldogni volta che mysql riceve un aggiornamento, puoi invece aggiungere /array2/mysql/** rwk,a /etc/apparmor.d/local/usr.sbin.mysqld. Mysql avrà comunque accesso alla vecchia directory dei dati, ma probabilmente non è un problema.
drevicko,

sed -i "s,datadir.*=.*,datadir=$new_dir,g" /etc/mysql/my.cnf. Perché solo le cartelle del database?
int_ua,

Per chiunque trasferisca il proprio datadir su ZFS (come ho fatto io), assicurati di aggiungere anche: innodb_use_native_aio=0nella [mysqld]sezione del tuo my.cnffile, poiché ZFS su Linux non supporta AIO. dev.mysql.com/doc/refman/5.5/en/…
Andrew Ensley,

23

Ho scoperto che AppArmor era il colpevole esaminando la syslog, ed è stato in grado di modificare correttamente la mysqlposizione dei dati seguendo questo processo.

Si noti che, nei file modificati di seguito, sono +state aggiunte le linee che iniziano con e le linee che iniziano con -sono state rimosse. In realtà non dovresti digitare / incollare i +segni quando aggiungi linee a questi file.

Ho clonato la mysqldirectory nella nuova posizione:

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

Quindi ho modificato la datadirriga in /etc/mysql/my.cnf:

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

Quindi ho modificato /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,

Quindi ho riavviato mysql.


13

Sii consapevole.

Se hai tabelle InnoDB DEVI copiare i file ibdata*e ib_logfile*o non sarai in grado di utilizzare le tabelle. Otterrete:

'Table' databaseName.tableName 'non esiste'

errori.

Eseguire questo comando di copia per copiare i file ibdata*e ib_logfile*.

sudo cp -p /var/lib/mysql/ib* /array2/mysql/

questo dovrebbe essere un commento, non è una risposta completa
Postadelmaga,

4

Ho appena provato un altro modo, che alcuni potrebbero trovare utili:

copia con permessi intatti:

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

backup (nel caso in cui qualcosa vada storto):

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

crea una nuova directory vuota al posto di vecchia:

mkdir /var/lib/mysql

bind mount the new location to the old:

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

Spero che aiuti qualcuno, perché il collegamento simbolico non ha funzionato per me, e questo è stato il modo più semplice


3

Se si sposta il proprio datadir, non solo è necessario concedere le autorizzazioni per il nuovo datadir, ma è necessario assicurarsi che tutte le directory principali dispongano dell'autorizzazione.

Ho spostato il mio datadir su un disco rigido, montato su Ubuntu come:

/media/*user*/Data/

e il mio datadir era Database .

Ho dovuto impostare le autorizzazioni su 771 per ognuna delle directory media, utente e dati:

sudo chmod 771 *DIR*

Se questo non funziona, un altro modo per far funzionare mysql è cambiare l'utente in /etc/mysql/my.cnf in root; anche se non ci sono dubbi su come farlo dal punto di vista della sicurezza.


2

Preferisco usare mount con l'opzione bind in modo da evitare ulteriori cambiamenti nella configurazione di Apparmor e Mysql.


Per esempio:

Supponiamo che io voglia spostare tutto /var/www. Diciamo che questo dir è il mio ambiente di sviluppo ed è montato in una partizione diversa

  1. Per prima cosa dobbiamo fermare mysql :

    sudo systemctl stop mysql.service
    
  2. Spostiamo i file (preservando l'autorizzazione)

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

    Questo genererà una directory /var/www/mysql/con tutto il contenuto.

  3. Rimuoviamo tutto nella vecchia directory:

    sudo rm -r /var/lib/mysql/*
    
  4. Montiamo la nuova directory con l' bindopzione in quella vecchia.
    modifica /etc/fstabe aggiungi questa riga:

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

    Questo monterà il /var/www/mysqlnostro nella nostra directory vuota. /var/lib/mysql
    L' bindopzione qui fa la magia, popolerà /var/lib/mysqlil contenuto di /var/www/mysqlcosì per mysql e apparmor sarà come se nulla fosse cambiato.

  5. Ora facciamo il mount:

    sudo mount -a
    

    e riavvia mysql.


0

Ti rendi conto se segui i comandi alla lettera dalla risposta accettata fallirà?

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

Copia / var / lib / mysql in / array2 / mysql / mysql.

Quando imposti il ​​tuo file di configurazione, è meglio che tu inserisca / array2 / mysql / mysql come directory, altrimenti il ​​tuo mysqld non si avvierà.

I migliori comandi di copia sarebbero:

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

Solo i miei 2 centesimi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.