Se connecter avec
S'enregistrer | Connectez-vous
Votre question
Résolu

Backup bases de données

Dernière réponse : dans Autres OS
Partagez
Anonyme
14 Septembre 2010 15:31:04

Bonjour,

Tout d'abord, désolé si je ne poste pas au bon endroit.

Je demande votre assistance pour du backup de base de donnée.

Je ne suis pas informaticien, mais pendant mon temps libre, j'essaie d'apprendre certaines choses qui pourraient me servir.

Là, je suis sur mysql sur une plate forme linux.

Ca fait déjà 2 ou 3 fois que suite à une erreur de manipulation, je perds toutes mes bases de données. je dois chaque fois tout recommencer. :/  Je perds donc du temps dans mon apprentissage.

J'essaie donc d'écrire un script que je mettrai dans un cron pour sauvegarder toutes mes tables.

  1. #!/bin/bash
  2.  
  3. BASES_SQL=`mysql -u root -e "show databases"` #On commence par lister les bases de donnees
  4. for i in $BASES_SQL; #on fait un boucle sur le resultat obtenu
  5. do
  6. if ! [ -d /root/$i ]; then #verification de la presence du repertoire et s'il n'existe pas on le cree
  7. mkdir /root/$i
  8. fi
  9. TABLES_SQL=`mysql -u root -e "show tables from $i"` #pour chaque base de donnees, on extrait les tables
  10. for b in $TABLES_SQL;
  11. do
  12. mysqldump -u root $i $b >"/root/$i/$b.sql" #backup les tables individuellement
  13. done
  14. done


Le hic, c'est que la commande show affiche le titre de la colonne et bien que le script fonctionne, j'ai un message d'erreur.

ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Database' at line 1
mysqldump: Couldn't find table: "Tables_in_mysql"
mysqldump: Couldn't find table: "Tables_in_postfix"

J'ai essayé en ajoutant le switch --skip-column-names dans la commande show, mais ça me retourne une erreur sql et ça ne fonctionne plus du tout. :/ 

Toute aide sera la bienvenue.

merci d'avance.

Autres pages sur : backup bases donnees

a b 5 Linux
14 Septembre 2010 15:38:10

Salut,

Tu n'as pas un problème de bases de données.
Tu as des difficultés avec la programmation bash.

Je nous téléportes dans le Monde de Linux.
m
0
l
Anonyme
14 Septembre 2010 15:39:44

merci [:jap]

Je constate que les balises fixed on un peu écraser la mise en forme et que du coup mes commentaires s'étendent sur 2 lignes. Ca reste lisible ou je dois éditer?

m
0
l
Contenus similaires
14 Septembre 2010 15:47:18

Bonjour,

Bon, pas le temps de regarder ton script donc je te colle celui de mes serveurs :

  1. #!/bin/bash
  2. # Connexion parameters
  3. MyUSER="SET-MYSQL-USER-NAME" # USERNAME
  4. MyPASS="SET-PASSWORD" # PASSWORD
  5. MyHOST="localhost" # Hostname
  6.  
  7. # Linux bin paths, change this if it can not be autodetected via which command
  8. MYSQL="$(which mysql)"
  9. MYSQLDUMP="$(which mysqldump)"
  10. CHOWN="$(which chown)"
  11. CHMOD="$(which chmod)"
  12. GZIP="$(which gzip)"
  13.  
  14. # Backup Dest directory, change this if you have someother location
  15. DEST="/backup"
  16.  
  17. # Main directory where backup will be stored
  18. MBD="$DEST/mysql"
  19.  
  20. # Get hostname
  21. HOST="$(hostname)"
  22.  
  23. # Get data in dd-mm-yyyy format
  24. NOW="$(date +"%d-%m-%Y")"
  25.  
  26. # File to store current backup file
  27. FILE=""
  28. # Store list of databases
  29. DBS=""
  30.  
  31. # DO NOT BACKUP these databases
  32. IGGY="test"
  33.  
  34. [ ! -d $MBD ] && mkdir -p $MBD || :
  35.  
  36. # Only root can access it!
  37. $CHOWN 0.0 -R $DEST
  38. $CHMOD 0600 $DEST
  39.  
  40. # Get all database list first
  41. DBS="$($MYSQL -u $MyUSER -h $MyHOST -p$MyPASS -Bse 'show databases')"
  42.  
  43. for db in $DBS
  44. do
  45. skipdb=-1
  46. if [ "$IGGY" != "" ];
  47. then
  48. for i in $IGGY
  49. do
  50. [ "$db" == "$i" ] && skipdb=1 || :
  51. done
  52. fi
  53.  
  54. if [ "$skipdb" == "-1" ] ; then
  55. FILE="$MBD/$db.$HOST.$NOW.gz"
  56. # do all inone job in pipe,
  57. # connect to mysql using mysqldump for select mysql database
  58. # and pipe it out to gz file in backup dir :)
  59. $MYSQLDUMP -u $MyUSER -h $MyHOST -p$MyPASS $db | $GZIP -9 > $FILE
  60. fi
  61. done


