Бекап баз данных – есть ли он?

от автора

image

Нет смысла говорить о том, насколько это актуальный вопрос. Сегодня мы расскажем, как у нас организовано резервное копирование баз данных mysql.
И одно их самых важных – это проверка, а сделался ли бекап? А успешно ли прошел дамп? А были ли ошибки? А знаю ли я о них

По-моему, сегодня вряд ли можно найти того, кто не делает бекап. Но вот проверять наличие ошибок при выполнении бекапа, пожалуй, попробую рассказать вам как это делаем мы.

Сразу оговорюсь, что, возможно, в принципе реализации использованы стандартные схемы, но, возможно, вы найдете для себя, что-то новое, что сможете внедрить у себя.

Опишем переменные и пути

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/mysql/bin  DATE=`date +%Y-%m-%d_%Hh%Mm`                            # Datestamp e.g 2002-09-21  DOW=`date +%A`                                                  # Day of the week e.g. Monday  DNOW=`date +%u`                                         # Day number of the week 1 to 7 where 1 represents Monday  DOM=`date +%d`                                                  # Date of the Month e.g. 27  M=`date +%B`                                                    # Month e.g January  W=`date +%V`                                                    # Week Number e.g 37  VER=2.5                                                                 # Version Number  LOGFILE=$BACKUPDIR/$DBHOST-`date +%N`.log               # Logfile Name  LOGERR=$BACKUPDIR/ERRORS_$DBHOST-`date +%N`.log         # Logfile Name  BACKUPFILES=""  OPT="--quote-names --opt --routines --single-transaction --events"      # OPT string for use with mysqldump ( see man mysqldump )  DBEXCLUDE+=" information_schema performance_schema"     LOCATION="$(cd -P -- "$(dirname -- "$0")" && pwd -P)/.."  

Для всех серверов скрипт один, но куда же без файла настроек. Зачастую есть необходимость не только в глобальных настройках, но и в специфических для отдельного проекта. Мы решили это разнести на несколько файлов.

mysql-backup.conf.dist — файл хранит глобальные настройки, общие для всех проектов

mysql-backup.conf – файл для специфических настроек для проекта

mysql-backup.local.conf – файл для настроек локального бекапа

Проверим, если есть конфиг — будем делать бекап на этом сервере, и прочитаем наши конфиги:

if [ -f "$LOCATION/etc/mysql-backup.conf.dist" ]; then      . "$LOCATION/etc/mysql-backup.conf.dist"      if [ -f "$LOCATION/etc/mysql-backup.conf" ]; then          . "$LOCATION/etc/mysql-backup.conf"      fi      if [ -f "$LOCATION/etc/mysql-backup.local.conf" ]; then          . "$LOCATION/etc/mysql-backup.local.conf"      fi  else      echo "mysql-backup.conf.dist not found"      exit 0  fi 

Далее пойдём читать опции конфига и устанавливать значения

# Add --compress mysqldump option to $OPT  if [ "$COMMCOMP" = "yes" ];          then                  OPT="$OPT --compress"          fi     # Add --compress mysqldump option to $OPT  if [ "$MAX_ALLOWED_PACKET" ];          then                  OPT="$OPT --max_allowed_packet=$MAX_ALLOWED_PACKET"          fi     if [ ! "$BACKUP_DAYS" ];          then                  BACKUP_DAYS=7          fi     if [ ! "$BACKUP_MONTH" ];          then                  BACKUP_MONTH=4          fi     if [ ! "$DO_SQL_DUMP" ];          then                  DO_SQL_DUMP="yes"          fi     if [ ! "$DO_HOT_BACKUP" ];          then                  DO_HOT_BACKUP="no"          fi 

Думаю тут не нужно подробно описывать, т.к. названия переменных должны сами всё говорить за себя.

Проверим и создадим директории для наших бекапов

# Create required directories  if [ ! -e "/var/lib/mysql.backup" ]             # Check Backup Directory exists.          then              mkdir -p "/var/lib/mysql.backup"  fi     if [ ! -e "$BACKUPDIR" ]                # Check Backup Directory exists.          then          mkdir -p "$BACKUPDIR"  fi     if [ ! -e "$BACKUPDIR/daily" ]          # Check Daily Directory exists.          then          mkdir -p "$BACKUPDIR/daily"  fi     if [ ! -e "$BACKUPDIR/weekly" ]         # Check Weekly Directory exists.          then          mkdir -p "$BACKUPDIR/weekly"  fi     if [ ! -e "$BACKUPDIR/monthly" ]        # Check Monthly Directory exists.          then          mkdir -p "$BACKUPDIR/monthly"  fi     if [ "$LATEST" = "yes" ]  then          if [ ! -e "$BACKUPDIR/latest" ] # Check Latest Directory exists.          then                  mkdir -p "$BACKUPDIR/latest"          fi  eval rm -fv "$BACKUPDIR/latest/*"  fi 

