Spostare la directory dei dati di MySQL, su Ubuntu 16.04
21 Luglio 2016
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:
- Un server Ubuntu 16.04 con un utente non root con privilegi
sudo
. È possibile sapere di più su come impostare un utente con questi privilegi nella guida Configurazione iniziale del server con Ubuntu 16.04. - Un server MySQL. Se non ne avete già installato uno, vi potrà aiutare la sezione MySQL della guida Come installare lo stack Linux, Apache, MySQL, PHP (LAMP) su Ubuntu 16.04.
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:
. . .
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:
. . .
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.
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:
. . .
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.