PHP: script che fa il backup di un db e lo invia per mail
27/10/2011Stanchi di fare backup manuali del vostro database attraverso strumenti quali PhpMyAdmin o altri?
Con un semplice script PHP, basta impostare i parametri di configurazione all'inizio del codice, caricarlo sul vostro server e ogni volta che volete un backup lo richiamate via web e riceverete in mail l'sql corrispondente!
Chi ha accesso al crontab del server può inserirlo come esecuzione automatica all'ora desiderata del giorno desiderato.
Ecco il codice con relativi commenti di spiegazione:
// silenziamo notice e warning
error_reporting(E_ALL);
// Configurazione (in corsivo i parametri da personalizzare)
$dbname = 'nome_del_db_da_backuppare';
mysql_connect('localhost', 'nome_utente_db', 'password_utente_db');
mysql_select_db($dbname);
$MailTo = 'mail_a_cui_ricevere_sql';
$from ='mail_mittente';
// fine configurazione
// Intestazioni
$uscita = '
-- SQL Dump
--
-- Generato: '. date('r') .'
-- Versione MySQL: ' . mysql_get_server_info() . '
-- Versione PHP: '. phpversion() .'
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Database: `' . $dbname . '`
--';
// Inizializzo le variabili in cui memorizzare i dati estratti
$dump = $uscita;
$uscita = '';
// Trovo le tabelle
$tabelle = mysql_query("SHOW TABLE STATUS");
$i = 0;
while ($tabella = mysql_fetch_assoc($tabelle)) {
$tabellaName = $tabella['Name'];
$tmp = mysql_query("SHOW CREATE TABLE `$tabellaName`");
// Inserisco istruzione create
$create = mysql_fetch_assoc($tmp);
$uscita .= "\n\n--\n-- Struttura tabella: `$tabellaName`\n--\n\n".$create['Create Table'].' ;';
// Libero risultati
mysql_free_result($tmp);
unset($tmp);
// Inserisco risultati in variabile
$dump .= $uscita;
$uscita = '';
// Righe
$tmp = mysql_query("SHOW COLUMNS FROM `$tabellaName`");
$rows = array();
while ($row = mysql_fetch_assoc($tmp)) {
$rows[] = $row['Field'];
}
// Libero risultati
mysql_free_result($tmp);
unset($tmp, $row);
// Recupero i dati
$tmp = mysql_query("SELECT * FROM `$tabellaName`");
$count = mysql_num_rows($tmp);
if ($count > 0) {
$uscita .= "\n\n--\n-- Dati tabella: `$tabellaName`\n--";
$uscita .= "\nINSERT INTO `$tabellaName` (`".implode('`, `', $rows)."`) VALUES ";
$i = 1;
// Trovo i dati
while ($entry = mysql_fetch_assoc($tmp)) {
// Creao i valori
$uscita .= "\n(";
$tmp2 = array();
foreach ($rows as $row) {
$tmp2[] = "'" . mysql_real_escape_string($entry[$row]) . "'";
}
$uscita .= implode(', ', $tmp2);
$uscita .= $i++ === $count ? ');' : '),';
// Inserisco risultati in variabile
$dump .= $uscita;
$uscita = '';
}
// Libero risultati
mysql_free_result($tmp);
unset($tmp, $tmp2, $i, $count, $entry);
}
// Incremento contatore
$i++;
}
// Invio mail
$MailSubject = "BACKUP DATABASE " . $dbname . ' ' .date('Y-m-d_H-i');
$MailHeader = "From: " . $from . "\nX-Mailer: PHP/\nReply-To:" . $from . "\nReturn-Path:" . $from . "\n";
$MailBody = $dump;
mail($MailTo, $MailSubject, $MailBody, $MailHeader);
echo "
Il backup del database $dbname è stato inviato a $MailTo
";