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