|
Contact me sending an e-mail (antispam defense activated) |
Title: Import ed export/backup di un database
Author: Sandro Tosi
Last modified: 2007-08-26 (2004-11-13)
L'import e l'export sono attivita` importanti della gestione di un
database MySQL: consentono, rispettivamente, di caricare dati salvati
da altri database (e quindi, per esempio, di mantenere aggiornate piu`
server con gli stessi dati) e di effettuarne una copia di backup.
Export & Backup
===============
Se e` possibile spegnere il database, allora un modo semplice per
effettuare il backup dei dati e`:
1. /etc/init.d/mysqld stop
2. cp /var/lib/mysql /path/to/backup-dir
3. /etc/init.d/mysqld start
al posto di 'cp', possono essere utilizzati altri comandi, come 'tar',
'bzip2', etc.
Se si vuole prendere un backup online del database (per esempio per i
backup giornalieri, o perche' non e` possibile spegnere il db) ci sono
alcuni comandi che possono essere utilizzati.
Il primo di essi e` il comando ``mysqldump'' che consente di salvare
un database in un file:
# mysqldump -u [user] -p [database] > [script].sql
che, dati utente e database, chiedera` la password (si puo` omettere
``-p'' se non e` necessario) e salvera` [database] in un file di testo
in cui sono contenute le SQL statements per ricreare la struttura ed i
dati del database sorgente
Dal momento che il file generato potrebbe essere molto grande, e`
possibile comprimerlo "al volo":
# mysqldump -u [user] -p [database] | gzip [script].sql.gz
E` opportuno uscire da tutte le sessioni sul database prima di
eseguire questo comando, in quanto altrimenti potrebbero esserci
problemi di consistenza dei dati (in generale, dovrebbe essere in
grado di ottenere i lock del caso ed effettuare il dump); e` possibile
(a volte consigliato) effettuare un flush dei dati sul disco:
# mysql -u [user] -p --silent -e "FLUSH TABLES;"
Se, invece, si vuole eseguire una copia ``a caldo'' del database, si
puo` utilizzare questo comando:
# mysqlhotcopy --user=<user> --password=<secret> \
--allowold <database> <backup_dir>
il quale consente di effettuare un backup a db aperto: e` possibile in
quanto effettua il lock delle tabelle.
In questo caso avremo nella <backup_dir> una nuova directory, di nome
<database> che contiene esattamente gli stessi file nella directory
del db sulla macchina.
Perche' possa essere eseguito, bisogna avere l'accesso ai file delle
tabelle che si stanno esportando, ed i privilegi di SELECT e RELOAD su
quelle tabelle.
L'ultimo comando e` ``mysqlsnapshot'':
# mysqlsnapshot -u <user> -p <password> -s <destination-dir> --split -n
("--split" per fare un tar di per ogni database).
Purtroppo, sia mysqlhotcopy che mysqlsnapshot effettuano il backup
solo delle tabelle ISAM e MyISAM. mysqldump, dal momento che effettua
un dump ASCII del database, puo` essere eseguito con qualsiasi tipo di
tabella (quindi anche InnoDB)
Esempio di uno script di backup
-------------------------------
Questo script e` quello che uso ogni notte per effettuare i backup dei
miei database:
>>>
DESTDIR=/home/morph/backup/`date --iso-8601`
mkdir -p $DESTDIR
# for any db in the db server
for db in `mysql -u morph --skip-column-name --silent --exec "show databases"`
do
mysqldump -u morph --opt $db > $DESTDIR/mysql_$db.sql
# --force to overwrite existing files
gzip --force --best $DESTDIR/mysql_$db.sql
done
<<<
Non ha controllo degli errori, ma non ha mai dato
problemi. Ovviamente, al posto della mia DESTDIR e del mio utente,
utilizzate quelli opportuni per la vostra configurazione.
Import
======
Una volta fatto l'export, diventa utile conoscere come fare l'import
dei dati salvati.
Una volta ottenuto il file [script].sql con mysqldump, si puo`
importare semplicemente con:
# mysql -u [user] -p [database] < [script].sql |