Effettuare il backup di un database è un compito molto importante che va eseguito regolarmente. Di norma si utilizzano applicazioni come phpMyAdmin in grado di gestire un database direttamente dal browser, può capitare, però, che non si dispongano delle credenziali di accesso al database e si abbiano solo i dati di accesso FTP oppure che il cliente per il quale si sta seguendo un determinato progetto non intenda cimentarsi nell’uso di applicazioni che richiedono un impegno eccessivo. In questo post riporteremo uno script in grado di risolvere problemi di questo tipo.
La classe di seguito riportata consente di esportare totalmente o parzialmente (i.e. solo alcune tabelle) un qualunque database in una directory prestabilita. Il file creato sarà poi scaricabile tramite FTP. Spesso i dati di accesso sono reperibili in un file del tipo configurazione.php, access.php o qualcosa di simile e sicuramente esiste una directory con i necessari permessi di lettura e scrittura dove poter inserire il file di backup (cache, temp, ecc).
Ecco il codice:
<?php
/**
* Classe Backup_Database per
* il back up parziale o totale di un database MySQL
* autore D. L. Azana
*/
// Report errori
error_reporting(E_ALL);
/**
* Assegnazione parametri
*/
define(“DB_USER”, ‘admin’);
define(“DB_PASSWORD”, ‘passwd’);
define(“DB_NAME”, ‘nome del database’);
define(“DB_HOST”, ‘localhost’);
define(“OUTPUT_DIR”, ‘cache’);
define(“TABLES”, ‘*’);
/**
* Istanza Backup_Database ed esecuzione backup
*/
$backupDatabase = new Backup_Database(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
$status = $backupDatabase->backupTables(TABLES, OUTPUT_DIR) ? ‘OK’ : ‘KO’;
echo “
risultati backup: “.$status;
/**
* Classe Backup_Database
*/
class Backup_Database {
/**
* Host dove il database alloggia
*/
var $host = ”;
/**
* Username utilizzato per collegarsi al DB
*/
var $username = ”;
/**
* Password utilizzato per collegarsi al DB
*/
var $passwd = ”;
/**
* Database di cui effettuare il backup
*/
var $dbName = ”;
/**
* charset del DB
*/
var $charset = ”;
/**
* Constructor
*/
function Backup_Database($host, $username, $passwd, $dbName, $charset = ‘utf8’)
{
$this->host = $host;
$this->username = $username;
$this->passwd = $passwd;
$this->dbName = $dbName;
$this->charset = $charset;
$this->initializeDatabase();
}
protected function initializeDatabase()
{
$conn = mysql_connect($this->host, $this->username, $this->passwd);
mysql_select_db($this->dbName, $conn);
if (! mysql_set_charset ($this->charset, $conn))
{
mysql_query(‘SET NAMES ‘.$this->charset);
}
}
/**
* Backup l’intero database oppure solo alcune Tabelle
* Utilizzre ‘*’ per effetuae il backup dell’intero database oppure ‘tabella1 tabella2 tabella3… per un backup parziale’
* @param string $tables
*/
public function backupTables($tables = ‘*’, $outputDir = ‘.’)
{
try
{
/**
* Tabelle da esportare
*/
if($tables == ‘*’)
{
$tables = array();
$result = mysql_query(‘SHOW TABLES’);
while($row = mysql_fetch_row($result))
{
$tables[] = $row[0];
}
}
else
{
$tables = is_array($tables) ? $tables : explode(‘,’,$tables);
}
$sql = ‘CREATE DATABASE IF NOT EXISTS ‘.$this->dbName.”;\n\n”;
$sql .= ‘USE ‘.$this->dbName.”;\n\n”;
/**
* Iterazione tabelle
*/
foreach($tables as $table)
{
echo “Back up tabella”.$table;
$result = mysql_query(‘SELECT * FROM ‘.$table);
$numFields = mysql_num_fields($result);
$sql .= ‘DROP TABLE IF EXISTS ‘.$table.’;’;
$row2 = mysql_fetch_row(mysql_query(‘SHOW CREATE TABLE ‘.$table));
$sql.= “\n\n”.$row2[1].”;\n\n”;
for ($i = 0; $i < $numFields; $i++)
{
while($row = mysql_fetch_row($result))
{
$sql .= ‘INSERT INTO ‘.$table.’ VALUES(‘;
for($j=0; $j<$numFields; $j++)
{
$row[$j] = addslashes($row[$j]);
$row[$j] = ereg_replace(“\n”,”\\n”,$row[$j]);
if (isset($row[$j]))
{
$sql .= ‘”‘.$row[$j].'”‘ ;
}
else
{
$sql.= ‘””‘;
}
if ($j < ($numFields-1))
{
$sql .= ‘,’;
}
}
$sql.= “);\n”;
}
}
$sql.=”\n\n\n”;
echo ” OK” . “
“;
}
}
catch (Exception $e)
{
var_dump($e->getMessage());
return false;
}
return $this->saveFile($sql, $outputDir);
}
/**
* Salvare il file SQL
* @param string $sql
*/
protected function saveFile(&$sql, $outputDir = ‘.’)
{
if (!$sql) return false;
try
{
$handle = fopen($outputDir.’/db-backup-‘.$this->dbName.’-‘.date(“Ymd-His”, time()).’.sql’,’w+’);
fwrite($handle, $sql);
fclose($handle);
}
catch (Exception $e)
{
var_dump($e->getMessage());
return false;
}
return true;
}
}
?>
HostingPerte offre il servizio di backup gestito tramite R1Soft Server Backup Manager. R1Soft è un software server che consente la protezione dei dati ed il disaster recovery per i server Linux e workstation che eseguono Microsoft Windows e sistemi operativi Linux.
R1Soft Server Backup Manager protegge i dati del volume del disco utilizzando la sincronizzazione in rete, l’archiviazione point-in-time, istantanee nella memoria su disco-based.