picture picture
juin 12, 2005 MySQL, PHP 56 Commentaires

Script PHP de sauvegarde automatique des bases de données

… avec auto-effacement des sauvegardes de plus de 7 jours love

Ce script me permet une sauvegarde quotidienne de mes bases directement sur le FTP.
Un fichier .sql est créé et stocké automatiquement tous les soirs, auto-effaçable au bout d’une semaine.
Je complète ce dispositif par une sauvegarde hebdomadaire de l’ensemble des fichiers du serveur: rien n’est trop sà»r pour ces petites choses, un plantage de serveur ou un hack sont si vite arrivés … :C

Le script :

<?php
// création d’une fonction comportant les identifiants de connexion au FTP :

function mysql_structure() {
$host = ‘mon_serveur’;
$user = ‘mon_login’;
$pass = ‘mot_de_passe’;
$base = ‘nom_de_la_base’;

// création d’un fichier affichant en boucle le contenu des tuples de la base :

mysql_connect($host, $user, $pass);
mysql_select_db($base);
$tables = mysql_list_tables($base);
while ($donnees = mysql_fetch_array($tables))
{
$table = $donnees[0];
$res = mysql_query("SHOW CREATE TABLE $table");
if ($res)
{
$insertions = "";
$tableau = mysql_fetch_array($res);
$tableau[1] .= ";";
$dumpsql[] = str_replace(" ", "", $tableau[1]);
$req_table = mysql_query("SELECT * FROM $table");
$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-1; $i++)
{
$insertions .= "’" . mysql_real_escape_string($ligne[$i]) . "’, ";
}
$insertions = substr($insertions, 0, -2);
$insertions .= "); ";
}
if ($insertions != "")
{
$dumpsql[] = $insertions;
}
}
}
return implode("
", $dumpsql);
}

// 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éé 7 jours plus tot)
$time_old = getdate(mktime()-(7*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";
unlink($file_old);
?>

Derniere étape : utilisation des services gratuits de WEBCRON pour lancer ce script tous les jours.

Ce site génial (et gratuit) vous permet de déclancher à distance, et à heures fixes, votre fichier dump.php …

Mode d’emploi très intuitif, vous commencez par créer un compte qui vous permettra de lancer 6 scripts pour 6 bases des données MySQL (si vous en avez plus… creez plusieurs comptes !)

Pour lancer, par exemple, tous les soirs à 20h un fichier dump.php stocké dans un dossier « dump », vous aurez ceci :

et encore dans l’interface « mes tâches » :

Vous aurez donc « in fine » dans le dossier « dump » : 7 fichiers de sauvegarde (les 7 derniers jours) + le fichier de script :

Génial, non ?! :))

1 2 3

56 Responses to “Script PHP de sauvegarde automatique des bases de données”

