View Single Post
Old 27-09-2011, 19:43   #20
Gimli[2BV!2B]
Senior Member
 
L'Avatar di Gimli[2BV!2B]
 
Iscritto dal: Feb 2006
Città: Parma
Messaggi: 3008
Backup di database MySQL
Parametri da linea di comando:
  • all -> esegue il backup dei database elencati da "SHOW DATABASES"
  • "nome_db1 nome_db2 nome_dbN" -> esegue il backup dei soli database specificati
Variabili personalizzabili:
  • /etc/FILE_ACCESSO -> file contenente i dati di accesso al/ai datanase da salvare: USR e PWD
  • MAX_BACKUPS -> Numero di backup da mantenere
  • SKIP -> Database da NON salvare
  • DEST -> Cartella di destinazione backup: al suo interno verrà creata una cartella apposita
  • MBD -> Cartella da creare all'interno della cartella di destinazione
  • RIGHTS_DIR -> Diritti ottali da assegnare a directory di backup
  • RIGHTS_TAR -> Diritti ottali da assegnare ad ogni file gz creato
Codice:
#!/bin/bash
# Backup MySql databases
# --------------------------------------------------------------------
# This is a free shell script under GNU GPL version 2.0 or above
# Copyright (C) 2004, 2005 nixCraft project
# Feedback/comment/suggestions : http://cyberciti.biz/fb/
# -------------------------------------------------------------------------
# Copyleft (C) 2011-2012 Gimli
# -------------------------------------------------------------------------
# 20110922 - v1.0
# 20110923 - v2.0
# 20120716 - v3.0
# 20120717 - v3.1
# 20120718 - v3.2
# -------------------------------------------------------------------------

# Inclusione per prima: precedenza a parametri impostati in questo script
. /etc/FILE_ACCESSO

###########################################################################
# ------------------------------------------------------------------------#
# Impostazioni personalizzabili - inizio
#
# Numero di backup da mantenere
MAX_BACKUPS=30

# Nome host server MySQL (opzione -h mysqldump)
MyHOST="localhost"

# Database da NON BACKUPPARE
SKIP=""

# Cartella di destinazione backup: al suo interno verrà creata una cartella
# apposita
DEST="/home/gimli/backup"

# Cartella da creare all'interno della cartella di destinazione
# (poò anche essere uguale DEST: i diritti non saranno modificati)
MBD="$DEST/mysql"

# Diritti ottali da assegnare a directory di backup
RIGHTS_DIR="0700"
# Diritti ottali da assegnare ad ogni file gz creato
RIGHTS_TAR="0600"
#
# Impostazioni personalizzabili - fine
# ------------------------------------------------------------------------#
###########################################################################

###########################################################################
# ------------------------------------------------------------------------#
# Percorsi assoluti binari utilizzati (importanti per crontab)
#
# mysql usato per 'SHOW DATABASES'
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
CHOWN="$(which chown)"
CHMOD="$(which chmod)"
#COMPRESSOR="$(which gzip)"; EXTENSION="gz"
COMPRESSOR="$(which bzip2)"; EXTENSION="bz2"
#COMPRESSOR="$(which xz)"; EXTENSION="xz"
SED="$(which sed)"
HOSTNAME="$(which hostname)"
#
# Percorsi assoluti binari utilizzati - fine
# ------------------------------------------------------------------------#
###########################################################################

usage()
{
cat << EOF
utilizzo: $0 opzioni

Questo script esegue backup di database mysql.
Specificare una delle seguenti azioni:
  all                 : backup dei database elencati da "SHOW DATABASES"
  like '%condizione%' : backup dei database che soddisfano la condizione.
  test '%condizione%' : mostra i database che soddisfano la condizione.
  "nome_db1 nome_db2 nome_dbN" : backup dei soli database specificati.

EOF
}

# Lista di database
TEST=0
if [ "$1" == "test" ]; then
  TEST=1
fi
DBS=$(if [ -z "$1" ]; then
    :
  elif [ "$1" == "all" ]; then
    echo 'show databases' | $MYSQL -u $USR -h $MyHOST --password="$PWD" -Bs
  elif [ "$1" == "like" ]; then
    echo "SHOW DATABASES LIKE '$2'" | $MYSQL -u $USR -h $MyHOST --password="$PWD" -Bs
  elif [ "$1" == "test" ]; then
    echo "SHOW DATABASES LIKE '$2'" | $MYSQL -u $USR -h $MyHOST --password="$PWD" -Bs
  else
    echo "$1"
  fi)

