
Tag: Programmazione, PHP, Internet, Linux.Visto 1454 volte.
Il dump è un file che contiene l'intera struttura delle tabelle di un database ed eventualmente i relativi dati. E' composto da una lista di dichiarazioni scritte in SQL che ricreano le tabelle e la loro struttura, e inseriscono i dati presenti fino alla data del dump. Questa procedura viene utilizzata principalmente per fare il backup del database e per poter ripristinare le tabelle del database in caso di occasionali perdita di dati.
Ogni database ha comandi propri per fare il dump. Noi oggi ci occuperemo del dump dei database MySQL.
Come primo metodo possiamo dare un comando di questo tipo:
Code:
dove <dbHost> è l'indirizzo del nostro server, <dbUser> e <dbPass> sono le credenziali del nostro accesso al DBMS, <dbName> è il database del quale vogliamo il dump e <pathBackupFile> è il nome del file dove salviamo l'intero dump(notare "| gzip", perchè se il file ha dimensione modeste è cosa buona e giusta comprimerlo!).
Altro metodo è aprire un pannello di gestione del DBMS (come phpMyAdmin), selezionare il nostro database e cliccare su esporta.
Ma se volessi automatizzare questo lavoro, come posso fare?
Posso usare la funzione system di php e utilizzare il comando visto in precedenza e creare uno script del genere:
Code:
$dbhost="127.0.0.1";
$dbuser="root";
$dbpass=""; //brutto affare pass vuota!!!
$dbname="ilnomedelmioDB";
$nameFile = $dbname . date("Ymd") . '.gz';
$cmd = "mysqldump --opt -h $dbhost -u$dbuser -p$dbpass $dbname | gzip > $nameFile";
system($cmd);
?>
Oppure fare una cosa più artigianale e creare uno script php che utilizzi le funzioni mysql_* per ottenere il dump del nostro database. Purtroppo php.net non ci offre uno funzione facile (per esempio mysql_dump), per ottenere quello che vogliamo, quindi dobbiamo fare tutto da noi(qui il file php).
Le parti principali dello script sono tre.
Inanzitutto prendiamo la lista di tutti i nostri database
Code:
$temp=mysql_list_dbs($dbConn);
$db=array();
while($row=mysql_fetch_row($temp)) $db[]=$row[0];
return $db;
}
$dbConn contiene il risultato della connessione al db, restituita dalla funzione mysql_connect.
Una volta deciso su quale database agire, dobbiamo reperire tutte le tabelle all'interno di esso. Ciò può essere fatto attraverso due metodi equivalenti. Io preferisco la prima perchè simile alla funzione precedente e un po più chiara e lineare
Code:
$tab=array();
$tables=mysql_list_tables($dbname);
while($row=mysql_fetch_row($tables)) $tab[]=$row[0];
return $tab;
}
function getTable2($dbname){
$sql="SHOW TABLES FROM ".$dbname.";";
$result = mysql_query($sql);
if(!$result){ echo "MySQL Error: ".mysql_error(); exit; }
$tab=array();
while($row=mysql_fetch_row($result)) $tab[]=$row[0];
mysql_free_result($result);
}
$dbname contiene il nome di un databse contenuto nel DBMS.
Infine, per ogni tabella, dobbiamo conoscere la struttura e salvare tutti i dati contenuti
Code:
$query=""
...
$res=mysql_query("DESCRIBE ".$dbname.".".$tab[$i]);
while($row=mysql_fetch_assoc($res)){
$query.="t`".$row["Field"]."` ".$row["Type"];
if($row["Null"]!="YES") $query.=" NOT NULL";
if($row["Default"]!="") $query.=" DEFAULT '".$row["Default"]."'";
if($row["Extra"]) $query.=" ".strtolower($row["Extra"]);
if($row["Key"]=="PRI") $tmp="tPRIMARY KEY(".$row["Field"].")n";
$query.=",n";
$field[]=$row["Field"];
}
...
$res=mysql_query("SELECT * FROM ". $dbname.".".$tab[$i]);
while($row=mysql_fetch_assoc($res)){
...
//salvo i dati in $query
...
}
...
return $query;
}
I paramentri di questa funzione sono $tab, che è un array con i nomi delle tabelle contenuti in $dbname. La prima query ("DESCRIBE $dbname.$tab[$i]") restituisce la struttura della tabella corrente ($tab[$i]), contenente i campi necessari per creare il dump, per una futura rigenerazione del db. La seconda è una semplice SELECT che mi fa reperire tutti i dati salvati nella tabella.
Il dump di un database è generalmente consigliato farlo periodicamente, o almeno quando si va a modificare il db o si fanno delle prove che non si sa mai quali guai ci portano. Quindi adesso che avete finito di leggere questo articolo vi consiglio di fare subito una copia di backup del vostro database.
Tags
Apache Bash Elastix Firewall Firma digitale Geolocazione Grafica Informatica Internet Java Linux OpenMoko PHP Programmazione Python Reti Ricetta SEO Sicurezza Sistemi Operativi Varie Virtualizzazione VoIPLink ad altri blog:

