IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

Script de sauvegarde


Sujet :

Shell et commandes POSIX

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 226
    Points : 39
    Points
    39
    Par défaut Script de sauvegarde
    Bonjour,
    je suis entrain de réaliser un script sh qui sauvegarde ma base de donné mysql toute les 15 minute automatiquement via crontab


    mes copie de ma base de donnée sont stocké dans /auto/sql

    voila mon script
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/sh
    cd /auto/sql
    rm *
    sleep 5
    mysqldump -u root account > account.sql
    mysqldump -u root parma > parma.sql
    mysqldump -u root controle > controle.sql
    sleep 5
    cd /auto/
    tar cvjf savemysql.tar.bz sql/ 
    sleep 5
    cd /auto/sql
    rm *.sql
    mon script dans un premier temps sauvegarde au format sql mes trois bases de donné
    ensuite , il fais une archive nommé savemysql.tar.bz et qui contient les trois base de donné sql
    ensuite il supprime tout les fichier avec extension .sql

    seul probleme c'est que l'ancienne sauvegarde est supprimé

    j'aimerai donc pouvoir cree une archive avec un numero
    exemple:
    savemysql1.tar.bz
    savemysql2.tar.bz
    savemysql3.tar.bz
    et toute les conserver

    comment je peux faire ?

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    Tu peux t'inspirer de ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ nb="$(find . -name "savemysql*.tar.bz" -type f|grep -o "[0-9]"|sort -ru|head -1)"
    $ [[ $nb ]] && echo $(( nb+1 )) || echo "1"
    Avec ceci, tu obtiendra toujours le max+1 du nombre {x} de savemysql{x}.tar.bz...
    Il existe toutefois des solutions plus élégantes et poussées comme logrotate par exemple.

    Cordialement,
    Idriss

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 743
    Points
    12 743
    Par défaut
    Bonjour,
    Si tu veux vraiment nommer tes fichiers avec un incrément, dans ce cas, je te conseille de faire comme les rotate logs (exemple):
    savemysql4.tar.bz devient savemysql5.tar.bz
    savemysql3.tar.bz devient savemysql4.tar.bz
    savemysql2.tar.bz devient savemysql3.tar.bz
    etc...
    Puis tu crées directement ton archive sous le nom savemysql1.tar.bz
    L'avantage de faire comme ceci, est que par la suite si on ne veut conserver qu'un nombres précis de fichiers, c'est assez facile à implémenter, puisque l'on sait que la plus vieille archive sera celle avec le plus grand incrément.

    Le bout de code qui fait ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    find . -type f -name 'savemysql*.tar.bz' -printf "%f\n" | sed -e 's/[^0-9]//g' | sort -rn | while read A
    do
    	mv savemysql${A}.tar.bz savemysql$((A+1)).tar.bz
    done
    A rajouter juste avant ta commande tar (il faut être dans le même répertoire que les archives pour que cela fonctionne).
    Puis rajouter le 1 dans le nom de l'archive a ta commande tar.
    Cordialement.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 226
    Points : 39
    Points
    39
    Par défaut
    j'ai un petit probleme
    c'est une bonne idée mais j'ai une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/sh
    cd /auto/sql
    rm *
    sleep 5
    mysqldump -u root account > account.sql
    mysqldump -u root parma > parma.sql
    mysqldump -u root controle > controle.sql
    cd /auto/
    find . -type f -name 'savemysql*.tar.bz' -printf "%f\n" | sed -e 's/[^0-9]//g' | sort -rn | while read A
    do
    	mv savemysql${A}.tar.bz savemysql$((A+1)).tar.bz
    done
    tar cvjf savemysql.tar.bz sql/ 
    sleep 5
    cd /auto/sql
    rm *.sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UserAdminOp@ServBSD:/auto # ./copibdd
    find: -printf: unknown primary or operator

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 743
    Points
    12 743
    Par défaut
    Ok, ton OS est un BSD d'après ton prompt, et comme le find est pratiquement différent sur chaque système, on va faire du standard (on pourrait juste retirer le '-print' mais autant être propre):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    find . -type f -name 'savemysql*.tar.bz' | sed -e 's/^.*[^0-9]\([0-9]\+\).tar.bz/\1/g'| sort -rn | while read A
    do
     mv savemysql${A}.tar.bz savemysql$((A+1)).tar.bz
    done
    Et n'oublie pas de modifier ta commande tar en rajoutant le '1' dans le nom du fichier.

    Une petite explication sur la regex du sed:
    Celle-ci est faite pour ne récupérer vraiment que les chiffres dans le nom du fichier juste avant ".tar.bz", pour ton cas, ce n'est pas utile d'être aussi restrictif, mais c'est plus propre.
    Cordialement.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 226
    Points : 39
    Points
    39
    Par défaut
    je commence a comprendre , merci de tes explication , par contre j'ai encore une erreur
    oui mon systeme est Freebsd 10

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/sh
    cd /auto/sql
    rm *
    sleep 5
    mysqldump -u root account > account.sql
    mysqldump -u root parma > parma.sql
    mysqldump -u root controle > controle.sql
    cd /auto/
    find . -type f -name 'savemysql*.tar.bz' | sed -e 's/^.*[^0-9]\([0-9]\+\).tar.bz/\1/g'| sort -rn | while read A
    do
     mv savemysql${A}.tar.bz savemysql$((A+1)).tar.bz
    done
    tar cvjf savemysql1.tar.bz sql/ 
    sleep 5
    cd /auto/sql
    rm *.sql

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 743
    Points
    12 743
    Par défaut
    Faudrait donner l'erreur car j'ai pas de BSD sous la main et ma boule de cristal est cassée

    Une question bête: est-ce que ton /bin/sh est un vrai sh ou c'est un lien (hard ou symbolique) sur un autre shell compliant sh ?
    Cordialement.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 226
    Points : 39
    Points
    39
    Par défaut
    autant pour moi , je n'avais pas vu , voila l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./copibdd: arithmetic expression: variable conversion error: "A+1"
    alors la bonne question , je n'ai jamais modifier quelque chose de ce coté la

  9. #9
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 743
    Points
    12 743
    Par défaut
    En fait, ton shell ne semble pas supporter la syntaxe $((A+1)), on va donc le faire à l'ancienne (modification en rouge):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    find . -type f -name 'savemysql*.tar.bz' | sed -e 's/^.*[^0-9]\([0-9]\+\).tar.bz/\1/g'| sort -rn | while read A
    do
     B=$(expr $A + 1)
     mv savemysql${A}.tar.bz savemysql${B}.tar.bz
    done
    Cordialement.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 226
    Points : 39
    Points
    39
    Par défaut
    j'ai encore une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    expr: not a decimal number: './savemysql1.tar.bz'
    mv: rename savemysql./savemysql1.tar.bz.tar.bz to savemysql.tar.bz: No such file or directory
    voila le script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/sh
    cd /auto/sql
    rm *
    sleep 5
    mysqldump -u root account > account.sql
    mysqldump -u root parma > parma.sql
    mysqldump -u root controle > controle.sql
    cd /auto/
    find . -type f -name 'savemysql*.tar.bz' | sed -e 's/^.*[^0-9]\([0-9]\+\).tar.bz/\1/g'| sort -rn | while read A
    do
     B=$(expr $A + 1)
     mv savemysql${A}.tar.bz savemysql${B}.tar.bz
    done
    tar cvjf savemysql1.tar.bz sql/ 
    sleep 5
    cd /auto/sql
    rm *.sql

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 286
    Points : 12 743
    Points
    12 743
    Par défaut
    Citation Envoyé par vodkline Voir le message
    j'ai encore une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    expr: not a decimal number: './savemysql1.tar.bz'
    mv: rename savemysql./savemysql1.tar.bz.tar.bz to savemysql.tar.bz: No such file or directory
    En fait, c'est la regex du sed qui ne fonctionne pas à cause du '\+' qui ne doit pas être supporter

    voila le script modifié:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/sh
    cd /auto/sql
    rm *
    sleep 5
    mysqldump -u root account > account.sql
    mysqldump -u root parma > parma.sql
    mysqldump -u root controle > controle.sql
    cd /auto/
    find . -type f -name 'savemysql*.tar.bz' | sed -e 's/^.*[^0-9]\([0-9]*\).tar.bz/\1/g'| sort -rn | while read A
    do
     B=$(expr $A + 1)
     mv savemysql${A}.tar.bz savemysql${B}.tar.bz
    done
    tar cvjf savemysql1.tar.bz sql/ 
    sleep 5
    cd /auto/sql
    rm *.sql
    Cordialement.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    226
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 226
    Points : 39
    Points
    39
    Par défaut
    Sa fonctionne , merci de ton aide
    c'est super , c'est exactement ce que je recherchais

    dernier soucis , que je l'execute manuellement , il fonctionne , par contre pas avec crontab
    avec crontab lors de l'execution du script la taille de chaque base de donnée = 0ko ..

    EDIT : Resolue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #!/bin/sh
     
    #Script sauvegarde
     
    MyUSER=""
    MyPASS=""
    MyHOST="localhost"
     
    MYSQL="/usr/local/bin/mysql"
    MYSQLDUMP="/usr/local/bin/mysqldump"
    GZIP="/usr/bin/gzip"
    SCP="/usr/bin/scp"
    TAIL="/usr/bin/tail"
    AWK="/usr/bin/awk"
    DF="/bin/df"
     
    $MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS account | $GZIP > /var/tmp/mysql_backups/account.gz
    $MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS parma | $GZIP > /var/tmp/mysql_backups/parma.gz
    sleep 5 
    cd /home/sauvegarde/archive
    find . -type f -name 'savemysql*.tar.bz' | sed -e 's/^.*[^0-9]\([0-9]*\).tar.bz/\1/g'| sort -rn | while read A
    do
     B=$(expr $A + 1)
     mv savemysql${A}.tar.bz savemysql${B}.tar.bz
    done
    tar cvjf savemysql1.tar.bz /var/tmp/mysql_backups/ 
    sleep 5
    cd /var/tmp/mysql_backups/
    rm *.gz

Discussions similaires

  1. Script pour sauvegarde OVH
    Par d10g3n dans le forum Linux
    Réponses: 6
    Dernier message: 18/12/2006, 16h09
  2. Shell script de sauvegarde
    Par marza dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 22/11/2006, 22h32
  3. Script de sauvegarde FTP
    Par goldorax113 dans le forum Développement
    Réponses: 5
    Dernier message: 09/11/2006, 11h08
  4. Script de sauvegarde sous REDHAT 7.3
    Par florfilla18 dans le forum Linux
    Réponses: 12
    Dernier message: 22/08/2006, 17h03
  5. erreur sur script de sauvegarde
    Par zouetchou dans le forum Langage
    Réponses: 5
    Dernier message: 08/12/2005, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo