Cet article fait suite à cet autre article Sauvegarder/Exporter une base de données avec PHP. J'en ai eu besoin ce matin pour faire une sauvegarde d'une base de données mysql d'un site. Seul moyen d'accès que j'avais : l'accès par ftp et le site en safe mode. Pas la peine de préciser que ce script m'a été bien utile !
J'ai fais quelques modifications dans le script, pour éviter de me heurter au timeout (non modifiable en safe mode) :
- un fichier par table, dans un répertoire accessible en écriture. Dans ce cas précis il s'agit du répertoire temp
- enregistrement immédiat de chaque ligne, qui est compressée à la volée par gz
- procédure de reprise en cas de problème, on relance le script après avoir modifié l'appel, $dump = dump(5); pour sauter les 5 premières tables par exemple.
- le $tables = mysql_list_tables($database, $db); m'ayant parfois causé des soucis, je l'ai remplacé par $sql = "SHOW TABLES FROM $database";
function dump($ignore)
{
$server = '*********';
$database = '*********';
$user = '*********';
$password = '*********';
//Connexion à la base
$db = mysql_connect($server, $user, $password) or die(mysql_error());
mysql_select_db($database, $db) or die(mysql_error());
//on récupère la liste des tables de la base de données
//$tables = mysql_list_tables($database, $db) or die(mysql_error());
$sql = 'SHOW TABLES FROM '.$database;
$tables = mysql_query($sql) or die(mysql_error());
// si on ne veut pas récupérer les $ignore premières tables
for ($i=0; $i<$ignore; $i++) ($donnees = mysql_fetch_array($tables));
// aller on boucle sur toutes les tables
while ($donnees = mysql_fetch_array($tables))
{
// on récupère le create table (structure de la table)
$table = $donnees[0];
$sql = 'SHOW CREATE TABLE '.$table;
$res = mysql_query($sql) or die(mysql_error().$sql);
if ($res)
{
$backup_file = '../temp/backup_' . $table . '.sql.gz';
$fp = gzopen($backup_file, 'w');
$tableau = mysql_fetch_array($res);
$tableau[1] .= ";\n";
$insertions = $tableau[1];
gzwrite($fp, $insertions);
$req_table = mysql_query('SELECT * FROM '.$table) or die(mysql_error());
$nbr_champs = mysql_num_fields($req_table);
while ($ligne = mysql_fetch_array($req_table))
{
$insertions = 'INSERT INTO '.$table.' VALUES (';
for ($i=0; $i<$nbr_champs; $i++)
{
$insertions .= '\'' . mysql_real_escape_string($ligne[$i]) . '\', ';
}
$insertions = substr($insertions, 0, -2);
$insertions .= ");\n";
gzwrite($fp, $insertions);
}
} // fin if ($res)
mysql_free_result($res);
gzclose($fp);
}
return true;
}
//appel de la fonction
$dump = dump(0);
Et voilà un script de sauvegarde très rapide. Il suffit d'aller récupérer les fichiers.
Pour ceux qui veulent sauvegarder qu'une seule table dont le nom est connu :
function dump($table)
{
$server = '******';
$database = '******';
$user = '******';
$password = '******';
//Connexion à la base
$db = mysql_connect($server, $user, $password) or die(mysql_error());
mysql_select_db($database, $db) or die(mysql_error());
$sql = 'SHOW CREATE TABLE '.$table;
$res = mysql_query($sql) or die(mysql_error().$sql);
if ($res)
{
$backup_file = '../temp/backup_' . $table . '.sql.gz';
$fp = gzopen($backup_file, 'w');
$tableau = mysql_fetch_array($res);
$tableau[1] .= ";\n";
$insertions = $tableau[1];
gzwrite($fp, $insertions);
$req_table = mysql_query('SELECT * FROM '.$table) or die(mysql_error());
$nbr_champs = mysql_num_fields($req_table);
while ($ligne = mysql_fetch_array($req_table))
{
$insertions = 'INSERT INTO '.$table.' VALUES (';
for ($i=0; $i<$nbr_champs; $i++)
{
$insertions .= '\'' . mysql_real_escape_string($ligne[$i]) . '\', ';
}
$insertions = substr($insertions, 0, -2);
$insertions .= ");\n";
gzwrite($fp, $insertions);
}
} // fin if ($res)
mysql_free_result($res);
gzclose($fp);
return true;
}
//appel de la fonction
$dump = dump('nomdelatable');
