Nuova versione della classe MySQLDump per il backup di DB MySQL
Categories: MySQL, Source Code, php
Tags:
Guest post di Daniele
Oggi vi presento la nuova versione (2.0) della classe MySQLDump già introdotta da questo articolo nel quale si spiega come utilizzare questo strumento per semplificare il backup di database MySQL mediante pagine php.
I miglioramenti non sono molto numerosi dato che si partiva dal già ottimo lavoro di inandrea ma penso possano rivelarsi abbastanza utili: ora è infatti possibile esportare struttura e/o dati non solo dell’intero database selezionato ma anche di una singola tabella.
Ipotizziamo di avere un database denominato ‘ilmiodatabase’ e, all’interno di questo la tabella ‘lamiatabella’. Ora vediamo come esportare struttura e dati per la nostra tabella. (Attenzione che l’interfaccia della classe è leggermente cambiata rispetto alla precedente versione).
//Includo la libreria
@include_once('lib_dump.php');
//Connessione al database
$connection = @mysql_connect('127.0.0.1','username','password');
//Creazione di una istanza della classe MySQLDump
//1° parametro: il nome del database da esportare
//2° parametro: il file che conterrà il dump
//3° parametro: il tipo di file creato (true = compresso, false = semplice)
//4° parametro: la codifica dei dati (true = esadecimale, false = plain text)
$dumper = new MySQLDump('ilmiodatabase','filedidump.sql',false,false);
//Espotazione della struttura della tabella 'lamiatabella'
$dumper->getTableStructure('lamiatabella');
//Espotazione dei dati contenuti nella tabella 'lamiatabella'
$dumper->getTableData('lamiatabella');
In questo modo otteniamo, all’interno del file filedidump.sql, il dump completo della tabella ‘lamiatabella’, cioè sia l’istruzione sql per ricreare la tabella sia il backup dei dati. Ovviamente nulla ci vieta di richiedere il backup della sola struttura o dei soli i dati.
Se invece vogliamo il backup completo del database, la nuova interfaccia della classe ci impone di utilizzare queste istruzioni in alternativa a quello che abbiamo presentato in precedenza:
@include_once('lib_dump.php');
$connection = @mysql_connect('127.0.0.1','username','password');
$dumper = new MySQLDump('ilmiodatabase','filedidump.sql',false,false);
$dumper->doDump();
Per ottenere invece separatamente struttura e dati dobbiamo operare così:
@include_once('lib_dump.php');
$connection = @mysql_connect('127.0.0.1','username','password');
$dumper = new MySQLDump('ilmiodatabase','filedidump.sql',false,false);
$dumper->getDatabaseStructure();
$dumper->getDatabaseData();
Ovviamente, come dicevo prima, nulla ci vieta di ottenere il backup della sola struttura del database o dei soli dati.
Sperando vi possa essere utile vi invito a visitare l’apposita sezione del nostro sito (http://www.creativefactory.it/lab/) dove potete trovare anche tutta la documentazione completa generata con phpdoc.
Ecco il link da cui scaricare la classe: http://www.creativefactory.it/lab/mysqldump/lib_dump.zip
In alternativa potete effettuare il download del file anche da phpclasses.org.
Se sei interessato a questo post, potresti anche provare a leggere:
-
No related posts
08 Ott 2007 Daniele
Ciao e complimenti
ho provato a fare il backup di un database, tutto bene.
Ma il restore?
Ho fatto un importa dal phpmyadmin 2.7.0-pl2 tramite il comando importa, ma anche con un file.sql da 4 Kb ci mette una vita e poi mi da il seguente errore:
“Fatal error: Maximum execution time of 300 seconds exceeded in /var/www/html/pma/libraries/import/sql.php on line 42″
Qualche consiglio per il restore del database
grazie
L’esigenza di usare un script del genere era nata dal fatto che mi serviva una copia del db del sito in locale, quindi il restore l’ho sempre fatto direttamente con mysql, in linea di comando, per intenderci. Non ho mai provato ad eseguire il restore in altre maniere, però potrebbe essere lo spunto per un altro articolo. L’unica cosa che ti posso consigliare è di provare a diminure il terzo parametro della funzione “dumpDatabaseData”. Riducilo prograssivamente, così diminuirai la complessità delle “INSERT”, sperando che il phpMyAdmin non vada in timeout. Considera però che così il file del dump sarà sempre più grande, al diminuire del valore del parametro.
Ecco un esempio:
//$dump->dumpDatabaseData(”nomedb”, $filename, 100);
$dump->dumpDatabaseData(”nomedb”, $filename, 10);
ps: non scendere al di sotto di 1!
ps2:UUPS! CHIEDO UMILMENTE SCUSA…
Non mi ero accorto che il commento si riferiva alla nuova di Daniele di mySqlDump. Le istruzioni che ti ho dato valgono per la vecchia verisione, quella dell’articolo precedente, che però non ti consente di fare il dump di una tabella in particolare. ANCORA PERDONO…
Ciao,
ho caricato la nuova versione della classe, la 2.20. Di default crea dump di dimensioni fino al 50% minori.
Forse con questa riesci a non andare in time-out durante la fase di restore.
Anche se il tuo problema potrebbe essere differente..
Saluti, Daniele.
Ciao Daniele
innanzitutto grazie per l’impegno e il tempo speso per migliorare la classe, che devo dire al momento è quasi perfetta.
Dico quasi perchè l’unico errore che mi dà il phpmyadmin si riferisce alla mancanza della specifica sulla chiave primaria.
Se io aggiungo in fondo alle specifiche del “create table” prima della parentesi di chiusura la dicitura ad es:”PRIMARY KEY ( `id` )”, funziona tutto alla grande e fare il restore di un database è un gioco da ragazzi.
Il problema è che non so come modificare la tua classe per fare aggiungere la dicitura che specifica quale campo è la chiave primaria.
Se potessi fare questa ulteriore modifica il lavoro sarebbe veramente perfetto è utile credo per tanti.
Comunque ti ringrazio per il lavoro fino a qui svolto.
P.S. il mio test è stato fatto con il phpmyadmin 2.7.0-pl2
Ciao,
ti ringrazio per l’apprezzamento al lavoro svolto e per l’aiuto nel debug.
Il problema che mi segnali è particolare, non l’ho ancora incontrato.. se possibile contattami a daniele PUNTO vigano AT creativefactory PUNTO it così possiamo scambiarci qualche file.
Saluti, Daniele.
Ciao Daniele
Ho provato a dare un’occhiata alla classe e con questa modifica alla riga n° 304 dove cerca il Key_name Se sostituisco la riga:
if (($row->Key_name == ‘PRIMARY’) AND ($row->Index_type == ‘BTREE’)) {
con la riga:
if (($row->Key_name == ‘PRIMARY’)) {
funziona tutto alla grande.
Ora io sinceramente non so dirti se è un problema di versione di Mysql o php o se la mia correzione è giusta o sbagliata.
Non sono così esperto, ho solo scoperto che togliendo dal ciclo ’if la condizione dell’ Index_type la cosa funziona.
Poi le mie tabelle sono MyISAM che penso siano di default, forse con tabelle di altro tipo potrebbero nascere i problemi.
In ogni caso lascio a voi esperti sciogliere l’arcano
Comunque grazie ancora per l’interessamento.
Ciao Roberto
Bhe grazie per l’aiuto nello sviluppo! La cosa è interessante.. ti posso chiedere un favore?
Su una tabella di quelle per le quali non ottenevi le chiavi, potresti eseguire questa query:
SHOW KEYS FROM nometabella
e riportarmi il risultato?
Mi sarebbe utile per migliorare la classe..
Grazie, ciao!
Ciao,
Probabilmente sto sbagliando qualcosa di clamoroso, ma a me non funziona (mi trovo su una debian 4.0).
da shell:
# mysqlshow -h localhost -u bacula –password=bacula
+——————–+
| Databases |
+——————–+
| information_schema |
| bacula |
+——————–+
lo script:
getDatabaseStructure() or die (”Can’t Get DB Structure!”);
$dumper->getDatabaseData() or die (”Can’t Get DB Data!”);
?>
mi becco questi messaggi:
Database:
Can’t Get DB Structure!
Possibile che io riesca a connettermi al DB ma che la getDatabaseStructure fallisca?
Ciao
acc… il codice che ho postato si vede male!
come posso fare a scriverlo in modo che si veda?
mandamelo via mail che lo posto io… dzamir at coders4fun punto com
Ciao,
sto provando ad usare la classe per eseguire backups dei miei database.
Mi sono reso conto, però che la classe si comporta in modo strano con i campi longtext, in quanto non restituisce una stringa, ma un valore numerico (tipo: 0×4E656C6C612073756120706172746520737570657266696369616C652070726573656E746120756E61206C656E746520646920636172626F6E65).
Io non sono un esperto e non saprei dove mettere le mani….
Per il resto la classe è fantastica!
Spero di ricevere una risposta presto, che ne ho diversi di campi longtext nei miei databases.
ciao
@julian: Mi pare strano che il longtext sia un campo binario, potresti fare la prova del 9 a reimportare il backup che hai creato nel db: se tutto funziona allora va bene così altrimenti c’è qualche problema! Comunque io non sono tanto esperto di mysql e la classe non l’ho fatta io, vediamo che dice l’altro admin del blog (inandrea, ma lui cmq è schifosamente scemo, non so se ti conviene ascoltarlo :D)
Ciao Dzamir,
Ho fatto la prova che mi dicevi.
Non l’avevo infatti scritto, nel primo post, ma in effetti quando reimporto il backup, tutto funziona normalmente.
Mi chiedevo, però quale fosse il problema, e se la cosa funziona con tutte le funzioni di phpMyAdmin e altro…
Quando faccio il dump con phpMyAdmin, questo problema nn esiste…
Grazie mille
Ciao,
il problema è dovuto al fatto che hai settato la classe per effettuare il dump dei campi di testo con codifica esadecimale.
Prova così:
$miaClasse = new MYSQLDump($db, $filepath, false, FALSE);
La differenza la fa l’ultimo parametro.
Saluti, Daniele.
Ciao,
non mi sembra sia questo il problema perché i parametri li avevo già impostati su false, entrambi. Infatti è la prima cosa che avevo controllato…
grazie e saluti
@julian
Ho fatto delle prove ma non ho riscontrato il tuo problema, pertanto potresti mandarmi il dump della tabella che ti crea problemi (realizzato con phpMyAdmin)?
Mi sarebbe molto di aiuto..
Scusa se ti rispondo solo ora…
Bye!
ciao, bella classe ma non sono riuscita a farla funzionare.
In particolare, chiedo come vengono gestite queste cose:
1) è possibile dire allo script di non salvare il file .sql sul server ma di inviarlo al browser per il download?
2) mi da sempre l’errore “Notice: Undefined offset: 3 in /home/websites/public_html/dump/lib_dump.php on line 222″, per decine di volte.
3) come faccio a fare il backup di più di una tabella?
Grazie e ciao
UsandoCiao a tutti!!
Sto provando in locale lo script, quando lo eseguo su IE7 la pagina visualizza un “Internet Explorer: impossibile visualizzare la pagina Web” mentre su firefox la pagina rimane bianca.
Il file però viene creato. La cosa strana è che solo se scrivo $dumper->getDatabaseData() (e quindi anche $dumper->doDump();) mi da quel problema, mentre da sola la struttura la crea tranquillamente.
In tutti e due i casi in cui estraggo data, i campi longtext vengono scritti in esadecimale (0×3C7020616C69676E3D226A757…..) nonostante l’impostazione sia su false.
Essendo il database abbastanza pieno di informazioni, l’import in phpmyadmin sul sito ci mette una vita….questo perchè una semplice notizia diventa esageratamente lunga scritta in esadecimale….
Una cosa del genere me la fa anche il software che uso per gestire i database mysql in locale (EMS SQL Manager) quando esporto un database. Premetto che ho installato mysql 5 come server. Per avere un file corretto devo impostare dal softwarel’esportazione in modalità 4, in quel caso funge tutto bene.
Come posso risolvere il problema con questo script?
Io utilizzo mysql5 e php4.
Ciao, cmq conmplimenti perchè è davvero una bella classe utilissima!!!
UsandoRiguardo al problema di Julian, non so perchè ma sembra che
ciao
sto cercando di implementare questo script sono su vista iis 7.0
mi restituisce questo errore, dove sbaglio?
grazie, daniele (è anche il mio nome :-).
Fatal error: Class ‘MySQLDump’ not found in C:\inetpub\wwwroot\gestionale\archivi\back5.php on line 5
la linea 5 e quella dell’esportazione di tutto il db
$dumper = new MySQLDump(db_1′,’filedidump.sql’,false,false);
UsandoCiao a tutti.
Stavo provando la classe solo che in locale mi funziona mentre on-line no.
UsandoNon è che per caso è colpa del mio hosting?
Prova a capire che errore viene generato e postalo.
Usando