Один из важных моментов, не только сделать бекап, но и проверить ошибки в процессе его выполнения.

# IO redirection for logging.  touch $LOGFILE  exec 6>&1           # Link file descriptor #6 with stdout.                      # Saves stdout.  exec > $LOGFILE     # stdout replaced with file $LOGFILE.  touch $LOGERR  exec 7>&2           # Link file descriptor #7 with stderr.                      # Saves stderr.  exec 2> $LOGERR     # stderr replaced with file $LOGERR.     echo $LOCATION 

Опишем наши фукции. Т.к. для разных проектов нужен разный бекап, кому инкреметный, у кого пользователи ночью спят — достаточно дампа ночного.

Обычный mysqldump

# Database dump function  dbdump () {      if [ "$SEPTABLE" = "yes" ]; then          TABLENAMES="`mysql --user=$USERNAME --password=$PASSWORD --host=$DBHOST --batch --skip-column-names -e "show tables" $1| sed 's/ /%/g'`"          for TABLENAME in $TABLENAMES ; do             OUTFILENAME=`echo $2 | sed "s~$3~$3.$TABLENAME~"`             mysqldump --user=$USERNAME --password=$PASSWORD --host=$DBHOST $OPT $1 $TABLENAME > $OUTFILENAME          done          mysqldump --user=$USERNAME --password=$PASSWORD --host=$DBHOST $OPT --no-data $1 > $2      else          mysqldump --user=$USERNAME --password=$PASSWORD --host=$DBHOST $OPT $1 > $2      fi      return 0  } 

С использованием mydumper

# Database dump function  dbdump_mydumper () {      MYOPT=""          # Add --ignore-table options to $MYOPT             if [ -n "$TABLEEXCLUDE" ]; then              for table in $TABLEEXCLUDE ; do                  MYOPT="${MYOPT}${table}|"              done          fi          if [ -n "$DBEXCLUDE" ]; then              for table in $DBEXCLUDE ; do                  MYOPT="${MYOPT}${table}|"              done          fi          if [ -n "$MYOPT" ]; then              MYOPT="--regex '^(?!(${MYOPT}mysql.noptable))'"          fi         eval mydumper --user $USERNAME --password $PASSWORD -c -l 300 --kill-long-queries -s 500000 $MYOPT -o $1         if [ $? -gt 0 ]; then            echo "Error in mydumper backup stage" >&2            mysql -u root -p`cat /root/.mysql` -e "SHOW FULL PROCESSLIST" | sort -n -k 6 >&2      fi         /usr/bin/find "$BACKUPDIR/daily" -name "_mydumper*" -type d -mtime +$BACKUP_DAYS -print0 | xargs -0 rm -rf      /usr/bin/find "$BACKUPDIR/weekly" -name "_mydumper*" -type d -mtime +35 -print0 | xargs -0 rm -rf      /usr/bin/find "$BACKUPDIR/monthly" -name "_mydumper*" -type d -mtime +100 -print0 | xargs -0 rm -rf      return 0  } 

Обычное копирование данных, естественно c блокировкой таблиц

dbdump_h () {      echo First rsync started at `date`      rsync -avH --delete --numeric-ids /var/lib/mysql/ /var/lib/mysql.backup      echo First rsync finished at `date`      echo DB locked, second rsync started at `date`      echo "FLUSH TABLES WITH READ LOCK" | mysql --user=$USERNAME --password=$PASSWORD --host=$DBHOST      rsync -avH --delete --numeric-ids /var/lib/mysql/ /var/lib/mysql.backup      echo "UNLOCK TABLES" | mysql --user=$USERNAME --password=$PASSWORD --host=$DBHOST      echo DB unlocked, second rsync finished at `date`  return 0  } 

И куда же без него, всем нам известный инкрементный бекап

dbdump_h_xtra () {      if [ ! -f /usr/bin/innobackupex ]; then          yum -y install xtrabackup.x86_64      fi      if [ ! -f /var/lib/mysql-xtra/xtrabackup_checkpoints ]; then          echo Full backup stage started at `date`          #ionice -c3          /usr/bin/innobackupex --defaults-file=/etc/my.cnf --password=`cat /root/.mysql` --no-timestamp  --throttle=40 --rsync /var/lib/mysql-xtra 2>&1          if [ $? -gt 0 ]; then            echo "Error in full backup stage" >&2          fi          #ionice -c3          /usr/bin/innobackupex --apply-log --redo-only --defaults-file=/etc/my.cnf --password=`cat /root/.mysql` --no-timestamp  --throttle=40 /var/lib/mysql-xtra 2>&1          if [ $? -gt 0 ]; then            echo "Error in apply log redo stage" >&2          fi          echo Full backup stage finished at `date` code $?      else          echo INC backup stage started at `date` code $?          rm -rf /var/lib/mysql-xtra-inc          #ionice -c3          /usr/bin/innobackupex --defaults-file=/etc/my.cnf --password=`cat /root/.mysql` --no-timestamp  --throttle=40  --rsync --incremental /var/lib/mysql-xtra-inc --incremental-basedir=/var/lib/mysql-xtra 2>&1          if [ $? -gt 0 ]; then            echo "Error in inc stage" >&2          fi          #ionice -c3          /usr/bin/innobackupex --defaults-file=/etc/my.cnf --password=`cat /root/.mysql` --no-timestamp  --throttle=40 --apply-log /var/lib/mysql-xtra --incremental-dir=/var/lib/mysql-xtra-inc 2>&1          if [ $? -gt 0 ]; then            echo "Error in inc apply stage" >&2          fi          /usr/bin/rsync -vaH --delete -f "+ */" -f "+ */**" -f "- *" /var/lib/mysql-xtra-inc/ /var/lib/mysql-xtra          rm -rf /var/lib/mysql-xtra-inc          echo INC backup stage finished at `date` code $?      fi  return 0 

Пожалуй и фукцию компресии вынесем отдельно. Для чего? — Феншуй. Неизвестно настроение клиента, и какую он захочет компрессию. Дадим ему право выбрать желаемый тип.

# Compression function plus latest copy  SUFFIX=""  compression () {      if [ "$SEPTABLE" = "yes" ]; then          TBDIR=`/usr/bin/dirname $2`          TFNAME=`/bin/basename $2`          if [ "$COMP" = "gzip" ]; then              TPWD=`pwd`              cd $TBDIR              tar -czvf "$1.tgz" ${TFNAME}*.sql 2>&1              cd $TPWD              SUFFIX=".tgz"          elif [ "$COMP" = "bzip2" ]; then              TPWD=`pwd`              cd $TBDIR              tar -cjvf "$1.tbz2" ${TFNAME}*.sql 2>&1              cd $TPWD              SUFFIX=".tbz2"          fi          rm -f ${2}*.sql      else          if [ "$COMP" = "gzip" ]; then              gzip -f "$1"              echo              echo Backup Information for "$1"              gzip -l "$1.gz"              SUFFIX=".gz"          elif [ "$COMP" = "bzip2" ]; then          echo Compression information for "$1.bz2"          bzip2 -f -v $1 2>&1          SUFFIX=".bz2"      else          echo "No compression option set, check advanced settings"      fi fi      if [ "$LATEST" = "yes" ]; then          cp $1$SUFFIX "$BACKUPDIR/latest/"      fi      return 0  }  # Compression function plus latest copy  SUFFIX=""  compression_h () {      if [ "$COMP" = "gzip" ]; then          TPWD=`pwd`          cd /var/lib/mysql.backup          tar -czvf "$1.tgz" . 2>&1          cd $TPWD          SUFFIX=".tgz"      elif [ "$COMP" = "bzip2" ]; then          TPWD=`pwd`          cd /var/lib/mysql.backup          tar -cjvf "$1.tbz2" . 2>&1          cd $TPWD          SUFFIX=".tbz2"      else          echo "No compression option set, check advanced settings"      fi      if [ "$LATEST" = "yes" ]; then          cp $1$SUFFIX_H "$BACKUPDIR/latest/"      fi      return 0  } 

Опишем ротацию. Опять же потребности в сроке хранения бывают разные.

## rotates monthly backups, set 'keep' to the last n backups to keep  rotateMonthly () {        mdbdir="$1"     ## set to the number of monthly backups to keep  keep=$BACKUP_MONTH     (cd ${mdbdir}         totalFilesCount=`/bin/ls -1 | wc -l`         if [ ${totalFilesCount} -gt ${keep} ]; then          purgeFilesCount=`expr ${totalFilesCount} - ${keep}`          purgeFilesList=`/bin/ls -1tr | head -${purgeFilesCount}`             echo ""          echo "Rotating monthly: Purging in ${mdbdir}"          rm -fv ${purgeFilesList} | sed -e 's/^//g'      fi  )  } 

Бывает необходимо перед началом запуска бекапа выполнить команду. Приостановить сервис, показать пользователям сообщение о работах. Сообщить поисковикам и дампе огромной базы. Предоставим такую возможность.

# Run command before we begin  if [ "$PREBACKUP" ]          then          echo ======================================================================          echo "Prebackup command output."          echo          eval $PREBACKUP          echo          echo ======================================================================          echo  fi 

Порой не все таблицы нужно бекапить.

# Add --ignore-table options to $OPT  if [ -n "$TABLEEXCLUDE" ]; then          for table in $TABLEEXCLUDE ; do                  OPT="${OPT} --ignore-table=${table}"          done  fi 

Думаю, эта часть в описании не нуждается

if [ "$SEPDIR" = "yes" ]; then # Check if CREATE DATABSE should be included in Dump          if [ "$CREATE_DATABASE" = "no" ]; then                  OPT="$OPT --no-create-db"          else                  OPT="$OPT --databases"          fi  else          OPT="$OPT --databases"  fi     # Hostname for LOG information  if [ "$DBHOST" = "localhost" ]; then          HOST=`hostname`          if [ "$SOCKET" ]; then                  OPT="$OPT --socket=$SOCKET"          fi  else          HOST=$DBHOST  fi 

Прочитаем все базы и удалим из списка для бекапа базы исключения

# If backing up all DBs on the server  if [ "$DBNAMES" = "all" ]; then          DBNAMES="`mysql --user=$USERNAME --password=$PASSWORD --host=$DBHOST --batch --skip-column-names -e "show databases"| sed 's/ /%/g'`"             # If DBs are excluded          for exclude in $DBEXCLUDE          do                  DBNAMES=`echo $DBNAMES | sed "s/\b$exclude\b//g"`          done             MDBNAMES=$DBNAMES  Fi 

Пора приступить самому бекапу

echo ======================================================================  echo AutoMySQLBackup VER $VER  echo http://sourceforge.net/projects/automysqlbackup/  echo  echo Backup of Database Server - $HOST  echo ====================================================================== 

Нам нужны дампы? Приступим к дампам

if [ "$DO_SQL_DUMP" = "yes" ]; then     echo Backup Start Time `date`  echo ====================================================================== 

Также по феншую удобно разделять временные типы бекапа, ну что ж сегодня первое число? Сделаем месячный дамп.

 # Monthly Full Backup of all Databases          if [ $DOM = "01" ]; then                  for MDB in $MDBNAMES                  do                           # Prepare $DB for using                          MDB="`echo $MDB | sed 's/%/ /g'`"                             if [ ! -e "$BACKUPDIR/monthly/$MDB" ]           # Check Monthly DB Directory exists.                          then                                  mkdir -p "$BACKUPDIR/monthly/$MDB"                          fi                          echo Monthly Backup of $MDB...                                  dbdump "$MDB" "$BACKUPDIR/monthly/$MDB/${MDB}_$DATE.$M.$MDB.sql" "$BACKUPDIR/monthly/$MDB/${MDB}"                                  compression "$BACKUPDIR/monthly/$MDB/${MDB}_$DATE.$M.$MDB.sql" "$BACKUPDIR/monthly/$MDB/${MDB}"                                  BACKUPFILES="$BACKUPFILES $BACKUPDIR/monthly/$MDB/${MDB}_$DATE.$M.$MDB.sql$SUFFIX"                          echo ----------------------------------------------------------------------                          TTT=`expr 33 \* $BACKUP_MONTH`                          /usr/bin/find "$BACKUPDIR/monthly/$MDB" -name "*.sql.*" -mtime +$TTT -type f -delete                     done 

Не первое число месяца? – приступаем к повседневно-ежедневному бекапу. Преполагаю, что построчное описание не требуется.

else                     for DB in $DBNAMES                  do                  # Prepare $DB for using                  DB="`echo $DB | sed 's/%/ /g'`"                     # Create Seperate directory for each DB                  if [ ! -e "$BACKUPDIR/daily/$DB" ]              # Check Daily DB Directory exists.                  then                          mkdir -p "$BACKUPDIR/daily/$DB"                  fi                  if [ $BACKUP_DAYS -le 7 ]; then                      if [ ! -e "$BACKUPDIR/weekly/$DB" ]         # Check Weekly DB Directory exists.                      then                          mkdir -p "$BACKUPDIR/weekly/$DB"                      fi                      # Weekly Backup                  fi                  if [ $DNOW = $DOWEEKLY -a $BACKUP_DAYS -le 7 ]; then                      echo Weekly Backup of Database \( $DB \)                      echo Rotating 5 weeks Backups...                      if [ "$W" -le 05 ];then                                  REMW=`expr 48 + $W`                          elif [ "$W" -lt 15 ];then                                  REMW=0`expr $W - 5`                          else                                  REMW=`expr $W - 5`                      fi                      eval rm -fv "$BACKUPDIR/weekly/$DB/${DB}_week.$REMW.*"   echo                          dbdump "$DB" "$BACKUPDIR/weekly/$DB/${DB}_week.$W.$DATE.sql" "$BACKUPDIR/weekly/$DB/${DB}"                          compression "$BACKUPDIR/weekly/$DB/${DB}_week.$W.$DATE.sql" "$BACKUPDIR/weekly/$DB/${DB}"                          BACKUPFILES="$BACKUPFILES $BACKUPDIR/weekly/$DB/${DB}_week.$W.$DATE.sql$SUFFIX"                      echo ----------------------------------------------------------------------                  # Daily Backup                  else                      echo Daily Backup of Database \( $DB \)                      echo Rotating last weeks Backup...                      /usr/bin/find "$BACKUPDIR/daily/$DB" -name "*.sql.*" -mtime +$BACKUP_DAYS -delete                      echo                          dbdump "$DB" "$BACKUPDIR/daily/$DB/${DB}_$DATE.$DOW.sql" "$BACKUPDIR/daily/$DB/${DB}"                          compression "$BACKUPDIR/daily/$DB/${DB}_$DATE.$DOW.sql" "$BACKUPDIR/daily/$DB/${DB}"                          BACKUPFILES="$BACKUPFILES $BACKUPDIR/daily/$DB/${DB}_$DATE.$DOW.sql$SUFFIX"                      echo ----------------------------------------------------------------------                  fi                  done          fi  echo Backup End `date`  echo ======================================================================  fi 

Нам нужен HOT BACKUP? Приступим:

#### HOT BACKUP  if [ "$DO_HOT_BACKUP" = "yes" ]; then         echo HOT Backup Start `date`      echo ======================================================================      # Monthly HOT Full Backup of all Databases      if [ $DOM = "01" ]; then          echo Monthly full Backup of \( $MDBNAMES \)...          dbdump_h "$MDBNAMES" "$BACKUPDIR/monthly/$DATE.$M.all-databases.sql"  ###        compression_h "$BACKUPDIR/monthly/$DATE.$M.all-databases.sql"          BACKUPFILES="$BACKUPFILES $BACKUPDIR/monthly/$DATE.$M.all-databases.sql$SUFFIX"          echo ----------------------------------------------------------------------  ###     TTT=`expr 33 \* $BACKUP_MONTH`  ###     /usr/bin/find "$BACKUPDIR/monthly/" -name "*.all-databases.sql.*" -mtime +$TTT -type f -delete      else  # Weekly Backup      if [ $DNOW = $DOWEEKLY -a $BACKUP_DAYS -le 7 ]; then          echo Weekly Backup of Databases \( $DBNAMES \)          echo          echo Rotating 5 weeks Backups...          if [ "$W" -le 05 ];then                  REMW=`expr 48 + $W`          elif [ "$W" -lt 15 ];then                  REMW=0`expr $W - 5`          else                  REMW=`expr $W - 5`          fi          eval rm -fv "$BACKUPDIR/weekly/week.$REMW.*"          echo          dbdump_h "$DBNAMES" "$BACKUPDIR/weekly/week.$W.$DATE.sql"  ###        compression_h "$BACKUPDIR/weekly/week.$W.$DATE.sql"          BACKUPFILES="$BACKUPFILES $BACKUPDIR/weekly/week.$W.$DATE.sql$SUFFIX"          echo ----------------------------------------------------------------------  # Daily Backup else          echo Daily Backup of Databases \( $DBNAMES \)          echo          echo Rotating last weeks Backup...          /usr/bin/find "$BACKUPDIR/daily/$DB" -name "*.sql.*" -mtime +$BACKUP_DAYS -delete          echo          dbdump_h "$DBNAMES" "$BACKUPDIR/daily/$DATE.$DOW.sql"  ###        compression_h "$BACKUPDIR/daily/$DATE.$DOW.sql"          BACKUPFILES="$BACKUPFILES $BACKUPDIR/daily/$DATE.$DOW.sql$SUFFIX"          echo ----------------------------------------------------------------------      fi      fi      echo Backup End Time `date`      echo ======================================================================  fi 

HOT XTRA BACKUP? — сделаем его:

#### HOT XTRA BACKUP  if [ "$HOT_XTRA_BACKUP" = "yes" ]; then      dbdump_h_xtra  fi     И последний вариант - mydumper:  #### DO_MYDUMPER_BACKUP  if [ "$DO_MYDUMPER_BACKUP" = "yes" ]; then      # Monthly Full Backup of all Databases      BACKUPDIRM=$BACKUPDIR/daily/      if [ $DOM = "01" ]; then         BACKUPDIRM=$BACKUPDIR/monthly/      else        if [ $DNOW = $DOWEEKLY -a $BACKUP_DAYS -le 7 ]; then          BACKUPDIRM=$BACKUPDIR/weekly/        fi      fi      BACKUPDIRM=${BACKUPDIRM}_mydumper-`date +%F_%R`      dbdump_mydumper "$BACKUPDIRM"      OPT="$OPT --no-data"      for DB in $DBNAMES      do          # Prepare $DB for using          DB="`echo $DB | sed 's/%/ /g'`"          dbdump "$DB" "$BACKUPDIRM/$DB-schema.sql"          compression "$BACKUPDIRM/$DB-schema.sql"      done  fi 

Посчитаем сколько занимают дампы, место имеет привычку заканчиваться.

echo Total disk space used for backup storage..  echo Size - Location  echo `du -hs "$BACKUPDIR"`  echo 

Порой бывает нужно выполнить команду, после бекапа, например вновь открыть сайт. Предоставим такую возможность:

# Run command when we're done  if [ "$POSTBACKUP" ]          then          echo ======================================================================          echo "Postbackup command output."          echo          eval $POSTBACKUP          echo          echo ======================================================================  fi 

Приступим к анализу лога бекапа

#Clean up IO redirection  exec 1>&6 6>&-      # Restore stdout and close file descriptor #6.  exec 1>&7 7>&-      # Restore stdout and close file descriptor #7. 

Да, мы знаем, спасибо. Удалим это из нашего лога.

sed -i '/Using a password on the command line interface can be insecure/d' $LOGERR 

Далее у нас несколько вариантов: прислать лог работы скрипта, прислать лог и файлы дампа, показать вывод в консоль (отладка, куда же без неё), прислать на почту лог и если есть ошибки.

Пожалуй в дефолте мы выбираем последний вариант. Но опишем все.

if [ "$MAILCONTENT" = "files" ]  then          if [ -s "$LOGERR" ]          then                  # Include error log if is larger than zero.                  BACKUPFILES="$BACKUPFILES $LOGERR"                  ERRORNOTE="WARNING: Error Reported - "          fi          #Get backup size          ATTSIZE=`du -c $BACKUPFILES | grep "[[:digit:][:space:]]total$" |sed s/\s*total//`          if [ $MAXATTSIZE -ge $ATTSIZE ]          then                  BACKUPFILES=`echo "$BACKUPFILES" | sed -e "s# # -a #g"` #enable multiple attachments                  mutt -s "$ERRORNOTE MySQL Backup Log and SQL Files for $HOST - $DATE" $BACKUPFILES $MAILADDR < $LOGFILE         #send via mutt          else                  cat "$LOGFILE" | mail -s "WARNING! - MySQL Backup exceeds set maximum attachment size on $HOST - $DATE" $MAILADDR          fi  elif [ "$MAILCONTENT" = "log" ]  then          cat "$LOGFILE" | mail -s "MySQL Backup Log for $HOST - $DATE" $MAILADDR          if [ -s "$LOGERR" ]                  then                          cat "$LOGERR" | mail -s "ERRORS REPORTED: MySQL Backup error Log for $HOST - $DATE" $MAILADDR          fi  elif [ "$MAILCONTENT" = "quiet" ]  then          if [ -s "$LOGERR" ]                  then                          cat "$LOGERR" | mail -s "ERRORS REPORTED: MySQL Backup error Log for $HOST - $DATE" $MAILADDR                          cat "$LOGFILE" | mail -s "MySQL Backup Log for $HOST - $DATE" $MAILADDR          fi  else          if [ -s "$LOGERR" ]                  then                          cat "$LOGFILE"                         echo                          echo "###### WARNING ######"                          echo "Errors reported during AutoMySQLBackup execution.. Backup failed"                          echo "Error log below.."                          cat "$LOGERR"          else                  cat "$LOGFILE"          fi  fi 

Почистим за собой:

if [ -s "$LOGERR" ]          then                  STATUS=1          else                  STATUS=0  fi     # Clean up Logfile  eval rm -f "$LOGFILE"  eval rm -f "$LOGERR"  exit $STATUS 

Теперь приведу файл конфиг для опций:

# Username to access the MySQL server e.g. dbuser  USERNAME=root     # Username to access the MySQL server e.g. password  if [ -f "/root/.mysql" ]; then      PASSWORD=`cat /root/.mysql`  else      exit 0  fi     # Host name (or IP address) of MySQL server e.g localhost  DBHOST=localhost     # List of DBNAMES for Daily/Weekly Backup e.g. "DB1 DB2 DB3"  DBNAMES="all"     # Backup directory location e.g /backups  BACKUPDIR="/var/backups/mysql"     # Mail setup  # What would you like to be mailed to you?  # - log   : send only log file  # - files : send log file and sql files as attachments (see docs)  # - stdout : will simply output the log to the screen if run manually.  # - quiet : Only send logs if an error occurs to the MAILADDR.  MAILCONTENT="quiet"     # Set the maximum allowed email size in k. (4000 = approx 5MB email [see docs])  MAXATTSIZE="4000"     # Email Address to send mail to? (user@domain.com)  MAILADDR="root" # ============================================================  # === ADVANCED OPTIONS ( Read the doc's below for details )===  #=============================================================     # List of DBBNAMES for Monthly Backups.  MDBNAMES="mysql $DBNAMES"     # List of DBNAMES to EXLUCDE if DBNAMES are set to all (must be in " quotes)  DBEXCLUDE="information_schema performance_schema "     # List of tables to exclude from the backup (in form db.table)  TABLEEXCLUDE=""     # Include CREATE DATABASE in backup?  CREATE_DATABASE=no     # Separate backup directory and file for each DB? (yes or no)  SEPDIR=yes     # Which day do you want weekly backups? (1 to 7 where 1 is Monday)  DOWEEKLY=0     # How many days keep backup  BACKUP_DAYS=3     # Choose Compression type. (gzip or bzip2)  COMP=gzip  # Compress communications between backup server and MySQL server?  COMMCOMP=no     # Additionally keep a copy of the most recent backup in a seperate directory.  LATEST=no     #  The maximum size of the buffer for client/server communication. e.g. 16MB (maximum is 1GB)  MAX_ALLOWED_PACKET=1GB  #  For connections to localhost. Sometimes the Unix socket file must be specified.  OS=`uname`  if [ "$OS" = "FreeBSD" ]; then      SOCKET=/tmp/mysql.sock  else      SOCKET=/var/lib/mysql/mysql.sock  fi     # Command to run before backups (uncomment to use)  #PREBACKUP="/etc/mysql-backup-pre"     # Command run after backups (uncomment to use)  #POSTBACKUP="/etc/mysql-backup-post"     # (если не описано, по-умолчанию так и делать)  DO_SQL_DUMP=yes  # separate table to file ?  SEPTABLE=no     # (если не описано, по-умолчанию не делать)  DO_HOT_BACKUP=no  HOT_XTRA_BACKUP=no  DO_MYDUMPER_BACKUP=no  

Мы не ставили целью «открыть Америку», но тема бекапов не перестаёт быть актуальной. И зачастую встречается так, что добавив строку в скрипт дамп базы, забываем проверить наличие ошибок в процессе дампа. Надеюсь в эта статья напомнит вам о необходимости очередной раз проверить наличие бекапов. А ты проверил свой бекап?

image

ссылка на оригинал статьи http://habrahabr.ru/company/centosadmin/blog/227533/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *