dimanche 14 avril 2013

Sauvegarde SQL dans un fichier text

Ce script crée un fichier txt de toutes votre base de données.  Vous pouvez utiliser ce script pour faire la sauvegarde automatique de vos base de données. Dans mon exemple je vais exécuter ce script une fois par jour et ainsi créé un différents fichier par jour.

Exemple en partant du 14 avril 2009 :

  • bd_2009-04-14.txt
  • bd_2009-04-15.txt
  • bd_2009-04-16.txt
  • bd_2009-04-17.txt
  • (...)
Et mon script va automatiquement supprimer les vieux save de plus de 3 mois.

Voici le script

<?php
/*
* Sauvegarde de la BD dans un fichier .txt
* et suppression de vieux sauvegarde + de 3 mois
*
* fichier a appeler dans un CRON a tout les jours
* ce script fait un fichier de sauvegarde sous le format bd_2009-04-14.txt
* un dump sql qui permet de refaire ne entier la base de données
*/


$repertoire_sav = "/votre/repertoire/de/sauvegarde";
$nom_bd = "Nom de votre BD";

include ("votre/repertoire/connexion.php"); // fichier de connexion PHP



//////// Supprimer vieux save /////////////////////////////////////////////////////
// trouver date d'il y a 3 mois
$date_vieux = mktime(0,0, 0, date('m') - 3, date('j') ,  date('Y'));

$date_vieux_trv = date('Y-m-d',$date_vieux);
$nom_vieux_save = "bd_$date_vieux_trv".".txt";
$vieux_save = "$repertoire_sav/$nom_vieux_save";

if (is_file($vieux_save))
    {
    unlink($vieux_save);
    }
// fin supprimer vieux sauvegarde
///////////////////////////////////////////////////////////////////////////////


// faire sauvegarde
// ouverture du buffer
ob_start();


$table =""; $tb ="";
$date_sauvegarde = date('Y-m-d H:i:s');

$nom_save = "bd_";
$nom_save .= date('Y-m-d');
$nom_save .= ".txt";


$crlf="\n";

$strTableStructure      = "Table structure for table";
$strDumpingData         = "Dumping data for table";

print "# ---- BD: $nom_bd  ------------------------------$crlf";
print "# ---- Date de la sauvegarde : $date_sauvegarde   ----------------$crlf";





$tables = mysql_query("SHOW TABLES FROM YOUR_DATABASE");

$num_tables = @mysql_numrows($tables);

$i = 0;
// boucle toute les tables
while($i < $num_tables)
{
    $table = mysql_tablename($tables, $i);
    if ($tb) {
        if ($table == $tb) {
            print $crlf;
            print "# --------------------------------------------------------$crlf";
            print "#$crlf";
            print "# $strTableStructure '$table'$crlf";
            print "#$crlf";
            print $crlf;

            echo get_table_def($db, $table, $crlf).";$crlf$crlf";

            print "#$crlf";
            print "# $strDumpingData '$table'$crlf";
            print "#$crlf";
            print $crlf;

            get_table_content($db, $table, "my_handler");

            exit ;
        }
    }
    else {
        print $crlf;
        print "# --------------------------------------------------------$crlf";
        print "#$crlf";
        print "# $strTableStructure '$table'$crlf";
        print "#$crlf";
        print $crlf;

        echo get_table_def($db, $table, $crlf).";$crlf$crlf";

        print "#$crlf";
        print "# $strDumpingData '$table'$crlf";
        print "#$crlf";
        print $crlf;

        get_table_content($db, $table, "my_handler");
    }

    $i++;
}


// enregistrer le save
$sauvegarde = ob_get_clean();

// patch bug CURENT_TIMESTAMP
$sauvegarde = str_replace("DEFAULT 'CURRENT_TIMESTAMP'","DEFAULT CURRENT_TIMESTAMP",$sauvegarde);

$nom_fichier = "$repertoire_sav/$nom_save";
$fd = fopen($nom_fichier,"w+");
fwrite ($fd,$sauvegarde);
fclose($fd);




mysql_close();



/*
* Functions
*/
function get_table_def($db, $table, $crlf)
{
    global $drop;

    $schema_create = "";
    if(!empty($drop))
        $schema_create .= "DROP TABLE IF EXISTS $table;$crlf";

    $schema_create .= "CREATE TABLE $table ($crlf";

    $result = mysql_db_query($db, "SHOW FIELDS FROM $table") or mysql_die();
    while($row = mysql_fetch_array($result))
    {
        $schema_create .= "   $row[Field] $row[Type]";

        if(isset($row["Default"])
           && (!empty($row["Default"]) || $row["Default"] == "0"))
            $schema_create .= " DEFAULT '$row[Default]'";
        if($row["Null"] != "YES")
            $schema_create .= " NOT NULL";
        if($row["Extra"] != "")
            $schema_create .= " $row[Extra]";
        $schema_create .= ",$crlf";
    }
    $schema_create = ereg_replace(",".$crlf."$", "", $schema_create);
    $result = mysql_db_query($db, "SHOW KEYS FROM $table") or mysql_die();
    while($row = mysql_fetch_array($result))
    {
        $kname=$row['Key_name'];
        if(($kname != "PRIMARY") && ($row['Non_unique'] == 0))
            $kname="UNIQUE|$kname";
        if(!isset($index[$kname]))
            $index[$kname] = array();
        $index[$kname][] = $row['Column_name'];
    }

    while(list($x, $columns) = @each($index))
    {
        $schema_create .= ",$crlf";
        if($x == "PRIMARY")
            $schema_create .= " PRIMARY KEY (" . implode($columns, ", ") . ")";
        elseif (substr($x,0,6) == "UNIQUE")
            $schema_create .= " UNIQUE ".substr($x,7)." (".implode($columns,", ").")";
        else
            $schema_create .= " KEY $x (" . implode($columns, ", ") . ")";
    }

    $schema_create .= "$crlf)";
    return (stripslashes($schema_create));
}

function get_table_content($db, $table, $handler)
{
    $result = mysql_db_query($db, "SELECT * FROM $table") or mysql_die();
    $i = 0;
    while($row = mysql_fetch_row($result))
    {
        $table_list = "(";

        for($j=0; $j<mysql_num_fields($result);$j++)
            $table_list .= mysql_field_name($result,$j).", ";

        $table_list = substr($table_list,0,-2);
        $table_list .= ")";

        if(isset($GLOBALS["showcolumns"]))
            $schema_insert = "INSERT INTO $table $table_list VALUES (";
        else
            $schema_insert = "INSERT INTO $table VALUES (";

        for($j=0; $j<mysql_num_fields($result);$j++)
        {
            if(!isset($row[$j]))
                $schema_insert .= " NULL,";
            elseif($row[$j] != "")
                $schema_insert .= " '".addslashes($row[$j])."',";
            else
            $schema_insert .= " '',";
        }
        $schema_insert = ereg_replace(",$", "", $schema_insert);
        $schema_insert .= ")";
        $handler(trim($schema_insert));
        $i++;
    }
    return (true);
}

function my_handler($sql_insert)
{
    global $crlf, $asfile;

    echo "$sql_insert;$crlf";
}

?>

Aucun commentaire:

Enregistrer un commentaire