Circa un anno fa dovetti creare un sistema di salvataggio di un database MySql, un sistema automatico che giornalmente mi effettuasse il backup del DB.
Creato il sistema, collaudato, ho deciso di condividerlo sul forum di html.it
Siccome non tutti leggono quel forum, vediamo di condividere il sistema anche qui sul blog.
Anzittuto va creata una tabella nel database ed inserito un record:
CREATE TABLE 'backup' ('data_backup' datetime default '0000-00-00 00:00:00')
ENGINE=MyISAM DEFAULT CHARSET=latin1
INSERT INTO `backup` VALUES ('2012-01-26 00:00:00');
Fatto questo, passiamo a creare la pagina che si occupa di effettuare il backup, pagina che chiameremo backup.php
<?php
$db_name = "nome_del_db"; // nome del database
$db_user = "username_db"; // utente database
$db_psw = "password_db"; // password utente database
$to = "<a href="mailto:pippo@miosito.it">pippo@miosito.it</a>"; // indirizzo email a cui viene spedito il backup
$from = "<a href="mailto:do-not-reply@miosito.it">do-not-reply@miosito.it</a>"; // indirizzo email dal quale parte il backup
$dbhost = "localhost"; // indirizzo database
//crea connessione al db
$conn = mysql_connect($dbhost, $db_user, $db_psw);
if (!$conn){
die("Errore: " . mysql_error());
}
mysql_select_db($db_name, $conn);
//verifica se il backup è già stato effettuato nella giornata di oggi
$get_data = "SELECT data_backup FROM backup WHERE data_backup = '" . date("Y-m-d") . "'";
$result = mysql_query($get_data, $conn);
if(mysql_num_rows($result) == 0){ // la data di backup non è uguale a quella corrente
//effettua il backup del database
$backupFile = $db_name . "_" . date("d-m-Y_H-i-s") . '.gz';
$command = "mysqldump --opt -h " . $dbhost . " -u " . $db_user . " -p" . $db_psw . " " . $db_name . " | gzip > backup_files/" . $backupFile . "";
system($command);
require_once 'class.mailer.php';
//invia il backup tramite email
$mail = new PHPMailer(); //defaults to using php "mail()";
$mail->AddAddress($to, '');
$mail->SetFrom($from, '');
$mail->IsHTML(true);
$mail->Subject = "Backup DB: " . $backupFile;
$mail->Body = "In allegato il backup del database " . $db_name . ".<br /><br />Email generata in automatico dal sistema, NON RISPONDERE A QUESTA EMAIL";
$mail->AddAttachment("backup_files/" . $backupFile);
$mail->Send();
//aggiorna la data di backup
$update = "UPDATE backup SET data_backup = '" . date("Y-m-d") . "'";
mysql_query($update, $conn);
}
mysql_close($conn);
//recupera nome e data files backup
$_dir = $_SERVER["DOCUMENT_ROOT"] . "/backup_files/";
$_files = array();
if(is_dir($_dir)){
if($_dh = opendir($_dir)) {
while(false !== ($_file = readdir($_dh))){
if($_file != '.' && $_file != '..'){
$_files[] = array('data' => filemtime($_dir. "/" . $_file), 'file' => $_file);
}
}
closedir($_dh);
rsort($_files);
}
}
##MANUTENZIONE FILES DI BACKUP##
$max_files = 3; //numero files di backup da mantenere costanti sul server
$tot_files = count($_files);
if($tot_files > $max_files){
// i files sul server sono maggiori di quelli consentiti
for($i = $max_files; $i <= $tot_files-1; $i++){
unlink($_dir . $_files[$i]["file"]);
}
}
?>
Cosa fa il codice sopra?
- si connette al database;
- verifica se il backup è già stato effettuato nella giornata odierna;
- se non trova riscontro, effettua il backup e lo salva nella cartella;
- invia il backup tramite email;
- aggiorna la data di backup nel database;
- crea un array dei files di backup presenti sul server;
- rimuove il numero di files eccedenti quello impostato, partendo dai più vecchi
Per l’invio del backup tramite email viene usata la classe PHPMailer
E’ possibile eseguire il file appena creato, o ”manualmente”, vale a dire includendolo in una pagina, oppure tramite un comando di cron jobs (in questo caso è superfluo l’uso del controllo a database, rimovibile).

Chi sia il tizio della foto è noto purtroppo a tutti. Cosa abbia 
