Home Page

Tips page
c
cellulari
debian
egittologia
emacs
emacs-latex
hardware
html
inglese
java
latex
linux
matlab
misc
mysql

*Check delle tabelle e recover da un crash
*Check dello stato del mysql server
*Comandi utili da sapere utilizzando MySQL
*Connettersi a MySQL da remoto
*Import ed export/backup di un database
*Limit the number of rows returned
*Oracle rownum in MySQL
*Recupero della password di root di mysql

network
octave
programming
python
security
sed
tech
webapps
windows

University Page

Programming

Debian & Linux

Some works

About me

Del.icio.us Bookmarks

BOINC Combined Statistics

Site Statistics

Contact me sending an e-mail (antispam defense activated)

debian

hacker emblem

blogger

GeoURL

View Sandro Tosi's profile on LinkedIn

This is my Google PageRank

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