MySQL Dump séparation des bases plusieurs fichiers

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.

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

ou

selon que tu veuilles avoir le « CREATE DATABASE » compris dedans ou non (dev.mysql.com/doc/refman/5.5/en/ … ormat.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 :

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

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…

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?

Sans les guillemets ?

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

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]

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 « information_schema » et « performance_schema », 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

!/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 "*********************************"