Newsgroup: it.comp.os.linux.software
Titolo: [MySql - Backup] Elenco DB

Ciao,
vorrei fare uno script che per ogni DB presente su MySQl ne faccia il 
backup con mysqldump, tipo: per ogni elemeno nella lista "select Db from 
db" lancia mysqldump, comprimi etc...
Il problema è che non conosco MySql e non so dove reperire la lista dei 
DB presenti sull'istanza di MySql, mi potete aiutare ?

NEXUZ6 ha scritto:

Ho notato che in /var/lib/mysql c'è una cartella per ogni DB, è 
itulizzabile come lista dei DB presnti sulla macchina ?


http://csvtosql.sf.net

 itulizzabile come lista dei DB presnti sulla macchina ?
La puoi utilizzare comunque se vuoi fare un backup di un database alla
volta esiste un programmino già fatto di nome 'mysqlsnapshot' che fa
esattamente quello che vuoi te e lo usi cosi:
# mysqlsnapshot -u root -p PASSWORD_ROOT --snapdir /tmp/backup --split
-n
--split fa un file tar per ogni database, proprio come vuoi te (se lo
togli fa un file tar unico)
--snapdir indichi il path dove mettere i dump
Lui backuppa tutti i database che trova..
non c'è modo di dire cosa backuppare e cosa no però essendo fatto in
perl lo puoi adattare come vuoi.
Prova a sentirti fortunato su google per sapere dove trovarlo ;)

 itulizzabile come lista dei DB presnti sulla macchina ?
forse, nel senso che non mi pare quella directory sia leggibile a
chiunque, io uso:
for db in `mysqlshow -h $db_server | perl -e '{while($line=<STDIN>) { chop $line; $line=~s/\|//g; if($line=~m/^\+/){ next; } if($line=~m/Databases/){ next; } print "$line\n"; } }'` ; do 
    # ruota i dump vecchi e fai altre cose che qui non interessano
    mysqldump -h $db_server $db > $dump_dir/$db/$db
    gzip $dump_dir/$db/$db
done
Un po'casalingo, manca tutta la parte di controllo degli errori, ma non
mi ha mai dato problemi in 3 anni. 
Ciao, Micky
-- 
Errare è umano, ma per fare veramente casino ci vuole la password di root!
mi...@fcnz.zrfvan.arg

 mi ha mai dato problemi in 3 anni.
Un problema che a me capita spesso (e non ho mai capito come risolvere)
è la reimportazione from-scratch del db.
Supponiamo che il db ABC si spacchi e sia necessario reinserirlo da 0.
La procedura è semplice
mysqladmin create ABC
mysql ABC < abc.sql
abc.sql è il dumpone fatto con mysqldump
Il problema è che sul 70% dei db che ho, se li reimporto in quel modo,
mysql esce con un errore di sintassi alla riga XX. sono sempre insert o
create table.
in poche parole non mi reinserisce il db...magari lavora un ora su db
molto grandi poi si blocca dicendo errore.
non ho mai capito il perchè di questi errori di sintassi dal momento
che è lui stesso che fa il dump...
un bug?
Comunque ho risolto facendo un flush delle tabelle per ogni database
(in modo da salvare tutto su disco) e a fare *brutalmente* un pacchetto
della directory del db con il tar.
come mysqlsnapshot in pratica.

 un bug?
Prova a fare il dump con: 
mysqldump -A --add-drop-table -u pippo -psecret > dump.sql
In questo modo poi basta
mysql -u pippo -psecret < /back/mi_mysql/dump.sql
senza scomodare mysqladmin e soprattutto senza errori.
-- 
echo 152079117477642780034933529998195782666P | dc

 backup con mysqldump
In bash?
Supponendo che tu lo voglia mettere in crontab e che nella home di root
ci sia un file .my.cnf con le password giuste:
#!/bin/bash
export HOME=/root/
data=`date -I`
for i in `mysql --skip-column-names --silent --exec "show databases"`; \
    echo "Inizio dump database "$i; \
    nomedump=/var/backup/mysqldata/$data-$i-fulldump.sql; \
    mysqldump --opt $i >$nomedump; \
    bzip2 -9 $nomedump; \
    echo "Dump del database "$i" completato"; \
done
Ovviamente cosi` e` primordiale, manca qualsiasi controllo sullo spazio
disco, sulla presenza del file, ecc...
-- 
Ciao da Villo  -  GPG public key available
                  Ferrara Linux Users Group
Remove +settanta for email replies

 e riprova...
Proverò...
Però l'altro metodo secondo me è piu comodo, se si deve fare un
backup totale...è chiaro che se serve solo un pezzo di db (diciamo un
centinario di record ben precisi) con il mio metodo il restore è piu
complicato.


