Spostare la directory dei dati di MySQL, su Ubuntu 16.04

21 Luglio 2016 MySQL Storage a blocchi Storage Ubuntu Ubuntu 16.04

Introduzione

Le basi di dati crescono con il passare del tempo, a volte superando lo spazio del filesystem. È anche possibile che si abbia una “competizione” per accapparrarsi le risorse di input/output quando queste basi di dati sono situate nella stessa partizione del sistema operativo. Il RAID, lo storage a blocchi di rete ed altri dispositivi sono in grado di offrire la ridondanza ed altre caratteristiche auspicabili. Sia che vogliate aggiungere più spazio valutando i modi per ottimizzare le prestazioni sia che state cercando di trarre vantaggio da altri servizi di archiviazione, questo tutorial vi spiegherà come spostare la directory dei dati di MySQL.

Prerequisiti

Per completare questa guida è necessario:

In questo esempio stiamo muovendo i dati su un dispositivo di storage a blocchi il cui punto di mount è /mnt/volume-nyc1-01 . Potete imparare come impostarne uno nella guida Come utilizzare lo storage a blocchi su DigitalOcean.

A prescindere da quale storage sottostante si stia utilizzando, questa guida può aiutare a spostare la directory dei dati in una nuova posizione.

Fase 1 – Spostare la directory dei dati di MySQL

Per preparare lo spostamento della directory dei dati di MySQL cerchiamo di verificare la posizione corrente avviando una sessione interattiva di MySQL utilizzando le credenziali amministrative.

Quando richiesto, fornite la password di root di MySQL. Poi, dal prompt di MySQL, selezionate la directory dei dati:

mysql> select @@datadir;
Output

+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

Questo output conferma che MySQL è configurato per usare la directory dei dati di default, /var/lib/mysql, che dunque è la directory che dobbiamo spostare. Una volta avuto conferma di ciò, digitate exit per uscire dal client.

Per garantire l’integrità dei dati, faremo fermare MySQL prima di fare modifiche alla directory dei dati:

$ sudo systemctl stop mysql

systemctl non visualizza il risultato di tutti i comandi di gestione del servizio, dunque se si vuole essere sicuri che sia andato tutto per il meglio utilizzate il seguente comando:

$ sudo systemctl status mysql

Possiamo essere certi che MySQL sia stato fermato se la linea finale dell’output dice che il server è fermo:

Output

. . .
Jul 18 11:24:20 ubuntu-512mb-nyc1-01 systemd[1]: Stopped MySQL Community Server.

Ora che il server è fermo, con rsync copieremo la directory del database esistente nella nuova posizione. Utilizzare il flag -a conserva le autorizzazioni e le altre proprietà della directory mentre -v fornisce l’output dettagliato in modo da poterne seguire l’avanzamento.

Nota: Assicuratevi che non vi sia alcuna barra (lo slash /, NdT) finale nel percorso della directory, che può essere aggiunto se si utilizza l’autocompletamento tramite il tasto tab. Quando c’è una barra finale, rsync farà il dump del contenuto della directory nel punto di mount invece di trasferire tale contenuto nella directory contenente mysql:

$ sudo rsync -av /var/lib/mysql /mnt/volume-nyc1-01

Una volta che rsync ha completo il suo lavoro, rinominate la cartella corrente con un’estensione .bak e mantenetela fino a quando non avete avuto conferma che lo spostamento ha avuto successo. Nel rinominarla, eviteremo confusioni che potrebbero derivare dai file presenti sia nella nuova che nella vecchia posizione:

$ sudo mv /var/lib/mysql /var/lib/mysql.bak

Ora siamo pronti a concentrare la nostra attenzione sulla configurazione.

Fase 2 – Puntare alla nuova posizione dei dati

MySQL ha diversi modi per bypassare i valori di configurazione. Di defeult, la datadir è impostata su /var/lib/mysql nel file /etc/mysql/mysql.conf.d/mysqld.cnf. Modificate questo file per tenere conto della nuova directory dei dati:

$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Individuate la riga che inizia con datadir= e modificate il percorso che segue per tenere conto della nuova posizione.

Nel nostro caso, il file aggiornato assomiglia all’output seguente:

/etc/mysql/mysql.conf.d/mysqld.cnf
. . .
datadir=/mnt/volume-nyc1-01/mysql
. . .

