Système de backup [Résolu]

Signaler
-
 omlaly -
Bonjour,

Je suis à la recherche d'un système, que je lancerai en tache CRON tous les jours, qui permet de faire un DUMP de la base de données et de me l'envoyer par mail (sans pièce jointe (pour pas surcharger le serveur de mon adresse e-mail) mais avec toutes les requêtes SQL).

Si vous avez quelque chose, n'hésitez pas...

En attendant vos réponses, je continue mes recherches...

Cordialement

4 réponses

C'est bon, j'ai trouvé.

Cordialement
Bonjour,

J'ai écrit ce code PHP qui, dans la logique, m'envoie un mail avec le fichier SQL en pièce jointe. Il m'envoie le mail SANS la pièce jointe (le fichier SQL). Je vous mets le code PHP et si quelqu'un pourrait m'aider, ce serait sympa.

<?php
     //pour la sauvegarde de la base de données
$host = '*****';  
$user = '*****';
$pass = '*****';
$base = '*****';
     //pour l'envoi par mail
    

     $destinataire='webmaster@site.com';  // l'adresse e-mail de destination
     $nom_expediteur='auteur';  // le nom de l'expéditeur, tel qu'il apparaîtra dans le mail
     $email_expediteur='webmaster@site.com'; // l'email de l'expéditeur, tel qu'il apparaîtra dans le mail
     $email_reply='auteur';  // l'email de réponse tel qu'il apparaîtra dans le mail
     $sujet='Sauvegarde automatique quotidienne de la Base de Données';  // le sujet du mail
     
    $fichierjoint="Sauvegarde_".date("d-n-Y").".sql";
    
     $message_html='<html>
     <head>
     <title>'.$sujet.'</title>
     </head>
     Bonjour, 
En pièce jointe, la dernière sauvegarde de votre base de données
     </html>';

// connexion à la base
mysql_connect($host, $user, $pass);
mysql_select_db($base);


function mysql_structure() {
// on va faire une requête pour rechercher toutes les tables de la bdd concernée
$req_table = "SHOW TABLES";
$result_table = mysql_query($req_table) or die ("Impossible d'exécuter la requête concernant la recherche des tables - ".mysql_error());

// et on va les afficher sous forme de lien
while ($donnees_table = mysql_fetch_array($result_table)) {
$table = $donnees_table[0];
                               
// on va créer une variable pour y mettre le texte concernant l'en-tête de la structure qui sera écrit dans le fichier .txt
@$result .= "-- \n";
$result .= "-- Structure de la table ` ".$table." ` \n";
$result .= "--\n \n";
               
// on va demander la "création" de la table
$req_structure = "SHOW CREATE TABLE $table ";
$result_structure = mysql_query($req_structure) or die ("Impossible de trouver la structure de ". $table .mysql_error());
$donnee_structure = mysql_fetch_array($result_structure);
$structure = $donnee_structure[1] ;
$structure .= "\n \n" ;
$result .= $structure;
               
// on créé une variable pour le titre du contenu de la table
$titre_contenu = "-- \n";
$titre_contenu .= "-- Contenu de la table ` ".$table."` \n";
$titre_contenu .= "--  \n \n";
$result .= $titre_contenu;
               
// on va récupérer le nombre de champs présents dans la table   
$req_champ = "SHOW COLUMNS FROM $table";
$result_champ = mysql_query ($req_champ) or die ("Impossible de trouver les champs de ". $table .mysql_error());
$nbre_champ = mysql_num_rows($result_champ);
// on va rechercher TOUS les enregistrements de la table concernée
$req_tout = "SELECT * FROM $table ";
$result_tout = mysql_query($req_tout) or die ("Impossible de trouver les enregistrements de ". $table .mysql_error());
// on va boucler pour sortir toutes les données
while($donnees_tout = mysql_fetch_array($result_tout)) {
$contenu = "INSERT INTO " . $table . " VALUES (";
$i = 0;
// on va boucler tous les champs
while ( $i < $nbre_champ ) {
// et on affiche les résultats en fonction des champs et dans l'ordre des champs
$contenu .= "'". mysql_real_escape_string($donnees_tout[$i]) ."' ,";
$i++;
}
// on va enlever la dernière virgule
$contenu = substr($contenu,0,-2);
$contenu .= ") ; \n";
$result .= $contenu;
}
$result .= "\n";
}
return $result;
}

// creation d'une fonction file_put_content si le script est en PHP4 :

if(!function_exists('file_put_contents')) {
function file_put_contents($filename, $data, $file_append = false) {
$fp = fopen($filename, (!$file_append ? 'w+' : 'a+'));
if(!$fp) {
trigger_error('file_put_contents ne peut pas écrire dans le fichier.', E_USER_ERROR);
return;
}
fputs($fp, $data);
fclose($fp);
}
}

// création du fichier de dump sur le même niveau que ce fichier dump.php

file_put_contents('sqldump_'.date("d-n-Y").".sql", mysql_structure());

// effacement du fichier precedant (créé 21 jours plus tot)

