Le blog de Shnoulle

Bricolage en informatique et autres joyeusetées

Accueil > Logiciels libres > GNU/Linux > Un ptit script de backup mysql

Un ptit script de backup mysql

mardi 9 novembre 2010, par Shnoulle

Ce script est une note de rappel personnel et ne vise pas à être implémenté tel que ....

Ce script est (très) fortement inspiré des scripts suivant :

  1. #!/bin/bash
  2.  
  3.  
  4. # Linux bin paths, change this if it can not be autodetected via which command
  5. MYSQL="$(which mysql)"
  6. MYSQLDUMP="$(which mysqldump)"
  7. GZIP="$(which gzip)"
  8.  
  9. # Backup Dest directory, change this if you have someother location
  10. DEST="/home/Shnoulle/backup"
  11.  
  12. # Main directory where backup will be stored
  13. MBD="$DEST/mysql"
  14.  
  15. # Get hostname
  16. HOST="$(hostname)"
  17.  
  18. # Get data in dd-mm-yyyy format
  19. NOW="$(date +"%d-%m-%Y")"
  20. DATEREM=`date --date '10 days ago' "+%d-%m-%Y"`
  21.  
  22. # File to store current backup file
  23. FILE=""
  24. # Store list of databases
  25. DBS=""
  26.  
  27. # DO NOT BACKUP these databases
  28. SKIP=""
  29.  
  30. [ ! -d $MBD ] && mkdir -p $MBD || :
  31. [ ! -d "$MBD/$NOW" ] && mkdir -p "$MBD/$NOW" || :
  32.  
  33. # Get all database list first
  34. DBS="$($MYSQL -Bse 'show databases')"
  35.  
  36. for db in $DBS
  37. do
  38. skipdb=-1
  39. if [ "$SKIP" != "" ];
  40. then
  41. for i in $SKIP
  42. do
  43. [ "$db" == "$i" ] && skipdb=1 || :
  44. done
  45. fi
  46.  
  47. if [ "$skipdb" == "-1" ] ; then
  48. for table in `$MYSQL -N $db -e "show tables"`
  49. do
  50. ENGINE=$($MYSQL $db -e "show table status like '$table'\G" | awk '/Engine/ {print $2}')
  51. if [ "$ENGINE" == "MyISAM" ]
  52. then
  53. SIZE=$($MYSQL $db -e "show table status like '$table'\G" | awk '/Data_length/ {print $2}')
  54. FREE=$($MYSQL $db -e "show table status like '$table'\G" | awk '/Data_free/ {print $2}')
  55. ROWS=$($MYSQL $db -e "show table status like '$table'\G" | awk '/Rows/ {print $2}')
  56.  
  57. if [ $FREE -gt 0 ] && [ $SIZE -gt 0 ] && [ $ROWS -gt 0 ]
  58. then
  59. FRAGMENTATION=$(printf '%i' $(echo "scale=0; $FREE/($SIZE/100)"|bc))
  60. echo "$FRAGMENTATION% $db.$table Data_length=$SIZE Data_free=$FREE"
  61. if [ $FRAGMENTATION -ge 5 ]
  62. then
  63. echo "OPTIMIZE REQUESTED"
  64. $MYSQL $db -e "use '$db';OPTIMIZE TABLE $table\G"
  65. fi
  66. fi
  67. fi
  68.  
  69. done
  70. FILE="$MBD/$NOW/$db.$HOST.gz"
  71. # do all inone job in pipe,
  72. # connect to mysql using mysqldump for select mysql database
  73. # and pipe it out to gz file in backup dir :)
  74. $MYSQLDUMP $db | $GZIP -9 > $FILE
  75. fi
  76. done
  77.  
  78. # On supprime les repertoire de il y a 10 jours
  79. if [ -d "$MBD/$DATEREM" ]; then
  80. rm -rF "$MBD/$DATEREM"
  81. fi

Télécharger

Y a sans doute moyen de faire mieux, je modifierais au fur et à mesure ...

Un message, un commentaire ?

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.