be il drop table c'è già nel mio dump
c'è anche complete insert..
ho provato in svariate maniere ma si è sempre verificato questo errore
(in posti diversi, non sempre alla stessa riga)
Essendo un backup, preferisco copiare tutta la cartella cosi posso
dormire sonni tranquilli senza sperare che il giorno del restore il
backup sia ok...

 disco, sulla presenza del file, ecc...
ma prima di fare il dump fermi mysql?
oppure c'è un qualche modo per forzare la scrittura su disco prima di 
copiare i file?
-- 
Ranger!
ranger chiocciol@ 
racine.ra.it

 copiare i file?
FLUSH TABLES
o da riga di comando
# mysql -uroot -pPASSWORD --silent -e "FLUSH TABLES;"

 ma prima di fare il dump fermi mysql?
:-?
Scusa, mysqldump è fatto apposta per dumpare dati senza dover fermare
mysqld, si prende tutti i lock del caso e poi scrive il dump su disco.
-- 
Luca Villani     NOC Manager  -  Wireless Solutions S.p.A.  (Dada Group)
http://www.wseurope.com
          via Castiglione 25, 40124 Bologna Italy
T:
+39 051 2966826
   F:
+39 051 2966800
   M:
+39 348 5298542
   UIN:76272621
GPG public key available

 mysqld, si prende tutti i lock del caso e poi scrive il dump su disco.
si, hai ragione.
ho fatto io confusione, mi sembrava che copiassi i datafile, ma ho fatto 
confusione con altri post ..
ciao


 confusione con altri post ..
Be io copio di datafile, quindi prima flussho (chissa come si scrive)
mysql o lo fermo. Se fai il dump non ti serve lo stop.

 mysql o lo fermo. Se fai il dump non ti serve lo stop.
Se usi mysqlhotcopy
 
http://dev.mysql.com/doc/mysql/en/mysqlhotcopy.html
non c'è bisogno di fermare mysqld: la utility si prende i lock del caso,
effettua il flush e poi copia i datafile.
Alla fine, toglie i lock.


  
http://dev.mysql.com/doc/mysql/en/mysqlhotcopy.html
Uso mysqlsnapshot che fa anche lui il flush per ogni db.

 Uso mysqlsnapshot che fa anche lui il flush per ogni db.
Non è prodotto direttamente da MySQL A.B., ma da quello che so fa la stessa
cosa di mysqlhotcopy, ed entrambi hanno la limitazione che funzionano
correttamente solo con tabelle MyIsam.


 correttamente solo con tabelle MyIsam.
Si si....
Io ho solo MyIsam....quindi per me va bene...
Per le inno c'è un tool apposito, non ricordo il nome però.

 db" lancia mysqldump, comprimi etc...
Io uso una roba del genere:
DBS=`mysqlshow  -u root | sed 's/ //g' | sed 's/|//g' | sed '/^+/d' |
sed '/^Databases$/d'`
(tutto su una riga)
perche` quel canchero di mysqlshow non ha una modalita` "non tabellare".
Bye.

> perche` quel canchero di mysqlshow non ha una modalita` "non tabellare".
Be ma se devi avere l'elenco dei db, leggi il contenuto della dir di
mysql dove i permessi (delle sottocartelle) equivalgono a quelli di
mysql......
Avrai un mysqlshow non tabellare tanto i database son gli stessi e le
directory hanno lo stesso nome del db.

 mysql......
Solo se hai unicamente tabelle MyISAM.
Se ne hai InnoDB non le trovi li`, ma le vedi solo da dentro MySQL.
Bye.

 Se ne hai InnoDB non le trovi li`, ma le vedi solo da dentro MySQL.
Questo non lo sapevo. ho solo myisam. :(

 Se ne hai InnoDB non le trovi li`, ma le vedi solo da dentro MySQL.
Non proprio: i db sono comunque directory in /var/lib/mysql (tipicamente),
mentre le tabelle InnoDB presentano nelle varie /var/lib/mysql/nomedb/
solamente un file .frm
I dati sono nei vari /var/lib/mysql/ibdataxxx
E se le usate, attenti a quando crescono fino ad arrivare ai 2 BGyte


> E se le usate, attenti a quando crescono fino ad arrivare ai 2 BGyte
Be io ho tabelle isam di oltre 4 gb.....


 Be io ho tabelle isam di oltre 4 gb.....
Pure io: dipende dal kernel.
E non mi dite che i kernel moderni sono tutti a posto: ho visto cose che voi
umani... ;-)
Quindi attenti. :-)


 Quindi attenti. :-)
Ho visto che lavori a Wireless Solution nella firma....
Posso contattarti in pvt?

 Posso contattarti in pvt?
Si, ti ho già risposto con il mio address privato.


> Si, ti ho già risposto con il mio address privato.
Ti ho risposto, non so se mi hai scritto perchè non mi è arrivato il
tuo msg.