$time_old = getdate(mktime()-(21*24*3600));
$an = $time_old['year'];
$mois = $time_old['mon'];
$jour = $time_old['mday'];

// formatage des jours à 1 chiffre

for($k=1; $k<10; $k++)
{
if ($jour==$k)
{
$jour='0'.$jour;
}
}

$date_old =$jour.'-'.$mois.'-'.$an;
$file_old = 'sqldump_'.$date_old.".sql";

if (file_exists($file_old)) {
unlink($file_old);
}

echo 'Sauvegarde effectuée
';
?>




<?php //Pour envoyer ce fichier par mail :


     //-----------------------------------------------
     //GENERE LA FRONTIERE DU MAIL 
     //-----------------------------------------------

     $frontiere = '-----=' . md5(uniqid(mt_rand()));

     //-----------------------------------------------
     //HEADERS DU MAIL
     //-----------------------------------------------

     $headers = 'From: "'.$nom_expediteur.'" <'.$email_expediteur.'>'."\n";
     $headers .= 'Return-Path: <'.$email_reply.'>'."\n";
     $headers .= 'MIME-Version: 1.0'."\n";
     $headers .= 'Content-Type: multipart/mixed; boundary="'.$frontiere.'"';


     //-----------------------------------------------
     //MESSAGE HTML
     //-----------------------------------------------
     $message .= '--'.$frontiere."\n";

     $message .= 'Content-Type: text/html; charset="iso-8859-1"'."\n";
     $message .= 'Content-Transfer-Encoding: 8bit'."\n\n";
     $message .= $message_html."\n\n";

     
     //-----------------------------------------------
     //PIECE JOINTE
     //-----------------------------------------------
$message .= '--'.$frontiere."\n";
     $message .= 'Content-Type: text/tab-separated-value; name="'.$fichierjoint.'"'."\n";
     $message .= 'Content-Transfer-Encoding: base64'."\n";
     $message .= 'Content-Disposition:attachement; filename="'.$fichierjoint.'"'."\n\n";

     $message .= chunk_split(base64_encode(file_get_contents('./'.$fichierjoint.'')))."\n";
$message .= '--'.$frontiere.'--'."\n";
     if(mail($destinataire,$sujet,$message,$headers))
     {
          echo 'Le mail a été envoyé';
     }
     else
     {
          echo 'Le mail n\'a pu être envoyé';
     }
?> 


Cordialement
J'ai essayé ce code, le fichier s'enregistre puis se détruit grâce à
unlink
mais le problème reste le même : je n'arrive pas à :
-soit mettre en fichier le fichier SQL
-soit directement écrire l'intégralité des requêtes SQL et pas mettre le fichier en pièce jointe (ce que je préfèrerai pour pas surcharger mes e-mails)

Voici le code PHP :
<?php
// Accéder à la base de données
$host = '*****';  
$user = '*****';
$pass = '*****';
$db= '*****';

// Création de la sauvegarde
system(sprintf('mysqldump --opt -h%s -u%s -p"%s" %s | gzip > %s/nomdufichier'.date("dmY").'.gz',$host,$user,$pass,$db,getenv('DOCUMENT_ROOT')));
echo '+DONE';

$expediteur = "From: "prenom nom""\n"; 
$subject = 'Sauvegarde automatique quotidienne'; // Le titre de l'email
$message = fopen('nomdufichier'.date("dmY").'.gz'); // Le message de l'email
$to = "adresse@site.net"; // Email de l'utilisateur
$headers = "From: "prenom nom"\n"; // Email du webmaster
$headers .= "Content-Type: text/plain; charset="iso-8859-1"";

// Envoi du mail

if (mail($to,$subject,$message,$headers)) {
echo 'Mail envoyé';
unlink('nomdufichier'.date("dmY").'.gz');
}
else {
echo 'Pb lors de l\'envoi du mail';
}
?>


Si vous avez une idée, n'hésitez-pas...
Cordialement
Voici le code qui gère la sauvegarde de la base de données mais pas l'envoi du mail.

Voici le code PHP :
<?php
error_reporting(E_ALL); // Activer le rapport d'erreurs PHP
$db_charset =  "latin1"; /* mettre utf8 ou latin1 */

$db_server = "*****"; // Nom du serveur MySQL.

$db_name ="*****"; // Nom de la base de données.

$db_username = "*****"; // Nom de la base de données.

$db_password= "*****"; // Mot de passe

$cmd_mysql = "mysqldump";

$archive_GZIP = "Nom_Fichier".date("d-m-Y").".gz";

echo "Sauvegarde de la base  $db_name  par mysqldump dans le fichier $archive_GZIP. Il manque plus l'envoi par email.
\n";

$commande  = $cmd_mysql." --host=$db_server --user=$db_username --password=$db_password -C -Q -e --default-character-set=$db_charset  $db_name    | gzip -c > $archive_GZIP ";

$CR_exec = system($commande);

?>


Si quelqu'un a une idée pour m'envoyer le fichier par mail, qu'il n'hésite pas... Ou mieux en format texte (sans pièce jointe), qu'il apporte sa contribution...

Cordialement