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:
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