Je sais plus ou j'avais trouvé ça, mais ça fonction, arrange le à ta sauce. Je me souviens juste que le script était fournit en GPLv2.
Bonne continuation.
m
0
l

Meilleure solution

a b 5 Linux
14 Septembre 2010 16:08:16

Bon, maintenant que nous sommes ici, je peux te demander de respecter le règlement de là-bas ? Utilise la balise [code ] plutôt que [fixed] pour présenter tes scripts.

Tu utilises bash, le Bourne Again Shell. C'est très bien. Alors n'utilise pas la syntaxe ancienne et obsolète du bsh : abandonne les anti-quotes `..` et utilise les dollar-parenthèses à la place : $( .. ) D'une c'est plus moderne, de deux, on peut les imbriquer, de trois, c'est plus facile à lire.

Et surtout, indente ton code.

Ah, encore une chose, trèèès importante.
N'UTILISE PAS LE COMPTE ROOT


-----------

Bon, si après tout ça tu n'es pas encore parti, voici quelques solutions.

Tu as une liste. Si tu veux filtrer cette liste, utilise les commandes standard sed, grep, voire le puissant awk.
Soit tu traites directement au remplissage de la variable, soit tu la filtres après.

Exemple 1
Cachez cette erreur que je ne saurais voir....
  1. #!/bin/bash
  2.  
  3. BASES_SQL=$( mysql -u root -e "show databases" )
  4. for BASE_SQL in $BASES_SQL
  5. do
  6. if ! [ -d "$HOME/$BASE_SQL" ] ; then
  7. mkdir "$HOME/$BASE_SQL"
  8. fi
  9. TABLES_SQL=$( mysql -u root -e "show tables from $BASE_SQL" )
  10. for TABLE_SQL in $TABLES_SQL
  11. do
  12. mysqldump -u root "$BASE_SQL" "$TABLE_SQL" > "$HOME/$BASE_SQL/$TABLE_SQL.sql" 2> /dev/null
  13. done
  14. done
(J'ai mis les variables en majuscule, par convention, j'ai retiré les points-virgules inutiles, et j'ai utilisé la variable $HOME, ce qui est logique, que ce soit root ou un autre utilisateur qui exécute le script.)
C'est la redirection 2 de la ligne 12 qui fait le boulot : l'erreur est devenue invisible.

Facile, non ?
Oui, mais horriblement moche et honteux.

Exemple 2
En supprimant les lignes qui contiennent "Tables_in_"
  1. #!/bin/bash
  2.  
  3. BASES_SQL=$( mysql -u root -e "show databases" )
  4. for BASE_SQL in $BASES_SQL
  5. do
  6. if ! [ -d "$HOME/$BASE_SQL" ] ; then
  7. mkdir "$HOME/$BASE_SQL"
  8. fi
  9. TABLES_SQL=$( mysql -u root -e "show tables from $BASE_SQL" | grep -v 'Tables_in_' )
  10. for TABLE_SQL in $TABLES_SQL
  11. do
  12. mysqldump -u root "$BASE_SQL" "$TABLE_SQL" > "$HOME/$BASE_SQL/$TABLE_SQL.sql"
  13. done
  14. done
C'est le grep de la ligne 9 qui fait le boulot.

Ca marche :) 
Mais on peut faire mieux. En effet, ce qui t'embête, c'est l'entête, quelque soit son contenu.

