mysql 备份与恢复shell脚本

 mysql_backup.sh

 

#!/bin/sh

# set -x

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

BACKUP_PATH=/opt/alu/data/backup/mysql
LOG_FILE=/opt/alu/logs/3rd_party/mysql/backup.log
DATE=`date +"%Y%m%d"`
DUMP_FILE=$DATE".sql"
TGZ_FILE=$DATE".tgz"
SHELL_DIR=/opt/alu/shell/sysmgt
BAK_DAY=7

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
}

## find all database name
declare VARDB
find_db_names(){
  DB_NAMES_ALL=$(mysql -e "show databases;")
  index=0
  for DB in ${DB_NAMES_ALL}
  do
    if [[ "$DB" != "Database" ]];then
      VARDB[$index]=$DB
      let index++
    fi
  done
}
 
## delete old files
# find ${BACKUP_PATH} -mtime +${BAK_DAY} | xargs rm -rf > /dev/null 2>&1

## tgz file today exists,backup 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 
}


######### main
usage
p_echo
# check mysql server status
checkStatus

if [[ $? != 0 ]];then
  echo "Mysql server error"
  exit 1
fi

cd ${BACKUP_PATH}

if [[ $# = 0 ]];then
  find_db_names
  for arr in ${VARDB[@]}
  do
    func_mysqldump $arr
  done   
else
  for var_db_name in $@
  do
    func_mysqldump ${var_db_name}
  done 
fi

if [[ $? = 0 ]];then
  echo "Done"
else
  echo "Error"
fi

 

mysql_restore.sh

#!/bin/sh

# set -x

## it's for mysql restore
## if no file specify,it will use the backup script


BACKUP_PATH=/opt/alu/data/backup/mysql
LOG_FILE=/opt/alu/logs/3rd_party/mysql/backup.log
SHELL_DIR=/opt/alu/shell/sysmgt

## help
help(){
  echo "Usage"
  echo "1. can give a database name and a script file:"
  echo "   Usage: `basename $0` db_name script_file"
  echo
  echo "2. No parameters give:"
  echo "   Will list database and backuped file can used to restore"
}

## number match
number_match(){
  if [[ $# = 0 ]];then
    echo "Need a parameter"
    return 1   
  else
    if [[ ! $1 =~ ^[0-9]+$ ]]
    then
      return 1
    fi
    return 0
  fi
}

## make sure if mysql's status is OK
check_status(){
  `mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} ping >>/dev/null 2>&1`
  if [[ $? != 0 ]]; then
    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
    echo "Mysql is not alive,will be start now!" >> ${LOG_FILE} 
    ${SHELL_DIR}/mysql_supervise.sh start >> /dev/null 2>&1
  fi
}


## global variable
declare array

## list all database
db_names(){
  i=0
  files=$(ls -t ${BACKUP_PATH}/*.tgz)
  for file in ${files}
  do
    # nbi_db_20110920.tgz
    file_name=$(basename $file)
    # nbi_db
    db_name=${file_name%_*}
    array1[$i]=$db_name
    ((i++))
  done
  length=${#array1[@]}
  for ((i=0;i<$length;i++));do
    for ((j=$(expr $length - 1);j>$i;j--));do
      if [[ "${array1[$i]}" = "${array1[$j]}" ]];then
        unset array1[$i]
      fi
    done
  done

  index=0
  for arr in ${array1[@]}
  do
    array[$index]=$arr
    ((index++))   
  done
}


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


## global variable
declare db_select

## show database list,and get selected
func_db_select(){
  # get all database name,call function db_names()
  db_names
  db_len=${#array[@]}

  # No backup file
  if [[ $db_len = 0 ]];then
    echo "No backuped scripts under ${BACKUP_PATH},exit now."
    exit 1
  fi    

    # have files
    echo
    echo "Database below:"
    for((index=0;index<$db_len;index++))
    do
      echo
      echo "[`expr $index + 1`] "${array[$index]}
    done

    echo
    read -p "Please input the number before database name.Otherwise,exit.Input:"
    select_db_name=$REPLY
    if [[ -z ${select_db_name} ]];then
      echo
      echo "Exit now"
      exit 1
    fi

    # test if input is number
    number_match $select_db_name

    if [[ $? = 1 ]];then
      echo "Input error.Exit now"
      exit 1
    fi
    if [[ $select_db_name -lt 1 || $select_db_name -gt $db_len ]];then
      echo "Input error.Exit now"
      exit 1
    fi

    # selected database name
    db_select=${array[`expr $select_db_name - 1`]}
}


## when no parameter specify,list all backuped scripts
func_noparam(){
  # call function
    func_db_select

    I=0
    FILES=$(ls -t ${BACKUP_PATH}/${db_select}*.tgz)
    for FILE in ${FILES}
    do
      VARFILE[$I]=$(basename $FILE)
      ((I++))
    done 
    arr_len=${#VARFILE[@]}

    echo
    echo "Backuped scripts list below:"
    for((index=0;index<$arr_len;index++))
    do
      echo
      echo "[`expr $index + 1`] "${VARFILE[$index]}
    done

    echo
    read -p "Please input the number before file name. Otherwise,exit.Input:"
    select_file_name=$REPLY
    if [[ -z ${select_file_name} ]];then
      echo
      echo "Exit now"
      exit 1
    fi

    number_match $select_file_name
    if [[ $? = 1 ]];then
      echo "Input error.Exit now"
      exit 1
    fi
    if [[ $select_file_name -lt 1 || $select_file_name -gt $arr_len ]];then
      echo "Input error.Exit now"
      exit 1
    fi   

    # selected script file
    select_file=${VARFILE[`expr $select_file_name - 1`]}

    echo
    read -p "Sure to restore \"$db_select\" use \"$select_file\"? (yes or no):"
    if [[ $REPLY = "n" || $REPLY = "N" || $REPLY = "no" || $REPLY = "NO" ]]
    then
      echo "Not restore, exit now"
      exit 1
    fi
 
    # User's input correct,backup use the select script
    p_echo

    cd ${BACKUP_PATH} >> /dev/null

    tar -zxvf ${select_file} >> /dev/null
    FILE_PRE=`ls ${select_file}|cut -d "." -f1`      
    FILE_RESTORE=${FILE_PRE}".sql"

    mysql -e "CREATE DATABASE IF NOT EXISTS ${db_select};" >> ${LOG_FILE} 2>&1

    mysql ${db_select} < ${FILE_RESTORE} >> ${LOG_FILE} 2>&1

    if [[ $? = 0 ]];then
      echo "[${FILE_RESTORE}] Restore success!"
      echo "[${FILE_RESTORE}] Restore success!" >> ${LOG_FILE}
    else
      echo "[${FILE_RESTORE}] Restore fail!"
      echo "[${FILE_RESTORE}] Restore fail!" >> ${LOG_FILE}
    fi

    rm -f ${FILE_RESTORE} >> /dev/null

}


func_param(){
  read -p "Use $2 to restore to $1 now?[yes or no]:"
  if [[ "$REPLY" = "y" || "$REPLY" = "Y" || "$REPLY" = "yes" || "$REPLY" = "YES" ]];then
    p_echo
    mysql -e "CREATE DATABASE IF NOT EXISTS $1;" >> ${LOG_FILE} 2>&1
    mysql $1 < $2 >> ${LOG_FILE} 2>&1

    if [[ $? = 0 ]];then
      echo "[$1] Restore success!"
      echo "[$1] Restore success!" >> ${LOG_FILE}
    else
      echo "[$1] Restore fail!"
      echo "[$1] Restore fail!" >> ${LOG_FILE}
    fi

  else
    echo "Not restore,exit now"
    exit 1     
  fi
}


####### main
help
check_status

if [[ $# = 2 ]];then
  func_param $1 $2
else
  func_noparam
fi

if [[ $? = 0 ]];then
  echo "Done"
else
  echo "Error"
fi

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一个备份MySQL数据库的Shell脚本示例: ```bash #!/bin/bash # MySQL数据库备份脚本 # 设置备份文件名和目录 BACKUP_DIR="/var/backups/mysql" DATE=$(date +%Y-%m-%d_%H-%M-%S) DB_NAME="mydatabase" FILENAME="$BACKUP_DIR/$DB_NAME-$DATE.sql" # 设置MySQL登录信息 MYSQL_USER="root" MYSQL_PASSWORD="password" # 执行备份 mysqldump -u $MYSQL_USER -p$MYSQL_PASSWORD $DB_NAME > $FILENAME # 压缩备份文件 gzip $FILENAME # 删除7天前的备份文件 find $BACKUP_DIR -type f -name "*.gz" -mtime +7 -exec rm {} \; ``` 上述脚本将会备份名为 "mydatabase" 的MySQL数据库,并将备份文件保存在 "/var/backups/mysql" 目录下。脚本将创建一个新的备份文件名,格式为 "mydatabase-YYYY-MM-DD_HH-MM-SS.sql",其中 "YYYY-MM-DD_HH-MM-SS" 是当前日期和时间。备份完成后,脚本将使用 gzip 压缩备份文件,并删除7天前的备份文件。 请注意,为了安全起见,建议将MYSQL_USER和MYSQL_PASSWORD的值设置为有效的MySQL用户名和密码,而不是将其硬编码在脚本中。 ### 回答2: shell脚本备份MySQL数据库是一种自动化的数据库备份方式,它通过编写shell脚本来实现备份任务的执行。下面是一个简单的用于备份MySQL数据库的shell脚本示例: #!/bin/bash # 设置备份目录 BACKUP_DIR="/opt/backup/db" # 设置MySQL登录信息 DB_USER="root" DB_PASSWORD="yourpassword" # 设置备份文件名 BACKUP_FILE="db_backup_$(date +%Y%m%d%H%M%S).sql" # 创建备份目录 mkdir -p $BACKUP_DIR # 备份MySQL数据库到指定目录 mysqldump -u $DB_USER -p$DB_PASSWORD --all-databases > $BACKUP_DIR/$BACKUP_FILE # 判断备份是否成功 if [ $? -eq 0 ]; then echo "MySQL数据库备份成功,备份文件名为:$BACKUP_FILE" else echo "MySQL数据库备份失败" fi 在上述脚本中,首先定义了备份目录、MySQL登录信息和备份文件名的变量。然后,通过mkdir命令创建备份目录。接下来,使用mysqldump命令将MySQL数据库备份到指定目录,并将备份文件命名为当前日期和时间。最后,通过判断mysqldump命令执行的返回值来确定备份是否成功,并输出相应的提示信息。 使用该脚本进行MySQL数据库备份只需在终端中执行bash命令加上脚本路径即可,如:bash /path/to/backup_mysql.sh。执行完毕后,备份文件将保存在指定的备份目录中。 这种shell脚本备份MySQL数据库的方式可以自动化执行备份任务,提高工作效率,同时也方便了备份文件的管理和查找。 ### 回答3: shell脚本备份MySQL数据库是通过编写一个脚本文件来实现自动备份恢复MySQL数据库的操作。下面是一个简单的示例: #!/bin/bash # Shell脚本备份MySQL数据库 # 定义备份存储目录和时间戳 backup_dir="/path/to/backup" timestamp=$(date +%Y%m%d%H%M%S) # 定义MySQL数据库的连接参数 db_user="root" db_password="password" db_host="localhost" db_name="database_name" # 创建备份目录 if [ ! -d "$backup_dir" ]; then mkdir -p $backup_dir fi # 使用mysqldump命令备份数据库 mysqldump -u$db_user -p$db_password -h$db_host $db_name > $backup_dir/${db_name}_${timestamp}.sql # 检查备份是否成功 if [ $? -eq 0 ]; then echo "数据库备份成功!" else echo "数据库备份失败!" fi # 清理过期备份(保留最新的N个备份) backup_count=$(ls -l $backup_dir | grep -c "^-" 2>/dev/null) if [ $backup_count -gt 10 ]; then oldest_backup=$(ls -tr $backup_dir | head -1) rm -f $backup_dir/$oldest_backup fi # 恢复MySQL数据库(如果需要) # mysql -u$db_user -p$db_password -h$db_host -e "DROP DATABASE $db_name;" # mysql -u$db_user -p$db_password -h$db_host -e "CREATE DATABASE $db_name;" # mysql -u$db_user -p$db_password -h$db_host $db_name < $backup_dir/latest.sql 这个脚本的功能是备份指定的MySQL数据库,将备份文件保存到指定的目录中,并可根据需要恢复数据库。脚本中使用了mysqldump命令来导出数据库,并使用mysql命令来恢复数据库。备份文件保留最新的10个,超过数量的将自动删除最旧的备份文件。可以根据实际需求修改备份目录、数据库连接参数和保留备份数量等设置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值