Questo mi sembra il momento giusto per riavviare di nuovo MySQL, ma c’è una cosa da configurare prima di poterlo fare con successo.

Fase 3 – Configure le regole di controllo di accesso di AppArmor

Avremo bisogno di dire ad AppArmor (software di sicurezza usato su DigitalOcean, NdT) di lasciar scrivere MySQL nella nuova directory creando un alias tra la directory di default e la nuova posizione. Per far ciò, modificate il file alias di AppArmor:

$ sudo nano /etc/apparmor.d/tunables/alias

Alla fine del file aggiungete la seguente regola di alias:

/etc/apparmor.d/tunables/alias
. . .
alias /var/lib/mysql/ -> /mnt/volume-nyc1-01/mysql/,
. . .

 Affinché le modifiche abbiano effetto, riavviate AppArmor:

$ sudo systemctl restart apparmor

Nota: se si salta la fase di configurazione di AppArmor, si potrebbe incorrere nel seguente messaggio di errore:

Output

Job for mysql.service failed because the control process 
exited with error code. See "systemctl status mysql.service" 
and "journalctl -xe" for details.
L’output, sia di systemctl che di journalctl, termina con:
Output

Jul 18 11:03:24 ubuntu-512mb-nyc1-01 systemd[1]: 
mysql.service: Main process exited, code=exited, status=1/FAILURE

Dal momento che i messaggi non fanno un collegamento esplicito tra AppArmor e la directory dei dati, questo errore può richiedere un certo tempo per poterlo capire.

Fase 4 – Riavviare MySQL

Il passo successivo è quello di far partire MySQL ma, se lo fate, si incorrerà in un altro errore. Questa volta, invece di un problema di AppArmor, l’errore si verifica perché lo script mysql-systemd-start verifica l’esistenza di una directory, -d , o di un link simbolico, -L , che soddisfino i due path di default. Se non li trova, fallisce:

/usr/share/mysql/mysql-systemd-start
. . .
if [ ! -d /var/lib/mysql ] && [ ! -L /var/lib/mysql ]; then
 echo "MySQL data dir not found at /var/lib/mysql. Please create one."
 exit 1
fi

if [ ! -d /var/lib/mysql/mysql ] && [ ! -L /var/lib/mysql/mysql ]; then
 echo "MySQL system database not found. Please run mysql_install_db tool."
 exit 1
fi

. . .

Dal momento che ne abbiamo bisogno per avviare il server, creeremo la struttura delle directory minima per superare il controllo del contesto d’ambiente dello script.

$ sudo mkdir /var/lib/mysql/mysql -p

Ora siamo pronti per far partire MySQL.

$ sudo systemctl start mysql
$ sudo systemctl status mysql

Per assicurarsi che la nuova directory dei dati è effettivamente in uso, avviate il client di MySQL.

$ mysql -u root -p

Guardate di nuovo il valore della directory dei dati:

Output

+----------------------------+
| @@datadir                  |
+----------------------------+
| /mnt/volume-nyc1-01/mysql/ |
+----------------------------+
1 row in set (0.01 sec)

Ora che avete riavviato MySQL ed avete la conferma che state usando la nuova posizione, approfittate per assicurarvi che il database è pienamente operativo. Dopo aver verificato l’integrità dei dati esistenti, è possibile rimuovere la directory dei dati di backup:

$ sudo rm -Rf /var/lib/mysql.bak

Riavviate MySQL un’ultima volta per essere sicuri che tutto funzioni come previsto:

$ sudo systemctl restart mysql
$ sudo systemctl status mysql

Conclusioni

In questo tutorial abbiamo spostato la directory dei dati di MySQL in una nuova posizione ed aggiornato le ACL di AppArmor di Ubuntu al fine di far fronte alla modifica. Anche se abbiamo usato un dispositivo di storage a blocchi, le istruzioni che trovate qui dovrebbero essere adatte per ridefinire il percorso della directory dei dati indipendentemente dalla tecnologia sottostante.

Per maggiori informazioni sulla gestione della directory dei dati di MySQL, consultate queste sezioni nella documentazione ufficiale di MySQL:

Autore: Melissa Anderson

Traduzione dell’articolo: https://www.digitalocean.com/community/tutorials/how-to-move-a-mysql-data-directory-to-a-new-location-on-ubuntu-16-04 Copyright © 2016 DigitalOcean™ Inc.






Home | Chi siamo | Chat | Contattaci | Whois

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *