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

Scripts/Batch Discussion :

Dump mysql en batch avec caractère non pris en charge (:) [Batch]


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Dump mysql en batch avec caractère non pris en charge (:)
    Bonjour,

    Voici mon problème, j'ai des serveurs mysql sous windows qui hébergent plusieurs bases de données dont le nom contient le caractère " : "

    J'ai fait un script en batch pour faire un dump des bases de données, chaque base de données est donc sauvegardée sous la forme d'un fichier .sql portant le nom de la base de données (c'est ici que ça pose problème).
    Ensuite mon script efface les fichiers ibdata1, ib_logfile0 et ib_logfile1 (qui ont tendance à devenir très lourds au fil du temps),
    il détruit ensuite les bases de données à l'exception de la base de données "mysql" qui contient les privilèges et il importe les dumps pour recréer les bases de données comme si de rien n'était.
    Le seule objectif étant de réduire la taille des fichiers ibdata1, ib_logfile0 et ib_logfile1.

    Ce script a été testé et fonctionne parfaitement lorsqu'il n'y a pas de caractères non pris en charge par windows dans le nom de la base de données.

    Je cherche donc à modifier mon script afin de:
    1) remplacer le : par un autre caractère (le _ par exemple) dans les fichiers .sql
    2) lors de la re création des bases de données à partir des dumps .sql remettre les noms d'origine et donc remplacer le _ par :


    Si ça peut permettre d'y voir plus clair voici mon script:

    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
    
    REM ici on va faire un dump que l'on nommera nomdelabasededonnées.sql c'est là que le problème se pose, certaines bases contenant le caractère : dans leur nom
    mysql -uroot -pmotdepasseroot -s -N -e "SHOW DATABASES" | for /F "usebackq" %%D in (`findstr /V "information_schema performance_schema"`) do mysqldump %%D -uroot -pmotdepasseroot > E:\mysqlbackups\%%D.sql
    
    REM ici on va renommer 2 des fichiers dump afin d'éviter que les bases correspondantes soient supprimées ensuite
    RENAME E:\mysqlbackups\mysql.sql mysql2.sql
    RENAME E:\mysqlbackups\performance_schema.sql performance_schema2.sql
    
    REM ici on va supprimer les bases de données dont le nom correspond à celui d'un des fichiers dump créés précédemment
    for /R "E:\mysqlbackups\" %%A IN (*.sql) DO (
    mysql -uroot -pmotdepasseroot DROP TABLE IF EXISTS '%%~nA'
    )
    
    REM on stoppe le serveur mysql
    sc stop MySQL55
    taskkill /IM mysqld.exe /F
    
    REM on supprime les fichiers que l'on veut remettre à 0
    DEL /F /Q "D:\ProgramData\MySQL\MySQL Server 5.5\data\ib_logfile0"
    DEL /F /Q "D:\ProgramData\MySQL\MySQL Server 5.5\data\ib_logfile1"
    DEL /F /Q "D:\ProgramData\MySQL\MySQL Server 5.5\data\ibdata1"
    
    REM on démarre le serveur mysql
    sc start MySQL55
    
    REM on crée les bases de données précédemment supprimées
    for /R "E:\mysqlbackups\" %%A IN (*.sql) DO (
    mysql -uroot -pmotdepasseroot -e "CREATE DATABASE IF NOT EXISTS %%~nA"
    )
    
    REM on importe les dumps précédemment créés
    for /R "E:\mysqlbackups\" %%A IN (*.sql) DO (
    mysql -uroot -pmotdepasseroot %%~nA < %%A
    )

    Comme on le voit les dumps sont nommés %%D.sql
    C'est la variable %%D qui pose donc problème puisqu'il me faut remplacer le caractère : dans celle ci par un autre caractère comme le _ mais je coince, j'ai testé différentes solutions sans succès.


    Merci d'avance pour toute aide ou piste qui me sera proposée

  2. #2
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Salut,

    as tu essayer la substitution ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    @echo off&cls
    setlocal enabledelayedexpansion
    
    Set "$Var= toto: ti:ti :tata"
    
    for %%d in (%$var%) do (
      set "$Test=%%d"
      set $Test=!$test::=_!
      echo Valeur transform‚e : [!$test!])
    Sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Valeur transformée : [toto_]
    Valeur transformée : [ti_ti]
    Valeur transformée : [_tata]
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    D'abord merci pour ton aide.
    J'avais testé quelque chose de similaire mais mon code devait contenir une erreur car je n'avais pas réussi à obtenir les noms de sortie espérés.

    J'ai essayé d'intégrer ton code au mien mais là encore je dois avoir une erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    @echo off&cls
    setlocal enabledelayedexpansion
    
    mysql -uroot -pmotdepasseroot -s -N -e "SHOW DATABASES" | for /F "usebackq" %%D in (`findstr /V "information_schema performance_schema"`) do (
      set "$Test=%%D"
      set $Test=!$test::=_!
      echo Valeur transform‚e : [!$test!])
      mysqldump %%D -uroot -pmotdepasseroot > E:\mysqlbackups\!$test!.sql)
    Sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    C:\Users\root\Desktop>(set "$Test=%d"   & set $Test=!$test::=_!   & echo Valeur
    transformée : [!$test!]  )
    Valeur transformée : [!$test!]
    Je sais que l'erreur est entre l'écran et la chaise

  4. #4
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    La variable d'une boucle FOR est sensible à la casse. Tu utilises %%D dans la définition de la variable et %%d dans son utilisation.

    Il te faut donc faire un dur choix :

    Ou %%D ou %%d

    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par sachadee Voir le message
    La variable d'une boucle FOR est sensible à la casse. Tu utilises %%D dans la définition de la variable et %%d dans son utilisation.

    Il te faut donc faire un dur choix :

    Ou %%D ou %%d

    Au temps pour moi j'avais en fait bien testé avec D%% mais en recopiant les portions de codes je n'ai pas corrigé la casse en seconde partie. Ceci dit j'ai le même résultat avec D%% et D%% qu'avec D%% et d%%
    Je me demande si ça ne vient pas des 2 commandes séparées par un |
    Bref je suis au point mort avec ce problème même si j'ai l'impression de toucher du bout du doigt la solution.

  6. #6
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Essaye comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @echo off&cls
    setlocal enabledelayedexpansion
    for /F "delims=" %%D in ('mysql -uroot -pmotdepasseroot -s -N -e "SHOW DATABASES" ^| findstr /V "information_schema performance_schema"') do (
     set "$Test=%%D"
      set $Test=!$test::=_!
      echo Valeur transform‚e : [!$test!])
      mysqldump %%D -uroot -pmotdepasseroot > E:\mysqlbackups\!$test!.sql)
    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    ça à l'air bon , je suis en train de tester tout ça je vais voir ensuite pour importer les bases de données . Un énorme merci. Seule petite erreur: à l'avant dernière ligne il faut enlever la parenthèse de fermeture:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    @echo off&cls
    setlocal enabledelayedexpansion
    for /F "delims=" %%D in ('mysql -uroot -pmotdepasseroot -s -N -e "SHOW DATABASES" ^| findstr /V "information_schema performance_schema"') do (
     set "$Test=%%D"
      set $Test=!$test::=_!
      echo Valeur transform‚e : [!$test!]
      mysqldump %%D -uroot -pmotdepasseroot > E:\mysqlbackups\!$test!.sql)

  8. #8
    Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    J'ai réussi avec ton aide à finaliser mon script, si jamais ça peut aider quelqu'un (pas forcément besoin de renommer les bdd dans votre cas mais histoire de supprimer les ibdata/iblog) voici le script fonctionnel:

    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
    @echo off&cls
    setlocal enabledelayedexpansion
    for /F "delims=" %%D in ('mysql -uroot -pMotDePasseRoot -s -N -e "SHOW DATABASES" ^| findstr /V "information_schema performance_schema"') do (
     set "$Test=%%D"
      set $Test=!$test::=_!
      echo Dump vers [!$test!]
      mysqldump %%D -uroot -pMotDePasseRoot > E:\mysqlbackups\!$test!.sql)
    
    RENAME E:\mysqlbackups\mysql.sql mysql2.sql
    RENAME E:\mysqlbackups\performance_schema.sql performance_schema2.sql
    
    @echo off&cls
    setlocal enabledelayedexpansion
    for /R "E:\mysqlbackups\" %%A IN (*.sql) DO (
     set "$Test=%%~nA"
      set $Test=!$test:_=:!
      echo Drop de la base [!$test!]
      mysql -uroot -pMotDePasseRoot DROP TABLE IF EXISTS '!$test!'
    )
    
    
    sc stop MySQL55
    taskkill /IM mysqld.exe /F
    
    DEL /F /Q "D:\ProgramData\MySQL\MySQL Server 5.5\data\ib_logfile0"
    DEL /F /Q "D:\ProgramData\MySQL\MySQL Server 5.5\data\ib_logfile1"
    DEL /F /Q "D:\ProgramData\MySQL\MySQL Server 5.5\data\ibdata1"
    
    sc start MySQL55
    
    
    @echo off&cls
    setlocal enabledelayedexpansion
    cd "D:\Program Files\MySQL\MySQL Server 5.5\bin"
    for /R "E:\mysqlbackups\" %%A IN (*.sql) DO (
      set "$Test=%%~nA"
      set $Test=!$Test:_=:!
      echo Creation de la base [!$Test!]
      mysql -uroot -pMotDePasseRoot -e "CREATE DATABASE IF NOT EXISTS `!$Test!`"
      echo Importation de la base [!$Test!]
      mysql -uroot -pMotDePasseRoot !$Test! < %%A)

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/10/2008, 12h08
  2. caractère " ' " non pris en compte
    Par flow-bolox dans le forum SQL Procédural
    Réponses: 6
    Dernier message: 13/07/2007, 20h20
  3. [XMLHttpRequest] interface non pris en charge
    Par Kurdran dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 23/03/2006, 09h21
  4. [CSS] style externe non pris en charge
    Par ravNin'- dans le forum Mise en page CSS
    Réponses: 21
    Dernier message: 26/10/2005, 00h22
  5. Réponses: 4
    Dernier message: 01/07/2005, 16h20

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