if [ -z "$DBS" ]; then
  echo "Nessun database selezionato!"
  usage
  exit 1
fi

if [[ TEST -eq 1 ]]; then
  for db in $DBS ; do
    skipdb=0
    if [ "$SKIP" != "" ] ; then
      for i in $SKIP ; do
        [ "$db" == "$i" ] && skipdb=1 || :
      done
    fi

    if [[ $skipdb -eq 0 ]] ; then
      echo $db
    fi
  done
  exit 0
fi

# Creazione cartella destinazione e impostazione diritti
[ ! -d $MBD ] && mkdir -p $MBD || :
if [ "$MBD" != "$DEST" ]; then
  # owner root
  $CHOWN 0.0 -R $MBD
  # Applica diritti
  $CHMOD $RIGHTS_DIR $MBD
fi

# hostname: utilizzato in nome file
HOST="$($HOSTNAME)"
# data: utilizzata in nome file
NOW="$(date +"%Y-%m-%d_%H.%M")"

for db in $DBS ; do
  skipdb=0
  if [ "$SKIP" != "" ] ; then
    for i in $SKIP ; do
      [ "$db" == "$i" ] && skipdb=1 || :
    done
  fi

  if [[ $skipdb -eq 0 ]] ; then
    # Inizio nome file per conta (paranoia spazi)
    FILE_PREFIX="$(echo "$MBD/$db.$HOST" | tr -d [:blank:])"
    # Nome nuovo backup (paranoia spazi)
    FILE="$(echo "$FILE_PREFIX.$NOW.sql.$EXTENSION" | tr -d [:blank:])"
    # Elenco backup precedenti (paranoia rimozione spazi, poi testo esistenza file)
    FILE_PREV=( $(ls "$FILE_PREFIX"*.sql.* 2>/dev/null | tr -d [:blank:]) )
    # Mantengo solo gli ultimi $MAX_BACKUPS - 1 (a cui si sommerà il nuovo)
    if (( ${#FILE_PREV[@]} > (($MAX_BACKUPS - 1)) )) ; then
      let "NUM_DEL=${#FILE_PREV[@]} - $MAX_BACKUPS + 1"
      for (( ; NUM_DEL > 0; NUM_DEL-- )) ; do
        if [ -f "${FILE_PREV[$NUM_DEL]}" ] ; then
          rm "${FILE_PREV[$NUM_DEL]}"
        fi
      done
    fi

    ERROR_MESSAGE=$( {
      $MYSQLDUMP --add-drop-database --quick -c -e -F -l -u $USR -h $MyHOST --password="$PWD" --databases $db | \
          $SED -e 's|/\*\!40000 DROP DATABASE IF EXISTS \(`.*`\)\*/;|DROP DATABASE IF EXISTS \1;|' | \
          $COMPRESSOR > "$FILE" ;
      if [[ ${PIPESTATUS[0]} -ne 0 ]] ; then
        exit 1
      elif [[ ${PIPESTATUS[1]} -ne 0 ]] ; then
        exit 2
      elif [[ ${PIPESTATUS[2]} -ne 0 ]] ; then
        exit 3
      fi
      exit 0
    } 2>&1 )
    RETURN=$?

    if [[ $RETURN -ne 0 ]] ; then
      if [ -f "$FILE" ] ; then
        rm "$FILE"
      fi
      # mysqldump o gzip fallito!
      FILE="$MBD/_FAILED.$db.$HOST.$NOW.FAILED_.txt"
      touch "$FILE"
      echo "$ERROR_MESSAGE" > "$FILE"
    fi
    # Applica diritti al file
    $CHMOD $RIGHTS_TAR "$FILE"
  fi
done
Avete suggerimenti per semplificare i vari salti mortali che ho utilizzato per intercettare valore di ritorno e messaggi di errore di mysqldump e gzip?
__________________
~Breve riferimento ai comandi GNU/Linux (ormai non molto breve...)

Ultima modifica di Gimli[2BV!2B] : 18-07-2012 alle 22:41. Motivo: Aggiornamento e correzioni
Gimli[2BV!2B] è offline   Rispondi citando il messaggio o parte di esso