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