Backup di un database mysql da php
Categories: MySQL, Source Code, Web, php
Tags:
La classe MySQLDump è stata aggiornata a una nuova versione e questo articolo contiene informazioni obsolete. Per informazioni sulla nuova versione controllare l’articolo sulla nuova versione
In questi giorni ho deciso di scrivermi uno script su linux, per aggiornare automaticamente la mia copia in locale di questo “FANTASTICO” sito, in modo da potere smanettare sul css e sulle pagine, senza disturbare i lettori. Sinceramente mi sembrava una cosa veloce, infatti dovevo semplicemente fare il dump del database mysql di aruba, riversare il tutto nel mio db locale e opzionalmente scaricare l’intero sito via ftp. Senonché ho, tristemente, scoperto che aruba non dota i suoi “hosting server” del comando “mysqldump” (ottima utility che consente velocemente di fare il dump completo di un db mysql).
A questo punto ho deciso di sbracciarmi le maniche e ho capito che avrei dovuto mettere mano al php. Per evitare di iniziare da zero, ho cercato qualcosa di più o meno pronto da modificare il meno possibile.
Cercando sul web ho trovato una classe che faceva proprio al caso mio. Provandola ho notato che:
- memorizza tutto il dump in una variabile (con il risultato che superata una certa mole di dati, apache mi da errore);
- dumpa male le chiavi primarie e gli indici;
- non converte i dati blob, tinyblob, text … in esadecimale;
- il dump contiene sia la struttura del db, che i dati, non permettendomi di scegliere;
- non dumpa i vincoli di integrità referenziale, e i motori di memorizzazione delle tabelle (e: MyISAM, InnoDB, …).
In ogni caso è sempre meglio di niente! A LAVORO!
Racimolando il mio tempo libero, in una settimana, sono riuscito ad ottenere un dump, che quantomeno non mi desse errori in fase di importazione. Ho risolto i bug 1, 2, 3, 4 e ho aggiunto la possibilità di comprimere il dump in formato gzip. Eccovi un esempio :
<?php
//se t=1 dumpa i dati, altrimenti la struttura
$data=$_GET['t'];
require(”class_mysqldump.php”);
//Istanzio la classe con l’host del db, in questo caso localhost;
// il nome utente “root”; la password “”
$dump = new MySQLDump(”localhost”, “root”, “”);
//per generare file non compressi commentare la riga precedente
// e scommentare la seguente
//$dump = new MySQLDump(”localhost”, “root”, “”, False);
if ($data==”1″) {
//dump dei dati. il valore 100 indica ogni quante righe
//deve riscrivere l’istruzione “insert”,
//così da risparmiare spazio. Se avete problemi settatela a 1.
$dump->dumpDatabaseData(”nomedb”, $filename, 100);
//se volete che i vostri campi di dati (tipo blob, text …)
//non siano esadecimali scommentate sotto
//$dump->dumpDatabaseData(”nomedb”, $filename, 100, False);
}
else {
//dump della struttura
$dump->dumpDatabaseStructure(”nomedb”, $filename);
}
//invio il file generato allo standard output
header (’Content-Type: application/octet-stream’);
header(’Content-Disposition: attachment; filename=”‘.$filename.’”‘);
$file=fopen($filename,”r”);
fpassthru($file);
fclose($file);
//elimino il file dal server
unlink($filename);
?>
In questo esempio genero un file backup.sql.gz che, a seconda del parametro t passato alla pagina, contiene o la struttura del database “nomedb”, o i dati.
Download MySQLDump. Downloads: 2033
Un altro esempio di interfaccia alla classe si trova nell’articolo Interfaccia alla classe MySQLDump per il backup, con un altro file già pronto da scaricare per interfacciarsi con la classe.
Se sei interessato a questo post, potresti anche provare a leggere:
-
No related posts
05 Mag 2007 inandrea

Questa me la segno, grazie 1000!
Una settimana di lavoro! complimenti. ho preso pure io hosting da aruba e infatti c’ha problemi a offrire certe cose.Vabbe. Keep up the good work.
Scusa l’ignoranza,ma fare il dump con phpMyAdmin non andava bene? Ciao
Cito dall’articolo:
“Senonché ho, tristemente, scoperto che aruba non dota i suoi “hosting server” del comando “mysqldump” (ottima utility che consente velocemente di fare il dump completo di un db mysql).”
@dzamir
Si quello l’ho letto,ma phpmyadmin ti fa tutti i dump che vuoi,quindi non ho capito perchè bisogna metter mano al php,visto che c’è già quello…
@Christian Castelli
L’esigenza era nata dal fatto che avevo scritto una piccola applicazione in bash (su linux) per fare il backup del sito in automatico sul mio pc di casa, in modo da avere un sito in locale abbastanza aggiornato. Con PhpMyAdmin, non potevo scaricare in automatico il backup del db, mentre con questo script posso scaricarlo con molta semplicità (usando wget). PhpMyAdmin è un validissimo strumento che produce dei backup sicuramente migliori, solo che non mi consentiva di poterlo fare in automatico, dato che non c’è un link diretto da cui scaricare il dump.
Todo mas claro,gracias
ottimo, mi serve per una applicazione GPL, posso implementarla e citarti?
Ma certo ;)…
Poi mandami il link!
Birra virtuale pagata!
Ciao a tutti.
Lo script vedo che gira molto bene ma se volessi esportare solo una tabella invece dell’intero db com posso fare?
Nel caso della singola tabella dovresti modificare leggermente il codice sorgente: All’interno della funzione dumpDatabaseData c’è un ciclo che scorre tutte le tabelle e fa il dump di ognuna di queste. Dovresti copiare il codice per una singola tabella e incollarlo in un metodo a parte. In una futura versione del file sicuramente divideremo meglio le funzioni in modo che sia più immediato fare il dump delle singole tabelle.
Ciao scusa la domanda banale, ma il file che esponi è diverso da quello che si scarica (class_mysqldump.php).
Immagino che uno sia per comprimere, mentre l’altro per fare il backup.
La mia domanda è:
- vanno usati insieme
- dove inserisco i parametri per la connessione nel file che si scarica (class_mysqldump.php)
Mi scuso di nuovo, ma non sono molto pratico.
Nel file che scarichi trovi la classe da utilizzare, mentre in pratica il codice sorgente che trovi nell’articolo è del codice che si interfaccia a questa classe e che salva il backup. Se ti serve poter utilizzare la classe al volo senza pensarci troppo su leggi l’articolo Interfaccia alla classe MySQLDump per il backup e scarica entrambi i files.
Ciao, sono il tipo che ha fatto la classe dalla quale sei partito per il tuo articolo.. che dire, grazie per i miglioramenti notevoli che vi hai apportato!
Ora l’ho nuovamente modificata per aggiungere l’esportazione selettiva di tutto il DB o di una singola tabella (struttura e/o dati).
Poi l’ho leggermente modificata nel codice e nell’interfaccia, per avere una retrocompatibilità con la mia precedente versione.. se vi interessa la trovate sempre su phpclasses.org (http://www.phpclasses.org/browse/package/3498.html).
Saluti, Daniele.