Aller au contenu

Petit soucis dans un script.


Messages recommandés

Bonjour à tous,

Je suis en train d'élaborer un script "mysqldump".

J'ai un soucis au niveau du fichier log.

En faite, je demande à mon script de sauvegarder dans un dossier daté un fichier .gzip de toutes les bdd mais aussi une archive pour chaque bdd existantes.

Au niveau du log, j'arrive à obtenir un résultat pour la grosse archive mais quand il s'agit de faire le log pour les autres bdd à l'unité, ça se complique.

Le log m'indique la réussite de sauvegarde de la dernière bdd du dossier mais pas des autres 🙄

Merci par avance pour votre aide.

Le script qui concerne la partie log :

# Récupération de la liste des bases de données existantes.
databases=`$MYSQL -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "($SKIPDATABASES)"`

# Sauvegarde des bases de données existantes en .sql dans des archives .gzip dans le dossier créé
for db in $databases; do
echo $db
$MYSQLDUMP --force --opt -h$MYSQL_HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD --skip-lock-tables --events --databases $db | $GZIP --stdout --best > "$BACKUP_DIR/$DATE/$db.sql.gz"
done

# Sauvegarde des bases de données existantes dans un fichier .sql et dans une seule archive .gzip dans le dossier créé
for db in $databases; do
echo $db
$MYSQLDUMP --force --opt -h$MYSQL_HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD --all-databases | $GZIP --stdout --best > "$BACKUP_DIR/$DATE/bdd_complete.sql.gz"
done

# Écrire dans le fichier log
echo "Opération terminée" >> $LOGFILE
echo "Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '$BACKUP_DIR/$DATE'" >> $LOGFILE
echo "Sauvegarde réussie de '$db.sql.gz' dans le dossier '$BACKUP_DIR/$DATE'" >> $LOGFILE

Et le résultat dans le fichier log :

----------------------
08/10/2018 à 22:35:25
----------------------
Opération terminée
Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '/xxxxxx/xxxxx/sql/08.10.2018_2235'
Sauvegarde réussie de 'phpmyadmin.sql.gz' dans le dossier '/xxxxxx/xxxxx/sql/08.10.2018_2235'

Sauf qu'entre les deux, il manque quelques lignes 😤

Modifié par InfoYANN
Lien vers le commentaire
Partager sur d’autres sites

# Sauvegarde des bases de données existantes en .sql dans des archives .gzip dans le dossier créé

for db in $databases; do

echo $db

$MYSQLDUMP --force --opt -h$MYSQL_HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD --skip-lock-tables --events --databases $db | $GZIP --stdout --best > "$BACKUP_DIR/$DATE/$db.sql.gz"

echo "Sauvegarde réussie de '$db.sql.gz' dans le dossier '$BACKUP_DIR/$DATE'" >> $LOGFILE

done

 

# Sauvegarde des bases de données existantes dans un fichier .sql et dans une seule archive .gzip dans le dossier créé

for db in $databases; do

echo $db

$MYSQLDUMP --force --opt -h$MYSQL_HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD --all-databases | $GZIP --stdout --best > "$BACKUP_DIR/$DATE/bdd_complete.sql.gz"

echo "Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '$BACKUP_DIR/$DATE'" >> $LOGFILE

done

 

Désolé pour la mise en forme, mais sur iPhone on a pas l’éditeur complet, sa te montre néanmoins ce qu’il faut faire 😉

Lien vers le commentaire
Partager sur d’autres sites

J'ai testé vite fait ta modification et voilà ce qui va et ce qui ne va pas.

  • Le fichier LOG se créer bien avec le contenu des bdd manquantes sauf qu'il n'est plus lisible sur  FileStation via l'éditeur de texte. Quand on télécharge ce fichier log, on constate qu'il contient le signe _ à la fin de l'extension sauf que ce signe n'apparait pas sur FileStation.
  • La bdd complète ne se sauvegarde plus et un second fichier log vide se créer juste avec la date et l'heure.

 

Lien vers le commentaire
Partager sur d’autres sites

Si j'ai copié et remit en forme. Pourquoi ?

 

J'ai essayé ça en attendant et ça fonctionne mais pas complètement dans le log ! Je précise que c'est sur mon script de base et pas ta modif.

# Écrire dans le fichier log
for db in $databases; do
echo $db
echo "Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '$BACKUP_DIR/$DATE'" >> $LOGFILE
echo "Sauvegarde réussie de '$db.sql.gz' dans le dossier '$BACKUP_DIR/$DATE'" >> $LOGFILE
done

