mysql備份shell腳本(2)

可帶參數,是用來存放備份文件的路徑。也可不帶參數,此時會有選擇菜單:是備份所有庫還是一個庫(一個庫時會要求輸入備份的庫的名字。同時也需要輸入存放備份文件的路徑。

 

#!/bin/sh

# set -x

## this script is for auto mysql backup
## log file: /opt/alu/logs/3rd_party/mysql/backup.log

declare db_names
LOG_FILE=/opt/alu/logs/3rd_party/mysql/backup.log
DATE=`date +"%Y%m%d%H%M%S"`
DUMP_FILE=$DATE".sql"
TGZ_FILE=$DATE".tgz"
SHELL_DIR=/opt/alu/shell/sysmgt

usage(){
  echo "Usage:`basename $0`"
  echo "OR    `basename $0` DB1 [DB2 DB3...]"
}

log_success_msg(){
  echo " SUCCESS! $@"
}

log_failure_msg(){
  echo " ERROR! $@"
}


p_echo(){
  echo >> ${LOG_FILE}
  echo "-------------Backup-------------" >> ${LOG_FILE}
  echo `date +"%Y-%m-%d %H:%M:%S"` >> ${LOG_FILE}
  echo "-------------Backup-------------" >> ${LOG_FILE}
  echo >> ${LOG_FILE}
}

## check mysql pid, and kill it
checkProcess(){
  PIDS=`ps -ef|grep mysqld|grep -v grep|grep 3306|awk '{print $2}'`
  if [ -n ${PIDS} ]; then
    for pid in ${PIDS}
    do
      kill -9 ${pid}
    done
  fi   
}

## check mysql service, make sure it's alive
checkStatus(){
  `mysqladmin ping > /dev/null 2>&1`
  if [[ $? != 0 ]]; then
    checkProcess
    echo "mysql is not alive,will be start now!" >> ${LOG_FILE}
    ${SHELL_DIR}/mysql_supervise.sh start >> ${LOG_FILE} 2>&1
  fi
  if [[ $? != 0 ]];then
    echo "Mysql server error"
    exit 1
  fi
}

## find all database name
find_db_names(){
  DB_NAMES_ALL=$(mysql -e "show databases;")
  index=0
  for DB in ${DB_NAMES_ALL}
  do
    if [[ "$DB" != "Database" ]];then
      db_names[$index]=$DB
      let index++
    fi
  done
}
 
## tgz file today exists,delete it
delete_old_file(){
  if [ -f $1 ]; then
    echo "[$1] Backup file is exists,will be delete" >> ${LOG_FILE}
    rm -f $1 > /dev/null 2>&1
  fi
}

## mysqldump function
func_mysqldump(){
  db_dump_file=$1"_"$DUMP_FILE
  db_tgz_file=$1"_"$TGZ_FILE

  #delete_old_file $db_tgz_file

  mysqldump -q --add-drop-table --single-transaction --lock-tables=false $1 > $db_dump_file
  tar -czvf $db_tgz_file $db_dump_file > /dev/null
  echo "[${db_tgz_file}] Backup success!" >> ${LOG_FILE}   
  rm -rf $db_dump_file > /dev/null 2>&1 
}


## backup all db
backup_all(){
  echo -e "Please enter the directory for save the backup file:"  
  read dir
  if [[ ! -d $dir ]];then
    log_failure_msg "directory error!"
    exit 1
  fi
  # find all db name
  find_db_names
  echo
  cd $dir
  echo "backup............."
  for arr in ${db_names[@]}
  do
    func_mysqldump $arr    
  done 
  echo "Finish"
}

## backup one db user specified
backup_one(){
  echo -e "Please enter the db name you want to backup:"
  read dbname
  find_db_names
  flag=1
  for arr in ${db_names[@]}
  do
    if [[ $dbname = $arr ]];then
      flag=0
      break
    else
      flag=1
      continue
    fi
  done
  if [[ $flag = 1 ]];then
    log_failure_msg "db not exist!"
    exit 1
  fi
  
  echo -e "Please enter the directory for save the backup file:"
  read dir
  if [[ ! -d $dir ]];then
    log_failure_msg "directory error!"
    exit 1
  fi
  echo
 
  # others,all right
  cd $dir
  echo "backup.................."
  func_mysqldump $dbname
  echo "Finish"
}

## for one parameter
has_param(){
  dir=$1
  if [[ ! -d $dir ]];then
    log_failure_msg "directory error!"
    exit 1
  fi

  # find all db name
  find_db_names
  cd $dir
  for arr in ${db_names[@]}
  do
    func_mysqldump $arr
  done
  exit $?
}

menu(){
  echo
  PS3="Please select: "
  select t in "backup all" "backup one db" "exit"
  do
    case $t in
     'backup all')
      backup_all
      exit $?
      ;;
      'backup one db')
      backup_one
      exit $?
      ;;
      *)
      exit 1
      ;;
    esac
  done
}


######### main

main(){
  p_echo
  checkStatus
  if [[ $# != 0 ]];then
    has_param $@
  else
    menu
  fi
}

main $@

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章