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