Le résultat :

Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '/xxxxxxx/xxxx/sql/09.10.2018_1105'
Sauvegarde réussie de '1111111.sql.gz' dans le dossier '/xxxxxxx/xxxx/sql/09.10.2018_1105'
Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '/xxxxxxxx/xxxxx/sql/09.10.2018_1105'
Sauvegarde réussie de '22222222.sql.gz' dans le dossier '/xxxxxxxx/xxxxx/sql/09.10.2018_1105'
Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '/xxxxxxxx/xxxxx/sql/09.10.2018_1105'
Sauvegarde réussie de '333333.sql.gz' dans le dossier '/xxxxxx/xxxxx/sql/09.10.2018_1105'
Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '/xxxxxxxx/xxxxx/sql/09.10.2018_1105'
Sauvegarde réussie de '444444444.sql.gz' dans le dossier '/xxxxxxxx/xxxxx/sql/09.10.2018_1105'
Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '/xxxxxxxx/xxxxx/sql/09.10.2018_1105'
Sauvegarde réussie de '555555.sql.gz' dans le dossier '/xxxxxxx/xxxxx/sql/09.10.2018_1105'
Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '/xxxxxxx/xxxxx/sql/09.10.2018_1105'
Sauvegarde réussie de '66666666.sql.gz' dans le dossier '/xxxxxx/xxxxx/sql/09.10.2018_1105'

 

Modifié par InfoYANN
Lien vers le commentaire
Partager sur d’autres sites

# Récupération de la liste des bases de données existantes.
databases=`$MYSQL -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "($SKIPDATABASES)"`

# Sauvegarde des bases de données existantes en .sql dans des archives .gzip dans le dossier créé
for db in $databases
do
	echo $db
	$MYSQLDUMP --force --opt -h$MYSQL_HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD --skip-lock-tables --events --databases $db | $GZIP --stdout --best > "$BACKUP_DIR/$DATE/$db.sql.gz"
	echo "Sauvegarde réussie de '$db.sql.gz' dans le dossier '$BACKUP_DIR/$DATE'" >> $LOGFILE
done

# Sauvegarde des bases de données existantes dans un fichier .sql et dans une seule archive .gzip dans le dossier créé
$MYSQLDUMP --force --opt -h$MYSQL_HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD --all-databases | $GZIP --stdout --best > "$BACKUP_DIR/$DATE/bdd_complete.sql.gz"
echo "Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '$BACKUP_DIR/$DATE'" >> $LOGFILE

# Écrire dans le fichier log
echo "Opération terminée" >> $LOGFILE

 

Modifié par lordtaki
Lien vers le commentaire
Partager sur d’autres sites

Ta modif fonctionne parfaitement lordtaki 😉

Je vais analyser les modifs que tu as fait et surtout essayer de les comprendre. Mais si tu as deux minutes pour me donner une petite explication, ça serait avec joie.

Merci encore à vous deux pour l'aide apportée.

Lien vers le commentaire
Partager sur d’autres sites

Le script original :

Citation

for db in $databases; do
echo $db
$MYSQLDUMP --force --opt -h$MYSQL_HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD --skip-lock-tables --events --databases $db | $GZIP --stdout --best > "$BACKUP_DIR/$DATE/$db.sql.gz"
done

=> boucle 'for' qui va lancer mysqldump pour chaque valeur de la variable 'databases' (db1, db2, db3)

Citation

for db in $databases; do
echo $db
$MYSQLDUMP --force --opt -h$MYSQL_HOST --user=$MYSQL_USER -p$MYSQL_PASSWORD --all-databases | $GZIP --stdout --best > "$BACKUP_DIR/$DATE/bdd_complete.sql.gz"
done

=> boucle 'for' qui va lancer le mysqldump global (all-databases) pour chaque valeur de la variable 'databases' (db1, db2, db3)

=> premier problème, on lance x fois le dump global alors qu'une fois suffit, cette commande n'a pas besoin d'être dans une boucle 'for'

Citation

echo "Opération terminée" >> $LOGFILE
echo "Sauvegarde réussie de 'bdd_complete.sql.gz' dans le dossier '$BACKUP_DIR/$DATE'" >> $LOGFILE
echo "Sauvegarde réussie de '$db.sql.gz' dans le dossier '$BACKUP_DIR/$DATE'" >> $LOGFILE

=> exécution séquentielle de 3 'echo', ^db doit être initialisée à la dernière valeur traitée lors de la 2e boucle 'for'

Pour corriger:

- réintégration du 'echo' avec la variable $db dans la première boucle 'for' (qui traite chaque db)

- suppression de la boucle for pour le mysqldump car on doit le lancer une fois

Lien vers le commentaire
Partager sur d’autres sites