16 Commentaires

  1. webtolosa dit :

    Difficile de faire du PHP sans connaitre le code, fati… L’adaptation est pourtant simple.

  2. fati dit :

    bonjour merci pour ce script ;mais ca il sauvegarde tout la base dans un seul fichier .sql; svp je cherche un script qui sauvegardée chaque table de la base de donnes dans un fichier différent de l’autre et avec son nom si possible bien sur merci d’avance

  3. webtolosa dit :

    Vous avez un petit tuto sur les envois de pièces jointes aux e-mails ici > http://www.webtolosa.com/2010/02/10/envoyer-une-piece-jointe-a-un-mail-en-php/

  4. noftal dit :

    Très intéressant. Savez-vous comment compléter ce tuto pour que le fichier .sql soit automatiquement sauvegardé sur votre disque dur (soit directement, soit par l’intermédiaire de l’envoi d’un mail automatique à votre attention contenant en PJ le fichier .sql) ?

  5. webtolosa dit :

    Bonjour passap
    ne fait pas de copier-coller, souvent les quotes ou apostrophes ne sont pas ascii : remplace manuellement toutes les quotes, puisque tu as une erreur sur la première paire.
    Je ne connais pas l’hôte de Free, peut-être, il me semble que c’est :
    $host = ‘sql.free.fr’;
    Cdt

  6. Transloc610 dit :

    Bonjour

    j’ai copié collé le script

    host j’ai mis : free.fr ou ‘free.fr’ ou ‘passaps.free.fr’ ou ‘sql.free.fr’
    a chaque fois j’ai :
    Parse error: syntax error, unexpected T_STRING in /mnt/171/sdb/d/a/passaps/dump/dump.php on line 54

    ou fais-je une erreur

    je lance
    http://passaps.free.fr/dump/dump.php

    Mercid e votre aide

  7. lumycaan dit :

    Non, je suis chez LWS (serveur dédié)

  8. webtolosa dit :

    tu es chez OVH ? Free ? ces 2 hébergeurs, pour les mutualisés, n’aiment pas trop qu’on bidouille les paramètres…

  9. lumycaan dit :

    Bonjour,

    J’ai utilisé la 3ème méthode pour augmenter la taille de la mémoire au niveau du serveur en incluant le code ci-dessous dans mon script.

    ini_set(‘memory_limit’,’128M’);

    Le problème c’est que j’ai toujours le même message d’erreur.

    Help!!!!!!

  10. lumycaan dit :

    Bonjour,

    Je viens d’essayer cette méthode:

    ini_set(‘memory_limit’,’128M’);

    Mais le résultat est le même. Toujours le message d’erreur.

  11. webtolosa dit :

    @lumycaan : il te faut augmenter la variable « memory_limit » de PHP sur ton serveur. Tu as toutes les solutions là par exemple : http://www.benjamin-agullana.fr/serveur/augmenter-php-memory_limit.html et tu mets ta limite à 128M

  12. lumycaan dit :

    Autre idée qui me vient à l’esprit. Ne pourrait-on pas modifier le code de façon à ce qu’il ne prenne pas l’intégralité de la base de données d’un coup. Je pourrais faire un 1er dump de mes tables 1 à 200 et un second dump de mes tables 201 à 400. Ce qui ferait que la taille de les sauvegardes serait divisé par 2. Et là, ça fonctionnerait comme avant. Par contre, je ne sais pas comment le faire.

  13. lumycaan dit :

    Bah le soucis c’est qu’elle va encore augmenter en taille car ce n’est que le début…
    Je fais déjà des « épurements » de données tous les jours en automatique.
    Je suis sur un serveur dédié mais je n’y connais rien à ce niveau là. Je ne sais donc pas comment accéder au php.ini.

    Si tu peux me l’expliquer, je suis preneur.

    Merci à toi de tes réponses.

  14. webtolosa dit :

    60 MO pour une base ça commence à faire lourd : tu ne peux pas commencer par l’alléger (créer un script qui supprime toutes les commandes, ou les clients, ou les posts …de plus de 3 ans par exemple ?)

    Sinon tu peux jouer sur ton php.ini en passant la taille des téléchagements à 128MO par exemple (soit directement sur le serveur si tu y a accès, soit avec un htacess par exemple): pas très safe en terme de sécurité, mais c’est la limite des scripts en PHP…

  15. lumycaan dit :

    Bonjour,

    Ce script fonctionnait très bien jusqu’à dernièrement. Mais depuis que ma base a dépassée 60Mo, j’ai le message d’erreur suivant:
    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54815698 bytes) in /var/www/clients…..

    Pouvez-vous m’aider?

    Je vous en remercie par avance.

  16. Mataro dit :

    J’ai cherché ce code depuis quelque jours, la me souri car je vais l’utiliser dans le bref delai et je vous fairai signe si ca bien marché. Be blessed

Commentaire

Name

Mail (ne sera pas publié)

Website

Laisser ces deux champs tels quels :
:D :-) :( :o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: