sqldump

Pour faire un dump de chaque base, avec le jour en suffixe (et le mois si on est le 1er)

#!/bin/sh
# copie toutes les bases avec en suffixe le jour de la semaine, et compresse le sql
# le 1er du mois, ajoute un backup avec en suffixe le mois
 
#params
OPTS='--defaults-file=/etc/mysql/debian.cnf'
# pour avoir une ligne par insert (commenter la ligne suivante pour le mode "normal")
# OPTS='--defaults-file=/etc/mysql/debian.cnf --complete-insert --extended-insert=FALSE'
 
# la liste des bases (faut virer la 1re ligne qui est le titre "Database")
LISTDB="$(mysql --defaults-file=/etc/mysql/debian.cnf -e 'show databases;'|sed -e '1d')"
DUMPREP=/backup/mysqldump
FICHLOG=/var/log/mysqldump.log
DF_PATTERN_PARTITION='/\/backup$/' # parce que DUMPREP est sur une partition /backup séparée
# DF_PATTERN_PARTITION='/\/$/'; # si DUMPREP est sur la partition /
# Le % max d'occupation de la partition concernée
MAX_OCCUP=90
 
if [ ! -d $DUMPREP ]
then
  echo "Le rep $DUMPREP n'existe pas" 
  exit 1
fi
 
# on met la date en anglais (august mieux que août, mais aussi pour uniformiser suivant les machines)
if [ "$(grep -c '^en_GB.UTF-8' /etc/locale.gen)" = "1" ]
then
  export LC_ALL='en_GB.UTF-8'
  export LANG='en_GB.UTF-8'
elif [ "$(grep -c '^en_US.UTF-8' /etc/locale.gen)" = "1" ]
then
  export LC_ALL='en_US.UTF-8'
  export LANG='en_US.UTF-8'
# pas de else, on laisse la locale courante
fi
 
cd $DUMPREP
echo "$(date '+%F_%T') BEGIN script $0">>$FICHLOG
# pour limiter la duree du dump, on compresse apres
for base in $LISTDB
do
   # on vérifie qu'il reste de l'espace disque
   occup=$(df |sed -e "$DF_PATTERN_PARTITION"' !d; s/[^ ]* *[^ ]* *[^ ]* *[^ ]* *\([0-9]*\)%.*/\1/')
   if [ $occup -lt $MAX_OCCUP ]
   then
     nom=${base}_$(date '+%A')
     echo -n "$(date '+%F_%T') Begin $base " >> $FICHLOG
     /usr/bin/mysql $OPTS -e 'show master status'|awk 'END {print $1 " " $2}' >> $FICHLOG
     # cf http://dev.mysql.com/doc/refman/5.0/fr/mysqldump.html
     nice mysqldump $OPTS --lock-tables $base > "$nom.sql" && \
	echo -n "$(date '+%F_%T') End $base " >>$FICHLOG && \
       /usr/bin/mysql $OPTS -e 'show master status'|awk 'END {print $1 " " $2}' >> $FICHLOG
   else  
     echo "Plus assez de place (< $MAX_OCCUP) pour dump sql"
   fi
done
 
# compression
for base in $LISTDB
do
  nom="${base}_$(date '+%A')"
  [ -f "$nom.sql" ] && nice bzip2 -f "$nom.sql"
  # copie avec le nom du mois si on est le 1er
  if [ "$(date '+%d')" == '01' ]
  then
    nom2="${base}_$(date '+%B')"
    cp -a "$nom.sql.bz2" "$nom2.sql.bz2"
  fi
done
echo "$(date '+%F_%T') END script $0">>$FICHLOG