En même temps, c'est pas mon domaine donc j'aurais eu du mal à trouver ce soucis.

D'ailleurs, j'en ai un autre maintenant. C'est les anciens dossiers et fichiers qui ne se suppriment pas dans le temps 😞

 

Si je peux encore abuser de vous deux 🙄

# Nombre de jours avant que les premières sauvegardes soient effacées
RETENTION=1

# Suppression des anciennes sauvegardes après X jours
find $BACKUP_DIR/* -mtime +$RETENTION -delete

 

Lien vers le commentaire
Partager sur d’autres sites

Pas besoin du * après BACKUP_DIR pour ton find.

Par défaut c'est récursif (sauf si on utilise les options max|mindepth).

 

Ensuite, je conseille d'utiliser l'option '-type' (f pour fichier, d pour directory) en conjonction de l'option '-name' ou '-iname' pour être certain de n'effacer que ce qui doit l'être.

Enfin, sur mon DS413 '-delete' n'est pas disponible, je dois utiliser "-exec rm {} \;" (les fichiers trouvés par find sont passés en argument à la commande rm).

 

Avant de tester la nouvelle commande find, toujours utiliser '-ls' à la place de la commande qui supprime. Accessoirement, prendre l'habitude de protéger sa variable avec {}.

Citation

find ${BACKUP_DIR} -type f -name "*.sql.gz" -mtime +${RETENTION} -ls

 

Lien vers le commentaire
Partager sur d’autres sites

Merci pour ton aide 🙂

Mon but étant de supprimer les anciens dossiers datés au moment d'une sauvegarde ou se trouvent les bdd et si j'ai bien compris tes explications, ma commande devrait donc être :

find $BACKUP_DIR/ -type d -name "&DATE" -mtime +$RETENTION -exec rm {} \;

C'est exact stp ?

Sauf que pour tester, je devrais plutôt faire ça :

find $BACKUP_DIR/ -type d -name "&DATE" -mtime +$RETENTION ls

Je comprend pas le "ls" dans le cas présent. N'est-ce pas une commande qui permet de lister un répertoire en SSH ? Que va-t-elle faire dans cette commande stp.

Mes recherches ont  été infructueuses sur le sujet.

Modifié par InfoYANN
Lien vers le commentaire
Partager sur d’autres sites

Pour l'option -name, il faut renseigner le nom complet ou une expression régulière qui correspond au nommage du répertoire DATE, pas la valeur de la variable $DATE qui, en plus, est dans ton script la variable du jour (enfin j'imagine).

Ensuite, rm ne fonctionnera pas sur un répertoire. rmdir fonctionne mais pour un répertoire vide.

Puisque tu as un répertoire par date et des fichiers par date dans le dit répertoire, généralement ce que je conseille est de:

  • supprimer d'abord les fichiers -type f -name "*.sql.gz" -mtime +$RETENTION -exec rm {} \;
  • supprimer ensuite le répertoire avec rmdir (on est certain que si le répertoire est supprimé c'est qu'il est vide) -type d -name "tonpatterndedate" -mtime +$RETENTION -exec rmdir {} \;

Sinon bourrin et confiant, tu fais rm -rf sur le répertoire -type d -name "tonpatterndedate" -mtime +$RETENTION -exec rm -rf {} \;

 

Lien vers le commentaire
Partager sur d’autres sites

Je ne suis pas bourrin et pas confiant quand il s'agit d'un script allant supprimer des données 😂

Merci pour tes explications 😉 Si j'ai tout compris, voilà donc les deux lignes dans mon code. Tu confirmes que c'est logiquement bon stp ?

# Suppression des fichiers .sql.gz après X jours
find $BACKUP_DIR/ -type f -name "*.sql.gz" -mtime +$RETENTION -exec rm {} \;

# Suppression des dossiers vides
find $BACKUP_DIR/ -type d -name "&DATE" -mtime +$RETENTION -exec rmdir {} \;

 

Modifié par InfoYANN
Lien vers le commentaire
Partager sur d’autres sites

Voici à quoi correspond &DATE

# Configuration du nom du dossier de sauvegarde (DD.MM.YYYY_HHMM dans le script)
 

DATE=$(date +"%d.%m.%Y_%H%M")

En gros, quand ça sauvegarde, ça créer un dossier nommé avec la date et l'heure au moment de la sauvegarde (dernier en date) : "10.10.2018_1300"

Donc dossier 10.10.2018_1330

Dedans, on trouve ces bdd sauvegardées :

bdd_complete.sql.gz

xxxxx.sql.gz

yyyyy.sql.gz

zzzzzz.sql.gz

 

Modifié par InfoYANN
Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.