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');