Blog de Portekoi : Programmation et Astuces

Programmation Cobol, Php, Asp, Java et DotNet…

Sauvegarde d’une base Mysql avec ou sans les données

J’ai récemment été confronté à un dilemme : Pouvoir recréer en local ma structure de base de données rapidement afin de lancer des tests unitaires.

Le souci est que certaines tables sont des données « systèmes » alors que d’autres non dont je n’ai nullement besoin.

Par exemple, je n’ai pas besoin des données de ma table « commande », « client » et à l’inverse, j’ai besoin de ma table « produit » etc.

Voici un script qui permet de générer un fichier « .zip » et qui contiendra les X fichiers sql dont vous avez besoin.

Le premier appel permet de ne prendre que les tables sans les données.

Le second appel prendra TOUTES les tables SAUF celles chargées lors du premier appel.

<?php
//domaine.fr/back/
$path = $_SERVER["DOCUMENT_ROOT"] . '/back/';

$table = array(
    "table1",
    "table2",
    "table3"
    );

if($_SERVER['REMOTE_ADDR'] == "127.0.0.1"){
    $server = "localhost";
    $user = "root";
    $pwd = "";
    $db = "base";
}else{
    $server = "localhost";
    $user = "root";
    $pwd = "";
    $db = "production";
}

//Appel n°1
$file[0] = backup_tables($server, $user, $pwd, $db, false, $table

//Appel n°2
$file[1] = backup_tables($server, $user, $pwd, $db, true, array(), $table);

/*
$host, $user, $pass, $name : pour la base de données
$NeedData : besoin des données?
$tables : tables à exporter / array vide => toutes
$tablesNotIn : ne pas exporter celles présentes dans ce tableau
*/

function backup_tables($host, $user, $pass, $name, $NeedData = true, $tables, $tablesNotIn = array())
{
    global $path;
    $link = mysql_connect($host, $user, $pass);
    mysql_select_db($name, $link);

    //Table ou vue?
    $lsttables = array();
    $result = mysql_query('SHOW FULL TABLES');
    while ($row = mysql_fetch_row($result)) {
        $lsttables[$row[0]] = $row[1];
    }
   
    // Toutes les tables ?
    if (sizeof($tables) == 0) {
        foreach($lsttables as $key => $val){
            $tables[] = $key;
        }
    } else {
        $tables = is_array($tables) ? $tables : explode(',', $tables);
    }

    $content = "";
    //Pour éviter d'avoir des erreurs de clef étrangères
    $content = "SET foreign_key_checks = 0;";
    $content .= "\n\n";

    foreach($tables as $table) {
        $istable = false;
        //Si table n'est pas vide, qu'elle n'est pas dans liste des tables qu'on ne veut pas et que c'est bien une table
        if (!empty($table) && !in_array($table, $tablesNotIn) && $lsttables[$table] == "BASE TABLE") {

            $result = mysql_query('SELECT * FROM ' . $table);
            if ($result) {
                $num_fields = mysql_num_fields($result);

                $row2 = mysql_fetch_row(mysql_query('SHOW CREATE TABLE ' . $table));

                $tmp = "";
                $tmp .= 'DROP TABLE IF EXISTS ' . $table . ';';

                $tmp .= "\n\n" . $row2[1] . ";\n\n";

                for ($i = 0; $i < $num_fields; $i++) {
                    if ($NeedData) {
                        while ($row = mysql_fetch_row($result)) {
                            $tmp .= 'INSERT INTO ' . $table . ' VALUES(';
                            for($j = 0; $j < $num_fields; $j++) {
                                $row[$j] = addslashes($row[$j]);
                                $row[$j] = preg_replace("/\n/", "\\n", $row[$j]);
                                if (isset($row[$j])) {
                                    $tmp .= '"' . $row[$j] . '"' ;
                                } else {
                                    $tmp .= '""';
                                }
                                if ($j < ($num_fields - 1)) {
                                    $tmp .= ',';
                                }
                            }
                            $tmp .= ");\n";
                        }
                    }
                }
                $tmp .= "\n\n\n";

                $content .=$tmp;
            }
        }
       
    }

    //Assurez-vous d'avoir les droits en écriture !!!
    $file = 'db-backup-' . time() . '-' . (md5(implode(',', $tables))) . '.sql';
    $handle = fopen($path . $file, 'w+');
    fwrite($handle, $content);
    fclose($handle);

    return $file;
}

$filezip = tempnam("tmp", "zip");
$zip = new ZipArchive();
$zip->open($filezip, ZipArchive::OVERWRITE);

for($i=0;$i<sizeof($file);$i++){
    if(file_exists($path.$file[$i])){
        $zip->addFile($file[$i]);
    }else{
        echo "existe pas";
        die();
    }
}

$zip->close();

$ZipName = "back." . time();

header('Content-Type: application/zip; charset=utf-8');
header('Content-Length: ' . filesize($filezip));
header('Content-Disposition: attachment; filename="'.$ZipName.'.zip"');
readfile($filezip);
unlink($filezip);

//On supprime les fichiers
for($i=0;$i<sizeof($file);$i++){
    unlink($file[$i]);
}


?>

Vous aurez aussi besoin du fichier zip.lib.php :
http://www.webtutoriaux.com/tutoriel-69-php-compression-de-fichiers-en-php-avec-zip.html

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *