Cron job -> Dump DB -> Send mail

Fermé
Louis - 21 janv. 2008 à 05:33
 EddyL - 7 oct. 2008 à 09:19
Bonjour,

Mon post est a cheval sur le forum programmation et Webmastering.

J'ai besoin de faire un backup bi-quotidien de mes bases de donne'es. Je pense avoir trouve' comment faire des Cronjob sous windows (task schedule) et il semblerait qu'il y ai moyen de faire des backup de base de donne'es en PHP.

Donc je Cronjob une script php qui backup ma DB et qui l'envoie par mail. Eventuellement un gzip ? Mais je sais pas si je pourrais faire ca en php.

Mais est ce que c'est efficace comme moyen? Y a rien de plus rapide/sur/facile ? Il n'y aurait pas des programmes tout fait?

J'attends de vous des commentaires sur cette facon de faire ou des astuces. N'hesitez pas a me dire tout ce qui vous passe par la tete sur c'est en rapport avec le sujet (☆^_^)

Rui
A voir également:

2 réponses

Bon alors voila la suite des evenements:

J'ai reussi a creer une fonction qui copie des bouts* de ma base de donne'es et qui me les envoie sur mon mail en attachment. J'ai par contre deux problemes:

1* Je dis des bouts parce que j'utilise la requete "SELECT * INTO OUTFILE '$backupFile' FROM $table_name". Moi je voudrais pouvoir copier dans le ficher l'ensemble de la base de donne'es et non pas une table a la fois (ici $table_name).

2* Quand j'ouvre le fichier sql que j'ai cre'e', prenons "ma_table_2008-01-21.sql" ca ressemble pas exactement a ce que je voudrais. Okay j'ai tous les enregistrements dedans mais a vu de nez ils sont separe's par des espaces et des tabulations... alors je me pose la uqestion du "est ce que j'arriverais a utiliser ca facilement si mes bases me laches". Je voudrais que dans le fichier il est ait aussi la structure de la table et les commande SQL, un peu comme le fichier qui sort quand on fait un EXPORT en SQL avec STRUCTURE et DATA dans un fichier depuis phpMyAdmin.

Pour le CronJob j'ai pas encore essaye' mais je pense que ca ne devrait pas poser de probleme.

Merci d'avance pour vos reponses,

Rui
-1
toujours d'actualité ?
J'ai la solution si besoin...
0
J'ai une solution un peu bancale, qui marche certes, pourle moment.

Quelle est ta solution ?
-1
Moi j'ai un interface d'admin qui me permet de générer ce type de fichier sql, donc il te sera facilement possible de l'adapter pour ton cron job :

page d'interface admin :

l'idée globale de cette page est un formulaire qui reposte sur lui même ainsi suivant les variables passées (dans ton cas les arréter en dur) soit il renvoie ($export=0) un fichier sql de toute la base ou de la table voulue ($tb) (là je parle structure et contenu) ; soit il inclue dans le document (export==1) le code html de la page et le texte du fichier sql (pour une visualisation où un simple copier/coller).

<?php 
if(isset($_GET['action'])){$action=$_GET['action'];}else{$action="form";}
if(isset($_GET['tb'])){$tb=$_GET['tb'];}
if(!isset($_GET['export'])){$export=0;}else{$export=$_GET['export'];} // 0 export dans un fichier; 1 dans le document
if($action=="include" & $export=="0"){
include('includes/dump.inc.php');
}else{?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<HTML>
<HEAD>
<TITLE></TITLE>
<META NAME="Generator" CONTENT="TextPad 4.6">
<META NAME="Author" CONTENT="?">
<META NAME="Keywords" CONTENT="?">
<META NAME="Description" CONTENT="?">
<style type="text/css" media="screen">@import "tabs.css";</style>
<style type="text/css" media="screen">@import "basic.css";</style>
<SCRIPT SRC="gfbulle.js" LANGUAGE ="javascript"></SCRIPT>
</HEAD>

<BODY BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#FF0000" VLINK="#800000" ALINK="#FF00FF" BACKGROUND="?">
    <div class="conteneur">
        <div class="contenu">
        <div id="header">
		<ul id="primary">
		<li><a href="comptes.php">Comptes</a></li>
		<li><a href="stations.php">Stations</a></li>
                <li><a href="filtres.php">Filtres d'export</a></li>  
		<li><a href="renommage.php">Filtres de renommage</a></li>
                <li><a href="transferts.php">Type de transfert</a></li>
                <li><span>Sauvegarde</span></li> 
		</ul>
		</div>
			<div id="main">
				<div id="contents">
<!-- _______________________________________________________________________________________________________ -->
<?php
if($action=="include" & $export=="1"){
include('includes/dump.inc.php');
}else{?>
<form name="dumpform" action="" method="get">
<input name="action" type="hidden" value="include">
<select name="tb">
  <option value="0">Toutes les tables</option>
  <option value="comptes">Les comptes client</option>
  <option value="filtres_export">Les filtres d'export</option>
  <option value="transferts">Les types de transfert</option>
  <option value="stations">Les stations météo</option>
</select>
<br><br>
<label onclick="document.getElementById('export1').checked=true;"><input type="radio" name="export" id="export1" value="0" checked>dans un fichier externe</label>
<label onclick="document.getElementById('export2').checked=true;"><input type="radio" name="export" id="export2" value="1">dans la même page</label>
	    <input type="submit" name="Submit" value="Exporter">
</form>
<?php } ?>
<!-- _______________________________________________________________________________________________________ -->
				</div>
			</div>
			<div id="footer">
				<div id="copyright">
					<a href="http://www.promete.fr" target="_new">&copy; Edouard LOISEAU promete.fr</a>
				</div>
			</div>
		</div>
	</div>
</BODY>
</HTML>
<?php } ?>



et voici le code du fichier dump.inc.php :

c'est lui qui fait le gros du boulot :

il n'est pas de moi, se référer et conserver le copyright, merci.

<?php

// ------------------------------------------------------------------------- //
// Sauvegarde MYSQL 'structure' et 'data'                                    //
// ------------------------------------------------------------------------- //
// Auteur: Olivier Fabre                                                     //
// Email:  sub01@wanadoo.fr                                                  //
// Web:                                                                      //
// ------------------------------------------------------------------------- //

/// File name : dump.php
/// DUMPING d'une DATABASE - STRUCTURE et DATA
/// Script PHP realisé par Olivier FABRE
/// Dumping de la database : dump.php
/// Dumping possible d'une seule table :
/// dump.php?tb=xxx ou xxx est le nom de la table

/*
//////////////////
$host   = "localhost";        /// NOM DU SERVEUR SQL
$user   = "login";        /// LOGIN
$pass   = "pass";        /// PASS
$sql_base     = "base";        /// NOM DE LA DATABASE
///////////////////
*/
include('../includes/connexion.inc.php');

@set_time_limit(600);

@mysql_connect($sql_serveur,$sql_login,$sql_password)
    or die("Impossible de se connecter - Pb sur le 'Hostname' ou sur le 'User' ".
           "ou sur le 'Password'");

@mysql_select_db("$sql_base")
    or die("Impossible de se connecter - Pb sur le 'Nom de la Data Base'");

if ($export==0) {
if (isset($tb)& $tb!=="0") { header("Content-disposition: filename=$tb.sql"); }
else { header("Content-disposition: filename=$sql_base.sql"); }

header("Content-type: application/octetstream");
header("Pragma: no-cache");
header("Expires: 0");
}

function get_table_def($sql_base, $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($sql_base, "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($sql_base, "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($sql_base, $table, $handler)
{
    $result = mysql_db_query($sql_base, "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";
}

$crlf="\n";

$strTableStructure      = "Table structure for table";

$strDumpingData         = "Dumping data for table";

$tables = mysql_list_tables($sql_base);

$num_tables = @mysql_numrows($tables);

$i = 0;

while($i < $num_tables)
{ 
    $table = mysql_tablename($tables, $i);
    if (isset($tb)& $tb!=="0") {
        if ($table == $tb) {
            print $crlf;
            print "# --------------------------------------------------------$crlf";
            print "#$crlf";
            print "# $strTableStructure '$table'$crlf";
            print "#$crlf";
            print $crlf;

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

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

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

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

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

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

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

    $i++;
}

mysql_close();

?> 



Je suis la conversation si jamais tu as des difficultés à l'implémenter dans ton projet.

Edouard
0