# MySQL Dump séparation des bases plusieurs fichiers

**URL:** <https://www.debian-fr.org/t/mysql-dump-separation-des-bases-plusieurs-fichiers/27409>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 10:47 UTC](https://www.debian-fr.org/t/mysql-dump-separation-des-bases-plusieurs-fichiers/27409 "2016-02-20T22:47:36Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Realpeace](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/r/b4bc9f/32.png) [@Realpeace](https://www.debian-fr.org/u/Realpeace)\
**Post date:** [Février 20, 2016, 10:47 UTC](https://www.debian-fr.org/t/mysql-dump-separation-des-bases-plusieurs-fichiers/27409/1 "2016-02-20T22:47:37Z")

</div>

Bonjour,

Je suis en train de chercher un solution au problème suivant:

J’ai un fichier avec X bases de données( MySQL ) dedans.  
Chaque sauvegarde de base de données commence par “CREATE DATABASE” dans le fichier.

Y a t’il un solution simple avec awk ou vim de faire 1 fichier par base en se servant de “CREATE DATABASE” ?

Merci

NB : Je cherche en parallèle si je trouve je mettrais la réponse.

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 20, 2016, 10:48 UTC](https://www.debian-fr.org/t/mysql-dump-separation-des-bases-plusieurs-fichiers/27409/2 "2016-02-20T22:48:27Z")

</div>

C’est un fichier fait avec mysqldump ? Si oui, pourquoi ne pas prendre chaque base une par une dès le départ ?

```auto

```

ou

```auto

```

selon que tu veuilles avoir le « CREATE DATABASE » compris dedans ou non ([dev.mysql.com/doc/refman/5.5/en/ … ormat.html](http://dev.mysql.com/doc/refman/5.5/en/mysqldump-sql-format.html)).

Sinon, en scriptant un peu, ça doit être faisable. Tu peux utiliser nl(1) pour numéroter les lignes et ainsi trouver les numéros de lignes contenant « CREATE DATABASE ». Basiquement :

```auto

```

Il faut ensuite que tu récupères ces valeurs pour trouver les « tranches » à extraire :

```auto

```

t’affichera tout le texte entre la ligne X et la ligne Y de ton fichier.  
C’est la solution qui me vient à l’idée, mais il y a probablement d’autres manières de faire.  
PS : n’oublie pas de faire des tests…

---

<div class="post-metadata">

**Author:** ![Realpeace](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/r/b4bc9f/32.png) [@Realpeace](https://www.debian-fr.org/u/Realpeace)\
**Post date:** [Février 20, 2016, 10:49 UTC](https://www.debian-fr.org/t/mysql-dump-separation-des-bases-plusieurs-fichiers/27409/3 "2016-02-20T22:49:09Z")

</div>

Merci pour ton aide.

Effectivement j’aurai beaucoup plus intérêt a séparé les bases de données dés la conception du dump. Mais ca n’a pas été le cas… :S

[code]#!/bin/sh

# Declaration des variables

SQLFILE=“server.sql” # Chemin du fichier sql source  
FOLDERDEST="/home/mysql/" # Chemin du dossier de destination des bases de donnees  
DEB=“1” # initialisation variable debut pour le premier traitement  
DATABASE=“asupprimer” # initialisation variable nom de la base de donnees

# Identification des debuts de ligne pour chaque base de donnees

grep -n " Current Database: " $SQLFILE | tr -s “:” | cut -d “:” -f 1,3 \> databases

# Mise en forme du fichier databases

ex -c “:%s/:/” -c “:%s/`/” -c “:%s/`/” -c “:wq” databases

# boucle de traitement, pour la decoupe

while read ligne  
do  
set $(echo $ligne)  
BFIN=$(eval echo $1) #traiement de la prochaine date de debut …  
FIN=$(( $BFIN - 1)) # … a laquel je soustrais 1  
echo "db = " $DATABASE " " "deb = " $DEB " " “fin = " $FIN # Affichage du resultat  
sed -n “$DEB”,”$FIN"d $SQLFILE \> $FOLDERDEST/$DATABASE # Traitement & generation des fichier  
DEB=$(eval echo $1) # initialisation variable debut pour le prochain traitement  
DATABASE=$(eval echo $2) # initialisation variable nom de la base de donnees pour le prochain traitement  
done \< databases

rm $FOLDERDEST/asupprimer databases # suppression des fichiers sans utilite  
echo “Traitement terminee”  
[/code]

Je me suis fais cet petite moulinette pas sure qu’elle soit optimiser…

J’ai quand même un soucis avec la commande sed. Apparement c’est du a la mise en forme de mes variables $DEB et $FIN que ne sont pas prise en compte pour découpé le fichier.

Avez vous une idée?

---

<div class="post-metadata">

**Author:** ![kna](https://www.debian-fr.org/user_avatar/www.debian-fr.org/kna/32/5623_2.png) [@kna](https://www.debian-fr.org/u/kna)\
**Post date:** [Février 20, 2016, 10:49 UTC](https://www.debian-fr.org/t/mysql-dump-separation-des-bases-plusieurs-fichiers/27409/4 "2016-02-20T22:49:12Z")

</div>

Sans les guillemets ?

```auto

```

---

<div class="post-metadata">

**Author:** ![Realpeace](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/r/b4bc9f/32.png) [@Realpeace](https://www.debian-fr.org/u/Realpeace)\
**Post date:** [Février 20, 2016, 10:49 UTC](https://www.debian-fr.org/t/mysql-dump-separation-des-bases-plusieurs-fichiers/27409/5 "2016-02-20T22:49:43Z")

</div>

Il me semble avoir essayé, mais ca n’a pas fonctionné. 😕

---

<div class="post-metadata">

**Author:** ![Realpeace](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/r/b4bc9f/32.png) [@Realpeace](https://www.debian-fr.org/u/Realpeace)\
**Post date:** [Février 20, 2016, 10:50 UTC](https://www.debian-fr.org/t/mysql-dump-separation-des-bases-plusieurs-fichiers/27409/6 "2016-02-20T22:50:02Z")

</div>

En fin de compte j’ai fais la manip manuellement et changer ma méthode de sauvegarde.

[code]#!/bin/sh

# 

echo $$ \> /var/run/backup\_sql.pid

DATE=`date +"%y-%d-%m"`  
DEBIAN\_SQL\_CONF\_FILE="/etc/mysql/debian.cnf"  
SQL\_DUMP\_FILE="/root/server.sql"  
LOGIN="`head -5 $DEBIAN_SQL_CONF_FILE | grep 'user' | tr -s " " | cut -d " " -f 3`“  
PASSWORD=”`head -5 $DEBIAN_SQL_CONF_FILE | grep 'password' | tr -s " " | cut -d " " -f 3`“  
SAVE\_DIR=”/home/mysql"

if [$# -eq 0];then  
LOG\_FILE="/var/log/backup\_sql.log"  
else  
LOG\_FILE=$1  
fi

if [-d $SAVE\_DIR]; then  
rm $SAVE\_DIR/\*.tar.gz  
else mkdir $SAVE\_DIR/  
fi

echo `date +"%y-%m-%d %H:%M:%S"` “Backup started” \>\> $LOG\_FILE

mysqldump -u $LOGIN -p$PASSWORD --all-databases \> $SQL\_DUMP\_FILE  
tar -czf $SAVE\_DIR/serveur.tar.gz $SQL\_DUMP\_FILE &\> /dev/null  
rm $SQL\_DUMP\_FILE

# Sauvegarde individuel des bases de donnees

echo ‘show databases;’ \> /tmp/req  
mysql -u $LOGIN -p$PASSWORD \< /tmp/req \> listdb  
sed -i.BAK ‘1d’ listdb

while read ligne  
do  
echo `date +"%y-%m-%d %H:%M:%S"` “Backup of” $ligne " started" \>\> $LOG\_FILE  
mysqldump -u $LOGIN -p$PASSWORD $ligne \> $SAVE\_DIR/$ligne.sql  
tar -czf $SAVE\_DIR/$ligne.tar.gz $SAVE\_DIR/$ligne.sql &\> /dev/null  
rm $SAVE\_DIR/$ligne.sql  
done \< listdb

rm listdb

echo `date +"%y-%m-%d %H:%M:%S"` “Backup ended” \>\> $LOG\_FILE  
[/code]

---

<div class="post-metadata">

**Author:** ![MaxDagoba](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/e47774/32.png) [@MaxDagoba](https://www.debian-fr.org/u/MaxDagoba)\
**Post date:** [Août 31, 2016, 9:40 UTC](https://www.debian-fr.org/t/mysql-dump-separation-des-bases-plusieurs-fichiers/27409/7 "2016-08-31T21:40:13Z")

</div>

Hello!  
J’arrive un peu tard mais sa peu peu être simplifier la vie à d’autres.  
Perso ce que j’utilise pour backup mes bases en bash:

> ```
> DBS="$(mysql --user=root --password=motdepassebaleze! -Bse 'show databases;')"
> for DB in $DBS
> do
> if ["$DB" = "information_schema" -o "$DB" = "performance_schema"]
> then
> echo -e "$jaune""On ne prend pas la base $DB""$normal"
> else
> echo -e "$vert""dump de la base $DB""$normal"
> mysqldump --user=root --password=motdepassebaleze! --databases $DB > $DB.sql
> fi
> done
> 
> ```

En gros on récupère la liste des bases, dans mon exemple j’exclue les bases «&nbsp;information\_schema&nbsp;» et «&nbsp;performance\_schema&nbsp;», et on dump tout sa dans un fichier sql par base.

Après moi c’est pour stocker donc je compresse tout sa dans un dossier avec tar et pigz

> `tar -I pigz -cf $dir_backup/mysql-$DATE.tgz mysql`

Voila en espérant avoir été utile.  
Max

---

<div class="post-metadata">

**Author:** ![hayou](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/h/e0b2c6/32.png) [@hayou](https://www.debian-fr.org/u/hayou)\
**Post date:** [Août 31, 2016, 10:39 UTC](https://www.debian-fr.org/t/mysql-dump-separation-des-bases-plusieurs-fichiers/27409/8 "2016-08-31T22:39:19Z")

</div>

```
!/bin/bash
################################################################
# BACKUP de l'ensemble des BDD de la journée dans un dossier ###
################################################################
DATE=`date +%Y-%m-%d`
HEURE=`date +%Hh%M`
DESTSITE="/usr/Backups"
DESTSQL="/usr/Backups"
SITESCLIENTS="/var/www/"
#### INFORMATION
USER="XXXX"
PASS='X'
MAIL="X@X.X"

#### VERIFICATION de la connexion
LISTEBDD=$( echo 'show databases' | mysql -u$USER -p$PASS)
if [-z "$LISTEBDD"];then
echo "Erreur d'accès ou pas de bases."
echo "Erreur d'accès ou pas de bases." | mail -s "erreur de backup BDD" $MAIL
fi

###### CREATION du dossier a la date du jour
mkdir $DESTSQL/$DATE
chmod 700 $DESTSQL/$DATE

###### Début de la sauvegarde des BDD
echo " ***********************************"
echo "* Début desauvegarde des bases *"
echo " ***********************************"
for SQL in $LISTEBDD
do
  if [$SQL != "information_schema"] && [$SQL != "mysql"] && [$SQL != "Database"]; then
    if [-e $DESTSQL/$DATE/$DATE.$HEURE.$SQL.sql.gz]; then
    #exit
    echo ""
    else
      echo "mysqldump"
      mysqldump -u$USER -p$PASS $SQL | gzip > $DESTSQL/$DATE/$DATE.$HEURE.$SQL.sql.gz
    fi
  fi
done

echo " *********************************"
echo "* Sauvegarde des bases terminée *"
echo " *********************************"
```
