IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Modif script de sauvegarde de base de donnée [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 139
    Par défaut Modif script de sauvegarde de base de donnée
    Bonjour,

    J'aurai besoin d'un coup de main pour modifier le script ci-dessous. En effet, il fonctionne très bien tel quel mais maintenant que ma base de données est devenue très importante, j'ai un message d'erreur qui apparait lorsque je lance ma sauvegarde.


    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54815698 bytes) in /var/www/clients.....
    Je voudrais pouvoir modifier le code de façon à "tronçonner" ma sauvegarde. Par exemple ne prendre que les 200 premières tables et faire un fichier de sauvegarde, puis prendre les tables 201 à 400, etc...

    Je vous remercie de votre aide car là, je sèche.

    Voici le code utilisé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    function mysql_structure() {
        $host = 'xxx.xxx.xxx.xxx';
        $user = 'xxxxxxxx';
        $pass = 'xxxxxxxx';
        $base = 'xxxxxxxx';
     
        // création d'un fichier affichant en boucle le contenu des tables de la 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("\n", "", $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 .= ");\n";
                }
                if ($insertions != "")
                {
                    $dumpsql[] = $insertions;
                }
            }
        }
        return implode("\r", $dumpsql);
    }
    // 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);

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Pourquoi tu n'utilises pas mysqldump ? C'est fait pour.
    Sinon pour ta solution de départ, il faut écrire ton fichier au fur et à mesure, ligne par ligne au lieu de placer l'intégralité de ta table dans une variable PHP.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 139
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Pourquoi tu n'utilises pas mysqldump ? C'est fait pour.
    Je ne sais pas comment faire. J'ai bien chercher sur différents posts, mais je ne comprends pas les scripts. Mon niveau de PHP est plutôt bas

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Si tu as accès au serveur, il y a un programme mysql "mysqldump" qui produit des sauvegardes.

    Sinon pour ta solution de départ, il faut écrire ton fichier au fur et à mesure, ligne par ligne au lieu de placer l'intégralité de ta table dans une variable PHP.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 139
    Par défaut
    Je suis sur un serveur dédié, mais je ne sais pas comment accéder au programme mysqldump.

    Pour la solution de départ, je ne comprends pas ce que tu veux dire par "écrire mon fichier au fur et à mesure"??

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Regarde les fonctions fopen/fwrite ; l'idée est d'écrire le fichier dans ta boucle de lecture de la base de donnée.

    Pour mysqldump, il doit se trouver dans mysql/bin :
    http://jgrondin.developpez.com/artic...vegarde_MySQL/
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 418
    Par défaut
    Citation Envoyé par lumycaan Voir le message
    Pour la solution de départ, je ne comprends pas ce que tu veux dire par "écrire mon fichier au fur et à mesure"??
    Essaies avec fwrite

    EDIT Bon trop tard...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 139
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Regarde les fonctions fopen/fwrite ; l'idée est d'écrire le fichier dans ta boucle de lecture de la base de donnée.

    Pour mysqldump, il doit se trouver dans mysql/bin :
    http://jgrondin.developpez.com/artic...vegarde_MySQL/
    Voilà, j'ai mis le code ci-dessous dans mon script et j'ai le message d'erreur suivant:

    mysqldump -u monnom -pmonpass --opt matable > sauve.sql
    Parse error: syntax error, unexpected T_STRING in /var/www/cli

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    mysqldump est un programme, pas une fonction, c'est à dire qu'il doit être lancé depuis le serveur.
    tu peux toutefois essayer de le lancer avec php en utilisant system()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system("mysqldump -u monnom -pmonpass --opt matable > sauve.sql");
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 139
    Par défaut
    Voilà le résultat retourné par le script de sauvegarde:

    -- MySQL dump 10.11
    --
    -- Host: mon serveur Database: ma base
    -- ------------------------------------------------------
    -- Server version 5.0.51a-24+lenny3

    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;
    /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
    /*!40103 SET TIME_ZONE='+00:00' */;
    /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
    /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
    /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
    /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

  11. #11
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    tu as évidement fait gaffe à customiser les variables correctement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    system("mysqldump -u $monnom -p$monpass --opt $matable > sauve.sql");
    tu nous montre le ce qui est dans le fichier sauve.sql ? ou ce qui s'est affiché sur la page ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 139
    Par défaut
    Oui, j'ai bien fait attention aux données de connexion.

    Ce que j'ai mis c'est ce qu'il y a de stocké dans le fichier sauve.sql.

  13. #13
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    bizarre. 2 pistes
    • enleve la redirection de flux vers le fichier sauve.sql
    • ajoute --all-databases p'tre qu'il faut préciser la base de donnée.


    pour les options voir: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 139
    Par défaut
    Citation Envoyé par gene69 Voir le message
    bizarre. 2 pistes
    • enleve la redirection de flux vers le fichier sauve.sql
    • ajoute --all-databases p'tre qu'il faut préciser la base de donnée.


    pour les options voir: http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html
    Voici le contenu de la sauvegarde que j'ai en plus en utilisant --all-databases

    CREATE DATABASE /*!32312 IF NOT EXISTS*/ `f4test` /*!40100 DEFAULT CHARACTER SET latin1 */;

    USE `f4test`;

    Sinon, je n'ai pas compris ce que tu veux dire par enleve la redirection de flux vers le fichier sauve.sql

  15. #15
    Membre Expert
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Par défaut
    ">> sauve.sql"

    j'en déduit qu'il faut préciser et la table & le nom de la base de donnée.

    essaie les combinaisons dispo sur le site mysql, je ne peux pas faire les tests pour toi, poste la bonne solution.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 139
    Par défaut
    Je vais essayer des combinaisons, je vous tiens informés.

    Merci encore de votre aide.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 139
    Par défaut
    Voilà, j'ai réussi à faire ce que je voulais. Je suis passé par un système qui me permet de sauvegarder ma base en plusieurs morceaux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sauvegarder une Base de données Oracle 8
    Par benjamin50 dans le forum Administration
    Réponses: 7
    Dernier message: 16/06/2009, 11h36
  2. script de sauvegarde de base de données dans VB.net
    Par bathis_dev dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 07/02/2007, 12h16
  3. Problème de sauvegarde de bases de données
    Par Gwipi dans le forum Administration
    Réponses: 2
    Dernier message: 09/09/2005, 08h30
  4. Sauvegarde des bases de données
    Par dcollart dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 27/07/2005, 06h35
  5. Réponses: 3
    Dernier message: 24/10/2003, 21h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo