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

Outils MySQL Discussion :

[MySQLdump] Création fichier backup base (.sql) malgré erreur


Sujet :

Outils MySQL

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut [MySQLdump] Création fichier backup base (.sql) malgré erreur
    Bonjour,

    Je suis en train de créer un script de sauvegarde sous linux (CentOS 6) et je récupère le log des possibles erreurs par la variable 2>/home/sauvegarde/logs/mysqldumpErreurBase.log
    Ex : /usr/bin/mysqldump -u root -pxxxxxx BaseMySQL > /home/sauvegarde/BaseMySQL/BaseMySQLj.sql 2>/home/sauvegarde/logs/mysqldumpErreurBase.log
    Ce que je ne comprends pas dans le fonctionnement de mysqldump, c'est que la commande crée une sauvegarde (fichier BaseMySQLj.sq corrompu) malgré une erreur constatée. Je crée cette erreur en indiquant un faux mot de passe ou un mauvais nom de la base de données.
    Ce point me dérange car je veux conserver une sauvegarde valide de la base sur 7 jours.
    Y aurait-il une solution pour que, s'il y a une erreur, le fichier (BaseMySQLj.sq) ne soit pas créé.
    Merci.

    Cordialement,

  2. #2
    Membre averti Avatar de Amélie Ladoque
    Inscrit en
    Novembre 2004
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 250
    Points : 309
    Points
    309
    Par défaut
    Si c'est un script qui fait la sauvegarde, comment pourrait-il y avoir une erreur de mot de passe ou de base ?

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    C'est une façon de simuler une erreur pour obtenir le fichier log et vérifier dans mon script la condition si (if [ "$?" -eq 0 ]).
    J'espère avoir répondu à votre interrogation.
    Maintenant, si vous aviez une idée au problème initial.
    Merci.

    Cordialement,

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut Skwalou.

    Ce que tu demandes concerne plutôt la façon d'écrire un batch windows que MySql.
    Soit une mini base de données mysql que voici :
    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
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE IF NOT EXISTS `test`
    ( `id`   integer unsigned not null auto_increment primary key,
      `val`  varchar(255)     not null
    ) engine=innoDB
      default charset=latin1 collate=latin1_general_ci
      row_format=compressed
    --------------
     
    --------------
    insert into `test` (`val`) values
      ('un'),('deux'),('trois'),('quatre'),('cinq'),('six')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+--------+
    | id | val    |
    +----+--------+
    |  1 | un     |
    |  2 | deux   |
    |  3 | trois  |
    |  4 | quatre |
    |  5 | cinq   |
    |  6 | six    |
    +----+--------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Je désire faire le vidage de cette mini base de données.
    Si le résultat est OK, mon dump sera dans le fichier de nom "dump.sql".
    Si j'ai une erreur, mon résultat (de l'erreur bien sûr) sera dans le fichier de nom "dump.txt".
    C'est l'un ou l'autre mais pas les deux. Voici le batch windows qui réalise cela :
    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
    @echo off
     
    setlocal enableDelayedExpansion
     
    chcp 1252 > nul
     
    set PATH=.;%WAMPSERVER%\bin\mysql\%MYSQL%\bin\;%PATH%
     
    SET FIC=%~nx0
    SET FIC=%FIC:bat=sql%
     
    SET ERR=%~nx0
    SET ERR=%ERR:bat=txt%
     
    if exist %FIC% (del %FIC%)
    if exist %ERR% (del %ERR%)
     
    @echo.
    mysqldump  --databases base  --result-file=%FIC%  --default-character-set=latin1  --set-charset  --log-error %ERR%
     
    if %ERRORLEVEL% EQU 0 (del %ERR%) else (del %FIC%)
     
    @echo.
    pause
    exit
    Soit tout ce passe bien, j'ai le bon utilisateur. J'obtiens le fichier "dump.sql" que voici :
    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
     
    /*!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 latin1 */;
    /*!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 */;
     
    /*!40000 DROP DATABASE IF EXISTS `base`*/;
     
    CREATE DATABASE /*!32312 IF NOT EXISTS*/ `base` /*!40100 DEFAULT CHARACTER SET latin1 COLLATE latin1_general_ci */;
     
    USE `base`;
    /*!40101 SET @saved_cs_client     = @@character_set_client */;
    /*!40101 SET character_set_client = utf8 */;
    CREATE TABLE `test` (
      `id` int(10) unsigned NOT NULL,
      `val` varchar(255) COLLATE latin1_general_ci NOT NULL,
      PRIMARY KEY (`id`)
    );
    /*!40101 SET character_set_client = @saved_cs_client */;
     
    set autocommit=0;
    INSERT INTO `test` VALUES (1,'un');
    INSERT INTO `test` VALUES (2,'deux');
    INSERT INTO `test` VALUES (3,'trois');
    INSERT INTO `test` VALUES (4,'quatre');
    INSERT INTO `test` VALUES (5,'cinq');
    INSERT INTO `test` VALUES (6,'six');
    commit;
     
    /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
    /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
    /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
    /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
    Soit je commets une erreur sur le nom de l'utilisateur et je n'ai pas accès à la base. J'obtiens le fichier "dump.txt" que voici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqldump: Got error: 1045: Accès refusé pour l'utilisateur: 'test'@'@localhost' (mot de passe: OUI) when trying to connect
    J'espère que cela correspond à ta demande !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Bonjour Artemus24,

    Déjà merci pour cette réponse et le temps accordé.
    Précision, c'est un script shell Linux (CentOS 6).
    Ci-dessous une partie du script expliquant ce que je fais et, si je ne me trompe pas, obtient le même résultat que votre solution proposée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /usr/bin/mysqldump -u root -pxxxxxx test > /home/sauvegarde/BaseMySQL/BaseMySQLj.sql 2>/home/sauvegarde/logs/mysqldumpErreurBase.log
    if [ "$?" -eq 0 ]
    then
        /bin/echo -e "La sauvegarde logique (mysqldump) de la  base MySQL s'est terminée correctement le $(date '+%A %d/%m/%y %H:%M')"$'\r' >> /home/sauvegarde/logs/sauvegardej.log
    else
        /bin/echo "Erreur : la sauvegarde logique (mysqldump) de la  base CRM MySQL s'est terminée avec l'erreur :" >> /home/sauvegarde/logs/sauvegardej.log
        /bin/cat /home/sauvegarde/logs/mysqldumpErreurBase.log >> /home/sauvegarde/logs/sauvegardej.log
        /bin/echo -e "le $(date '+%A %d/%m/%y %H:%M')"'\r' >> /home/sauvegarde/logs/sauvegardej.log
        /bin/echo "************************************************************************" >> /home/sauvegarde/logs/sauvegardej.log
        /bin/echo "Supprésion du backup de la base à J générée suite à l'erreur (mysqldump)" >> /home/sauvegarde/logs/sauvegardej.log
        /bin/echo "************************************************************************" >> /home/sauvegarde/logs/sauvegardej.log
        /bin/rm -v /home/sauvegarde/BaseMySQL/BaseMySQLj.sql >> /home/sauvegarde/logs/sauvegardej.log 2>&1
        /bin/echo "" >> /home/sauvegarde/logs/sauvegardej.log
    fi
    Donc, ce que je ne comprends pas, c'est qu'un backup de la base (fichier BaseMySQLj.sql) soit créé malgré une erreur.
    Dans ma compréhension, si une erreur existe dans les premières étapes à la création du backup, l'authentification (user, password) ou dans le nom de la base, aucun fichier ne devrait être créé.
    N'étant pas un spécialiste de mysqldump, je pensais ne pas utiliser les bonnes options pour qu'aucune base ne soit créée quand il y a une erreur et ne pas devoir la supprimer.
    C'est pour cela que je demandais l'avis de personnes plus expérimentés.
    Si vous ne deviez ne pas avoir d'avis supplémentaire, je vous remercie.

    Cordialement,

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 379
    Points : 19 060
    Points
    19 060
    Par défaut
    Salut Skwalou.

    Vous avez dû le comprendre, je travaille sous Windows et non Linux.

    La bonne syntaxe de la commande est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysqldump  --databases base  --result-file=dump.sql  --default-character-set=latin1  --set-charset  --log-error dump.err
    Et je peux vous assurer que s'il existe une quelconque erreur, le vidage de nom "dump.sql" n'est pas créé.

    Inversement, ce n'est pas le cas du fichier "dump.err", qui est créé systématiquement, même à vide.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Backup base SQL server 2005
    Par Axiome dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 28/01/2013, 12h32
  2. Réponses: 2
    Dernier message: 01/11/2010, 21h23
  3. Réponses: 3
    Dernier message: 05/09/2010, 12h30
  4. [MySQL] Enregistrer des noms de fichiers en base sql
    Par Ella68 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/01/2010, 16h59
  5. Réponses: 2
    Dernier message: 04/07/2008, 10h41

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