Come si sposta la directory dei dati MySQL?

52

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 avendo è che ho provato di tutto e dopo aver modificato la posizione del datadir in my.cnf mysql non verrà riavviato.

Tutto ciò che ottengo è:

start: Job failed to start
    
posta Jonny Flowers 15.05.2012 - 18:32

7 risposte

61

Hai dimenticato l'armatura delle 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 SOLO le cartelle del database:

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

Esegui il backup del file my.cnf :

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

Modifica il file my.cnf :

nano /etc/mysql/my.cnf

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

Il mio è diventato:

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

Aggiorna i permessi della directory:

chown -R mysql:mysql /array2/mysql

Rinomina la vecchia directory:

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

Crea un link simbolico, nel caso in cui:

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

Consenti ad AppArmor di conoscere il nuovo datadir:

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

Ricarica i profili di apparmor

sudo /etc/init.d/apparmor reload

Quindi avvia mysql:

start mysql
    
risposta data Jonny Flowers 21.09.2015 - 11:20
20

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

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

Ho clonato la directory mysql nella nuova posizione:

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

Poi ho modificato la riga datadir in /etc/mysql/my.cnf :

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

Poi 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,

Poi ho riavviato mysql .

    
risposta data Brian Moore 17.08.2012 - 18:29
13

Attenzione.

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

  

'Tabella' databaseName.tableName 'non esiste'

errori.

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

sudo cp -p /var/lib/mysql/ib* /array2/mysql/
    
risposta data dave 02.05.2013 - 11:59
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 qualcosa vada storto):

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

crea una nuova directory vuota al posto di vecchia:

mkdir /var/lib/mysql

associa la nuova posizione al vecchio:

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

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

    
risposta data snapfractalpop 21.08.2015 - 00:19
3

Se sposti il ​​tuo datadir, non solo devi dare le nuove autorizzazioni datadir, ma devi assicurarti che tutte le directory genitore abbiano l'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 su ciascun supporto, utente e directory dati:

sudo chmod 771 *DIR*

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

    
risposta data Kohjah Breese 09.10.2014 - 14:36
1

Preferisco usare mount con l'opzione bind, così evito ogni ulteriore modifica nella configurazione di Apparmor e Mysql.

Ad esempio:

Supponiamo di voler spostare tutto in /var/www . Diciamo che questa dir è il mio ambiente di sviluppo ed è montata in una partizione diversa

  1. Prima dobbiamo smettere di mysql :

    sudo systemctl stop mysql.service
    
  2. Spostiamo i file (autorizzazione alla conservazione)

    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'opzione bind nella vecchia.
    modifica /etc/fstab e aggiungi questa riga:

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

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

  5. Ora facciamo il mount:

    sudo mount -a
    

    e riavvia mysql.

risposta data Postadelmaga 02.12.2016 - 05:36
0

Ti rendi conto che se segui i comandi testualmente 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 mettere in / array2 / mysql / mysql come directory altrimenti il ​​tuo mysqld non verrà avviato.

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.

    
risposta data Ellison Chan 29.10.2017 - 18:16

Leggi altre domande sui tag