Exemple 3
Pas la première ligne !

  1. #!/bin/bash
  2.  
  3. BASES_SQL=$( mysql -u root -e "show databases" )
  4. for BASE_SQL in $BASES_SQL
  5. do
  6. if ! [ -d "$HOME/$BASE_SQL" ] ; then
  7. mkdir "$HOME/$BASE_SQL"
  8. fi
  9. TABLES_SQL=$( mysql -u root -e "show tables from $BASE_SQL" | awk '{if(NR>1)print}' )
  10. for TABLE_SQL in $TABLES_SQL
  11. do
  12. mysqldump -u root "$BASE_SQL" "$TABLE_SQL" > "$HOME/$BASE_SQL/$TABLE_SQL.sql"
  13. done
  14. done
C'est le awk de la ligne 9 qui fait le boulot. Si le numéro de ligne (number row) est plus grand que 1, on affiche.

Quelle solution choisis-tu ?

-----------

Tiens, voici du code compliqué, juste pour le plaisir :
  1. #!/bin/bash
  2.  
  3. if [ "$1" == "--help" ] ; then
  4. echo "$( basename $0 ): Sauvegarde des bases de données."
  5. echo "Syntaxe: $( basename $0 )"
  6. exit 0
  7. fi
  8.  
  9. for BASE_SQL in $( mysql -u root -e "show databases" ) ; do
  10. [ -d "$HOME/$BASE_SQL" ] || mkdir "$HOME/$BASE_SQL"
  11. for TABLE_SQL in $( mysql -u root -e "show tables from $BASE_SQL" |
  12. awk '{if(NR>1)print}' ) ; do
  13. mysqldump -u root "$BASE_SQL" "$TABLE_SQL" | bzip2 > "$HOME/$BASE_SQL/$TABLE_SQL.sql.bz2"
  14. done
  15. done
partage
Anonyme
14 Septembre 2010 16:15:31

Merci pour vos propositions. [:jap]
corrections sur le mise-en-forme faites.

Merci pour les remarques sur la syntaxes. Il semblerait que mon bouquin soit un peu vieux. (J'utilise le livre learning bash d'Oreilly, si d'autres lectures, n'hésitez pas. )

Je testerai le tout ce soir devant mon pc personnel.





m
0
l
a b 5 Linux
14 Septembre 2010 16:16:57

A te lire ...
m
0
l
Anonyme
15 Septembre 2010 09:26:42

Bonjour,

Je reviens vers vous.

j'ai opté pour la solution 3 qui me convient tout à fait.

Une petite frayeur à la 1ère exécution qui me retournait une erreur.

Je n'avais pas fait attention à la nuance des variables.

Un tout grand merci.
m
0
l
Anonyme
16 Septembre 2010 11:57:20

Meilleure réponse sélectionnée par Conrad de Marbourg.
m
0
l
Anonyme
16 Septembre 2010 11:58:38

Problème réglé.

Pour contenter tout le monde, j'ai créé un utilisateur sql qui a juste le droit de lire toutes les tables sans avoir d'accès en écriture et ça fonctionne très bien. [:jap]
m
0
l
a b 5 Linux
16 Septembre 2010 15:37:28

Tu utilisais le compte root de mysql, ce qui n'est pas génial. Tu as créé un utilisateur lecteur, c'est très bien. Mais ce que je te disais, c'est de ne pas utiliser le compte root du système !
m
0
l