`

mysql自动备份与恢复SHELL脚本(1)

 
阅读更多
此文备份脚本是备一个数据库,恢复时列出之前备份的脚本文件名称列表,用户选择恢复哪个备份文件,然后此文件被恢复到数据库。


完成这个脚本后的第二天跟领导说只备份一个数据库的事,领导说所有库都要备份。于是立马修改脚本。修改后是这样子:

备份脚本mysql_backup.sh运行时带参数指明要备份的数据库,备份完成后文件名是dbname_20110924.tgz这种。

然后恢复时,如果没带参数,将根据备份目录下文件名,可以得到所有的dbname,显示db name列表,让用户选择是恢复哪个数据库;最后,根据所选数据库名,显示出以该dbname打头的备份文件列表,用户再选择将哪个备份文件恢复到所选数据库。
如果带了2个参数,第一个参数是数据库名第二个是sql脚本文件名,直接恢复就OK了。
具体脚本,请看mysql自动备份与恢复SHELL脚本(2)

备份文件存放路径:
/opt/alu/data/backup/mysql

备份与恢复产生的日志文件:
/opt/alu/logs/3rd_party/mysql/backup.log



备份SHELL脚本:mysql_backup.sh
#!/bin/sh

# set -x

## this script is for auto mysql backup
## the backup files will be keeped for 10 days
## backup dir: /opt/alu/data/backup/mysql/
## log file: /opt/alu/logs/3rd_party/mysql/backup.log

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

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
`mysqladmin -u${MYSQL_USER} -p${MYSQL_PWD} 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 >> /dev/null 2>&1
fi

# mysql not running ok, exit
if [ $? != 0 ]; then
  echo "Mysql error"
  exit 1
fi

## delete old files
find ${BACKUP_PATH} -mtime +${BAK_DAY} | xargs rm -rf >> /dev/null 2>&1

## tgz file today exists,delete it
if [ -f ${BACKUP_PATH}/${TGZ_FILE} ]; then
  echo "[${BACKUP_PATH}/${TGZ_FILE}] Backup file is exists,will be backup as .bak" >> ${LOG_FILE}
  cp ${BACKUP_PATH}/${TGZ_FILE} ${BACKUP_PATH}/${TGZ_FILE}".bak" >> ${LOG_FILE}
  rm -f ${BACKUP_PATH}/${TGZ_FILE} >> /dev/null 2>&1
fi

cd ${BACKUP_PATH}
mysqldump -u${MYSQL_USER} -p${MYSQL_PWD} --opt ${DB_NAME} > ${DUMP_FILE}
tar -czvf ${TGZ_FILE} ${DUMP_FILE} >> ${LOG_FILE} 2>&1
echo "[${TGZ_FILE}] Backup success!" >> ${LOG_FILE}
rm -rf ${DUMP_FILE} >> /dev/null 2>&1
echo "Done"






恢复脚本 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
DB_NAME=test
MYSQL_USER=nbiopsuser
MYSQL_PWD=nbiopsuser


## 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
}

# mysql not running ok, exit  
if [ $? != 0 ]; then  
  echo "Mysql error"  
  exit 1  
fi  

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}
}


## when no parameter specify,list all backuped scripts
res_noparam(){
  let I=0
  FILES=`ls -t ${BACKUP_PATH}/*.tgz`
  for FILE in ${FILES}
  do
    VARFILE[$I]=$(basename $FILE)
    let I++
  done  
  arr_len=${#VARFILE[*]}
  if [ ${arr_len} != 0 ];then
    echo
    echo "Backuped scripts list below:"
    let index1=0
    while [ ${index1} -lt ${arr_len} ]
    do
      echo
      echo "[$(expr ${index1} + 1)] "${VARFILE[${index1}]}
      let index1++
    done
    echo
    read -p "Please input the number before file name. Otherwise,exit.Input:"
    select=$REPLY
    if [ -z ${select} ];then
      echo
      echo "Exit now"
      exit 1
    fi
    let index2=1
    let flag=1
    while [ ${index2} -le ${arr_len} ]
    do
      if [ "${select}" = "${index2}" ];then
        let flag=0
        break
      else 
        let index2++
        continue
      fi      
    done
    # User's input error,exit
    if [ ${flag} = 1 ];then
      echo
      echo "Exit now"
      exit 1      
    fi
    # User's input correct,backup use the select script
    p_echo
    cd ${BACKUP_PATH} >> /dev/null
    tar -zxvf ${VARFILE[$(expr ${select} - 1)]} >> /dev/null
    FILE_PRE=`ls ${VARFILE[$(expr ${select} - 1)]}|cut -d "." -f1`       
    FILE_RESTORE=${FILE_PRE}".sql"
    mysql -u${MYSQL_USER} -p${MYSQL_PWD} -e "CREATE DATABASE IF NOT EXISTS ${DB_NAME};" >> ${LOG_FILE} 2>&1
    mysql -u${MYSQL_USER} -p${MYSQL_PWD} ${DB_NAME} < ${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
    return $?
  else
    echo "No backuped scripts under ${BACKUP_PATH},exit now."
    exit 1    
  fi
}


res_param(){
  if [ -f $1 ]; then
    read -p "Use $1 to restore now?[yes or no]:"
    if [[ "$REPLY" = "y" || "$REPLY" = "Y" || "$REPLY" = "yes" || "$REPLY" = "YES" ]];then
      p_echo
      mysql -u${MYSQL_USER} -p${MYSQL_PWD} -e "CREATE DATABASE IF NOT EXISTS ${DB_NAME};" >> ${LOG_FILE} 2>&1
      mysql -u${MYSQL_USER} -p${MYSQL_PWD} ${DB_NAME} < $1 >> ${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
      return $?
    else
      echo "Not restore,exit now"
      exit 1      
    fi
  else
    echo
    echo "File error!" 
    echo
    echo 'List files under '"'${BACKUP_PATH}'"' now'
    res_noparam
  fi  
}


##### main
check_status
if [ $# != 0 ];then
  res_param $1
else
 res_noparam 
fi
echo "Done"




分享到:
评论
2 楼 hardwin 2011-09-24  
另外,脚本里面的mysql_supervise.sh start 只是个启动和停止Mysql服务的脚本,它的目的是监控mysql是否异常退出的。因为我们是用它启动服务,启动时会在一个目录下生成一个以当前Pid命名的文件;用它停止服务时,会删除该pid命名文件。而如果服务不是通过此脚本停止的,文件就不会删,因此判断服务是异常终止,于是去启动服务。
1 楼 hardwin 2011-09-24  
由于本人基础有限,写脚本有点仓促,于是脚本里面冗余很多,有的验证完全可以用正则来做,但因为不会,就采用很傻瓜的方式,挨个判断用户所输的列表编号是否正确。

相关推荐

    基于xtrabackup的MySQL数据库备份及还原Shell脚本.zip

    了解这些基本概念后,你可以查看压缩包内的`基于xtrabackup的MySQL数据库备份及还原Shell脚本`,这个脚本将详细展示如何结合`xtrabackup`和Shell来自动化MySQL数据库的备份与还原流程。在实际使用时,你需要根据自己...

    Linux下mysql数据库备份以及恢复shell脚本

    本篇将详细阐述如何使用Shell脚本来实现MySQL数据库的备份与恢复。 首先,让我们分析提供的两个脚本文件: 1. `datarestore.sh`:这个脚本通常用于执行数据库恢复操作。它可能包含了连接到MySQL服务器,选择要恢复...

    MySQL(Docker) 自动备份 Shell 脚本

    今天这个备份分二个版本一个是linux上直接安装的mysql,另一种是docker上安装的mysql。基本操作都一样只是备份sql语句不同而已。可以选择设置需要备份的库,自动备份压缩,自动删除 7 天前的备份,需要使用 crontab ...

    xtrabackup备份恢复shell脚本

    《Xtrabackup备份与恢复:Shell脚本详解》 ...总结,Xtrabackup结合Shell脚本提供了一套强大的MySQL备份恢复解决方案,能够应对各种复杂的业务场景。理解并熟练掌握这一工具,对于保障数据库的安全运行具有重要意义。

    Mysql备份可以执行的shell脚本

    下面我们将深入探讨如何利用shell脚本来执行MySQL备份。 首先,我们需要理解MySQL备份的基本类型:全量备份和增量备份。全量备份是指备份整个数据库或所有选定的数据库,而增量备份则仅备份自上次备份以来发生更改...

    Linux下Mysql自动备份脚本

    Linux下自动备份Mysql文件shell脚本。

    MySQL 自动备份 Shell 脚本

    今天这个备份分二个版本一个是linux上直接安装的mysql,另一种是docker上安装的mysql。基本操作都一样只是备份sql语句不同而已。可以选择设置需要备份的库,自动备份压缩,自动删除 7 天前的备份,需要使用 crontab ...

    mysql自动备份shell脚本

    以下是一些关于如何创建和使用MySQL自动备份shell脚本的详细说明: 首先,我们需要一个能够执行备份、压缩、清理旧备份并(可选地)将备份文件传输到远程位置或发送电子邮件通知的脚本。以下两个示例提供了不同选项...

    mysql自动实现备份脚本

    "mysql自动实现备份脚本" 提供了一种高效的方法,通过编写Bash shell脚本来自动化这一过程。下面将详细介绍这个脚本的工作原理、重要性以及如何配置和使用。 1. **Bash脚本简介** Bash是Unix和Linux系统中的默认...

    mysql数据库备份shell脚本,每天备份,只保留30天的备份数据

    mysql数据库备份shell脚本,每天备份,只保留30天的备份数据

    Linux下定时备份MySQL数据库的Shell脚本.pdf

    本文档介绍了一个用于在Linux环境下自动备份MySQL数据库的Shell脚本。通过利用Cron定时任务功能,该脚本能够在特定时间自动运行,完成数据库的备份操作。以下是该脚本的主要组成部分及功能说明: ##### 2.1 变量...

    mysql自动备份数据库脚本

    在本场景中,我们有一个名为`auto_mysql_back.sh`的shell脚本,它用于自动化MySQL数据库的备份过程。下面将详细解释这个脚本可能涉及的关键知识点。 1. **MySQL数据库备份**: - **全量备份**:通常,全量备份是指...

    shell脚本实现mysql定时备份、删除、恢复功能

    通过上述的步骤,我们可以利用Shell脚本实现MySQL的自动备份和恢复。在实际操作中,需要确保备份用户有足够的权限执行`mysqldump`操作,同时也需要调整备份策略,比如备份间隔、保留时间等,以满足实际的业务需求。 ...

    shell脚本编程100例

    shell脚本可以用于mysql备份、传输、删除,例如使用shell脚本编写一个mysql备份、传输、删除的程序,实现自动化数据库管理。 自动备份mysql库文件 shell脚本可以用于自动备份mysql库文件,例如使用shell脚本编写一...

    109个shell脚本合集.pdf

    Shell脚本可以自动备份数据库,以便在需要时恢复数据。 4. MySQL数据库备份多循环 这个脚本可以备份多个MySQL数据库,这在实际应用中非常有用。我们使用mysqldump命令来备份数据库,并将备份文件保存到指定的目录...

    mysql数据迁移,本资源用shell脚本自动完成,人机交互

    MySQL数据迁移是一个重要的...总结来说,通过编写Shell脚本自动化MySQL数据迁移,我们可以提高效率,减少错误,并实现定制化的迁移策略。理解这些基本原理和操作后,你可以根据自己的需求创建适应各种情况的迁移脚本。

    MySQL的自动备份与恢复(mysqlhotcopy)

    本文将详细介绍MySQL数据库的自动备份与恢复策略,特别是在数据库遭到破坏后进行数据恢复的方法,以及如何通过Shell脚本实现整个备份恢复流程的自动化。 ### MySQL自动备份与恢复的重要性 在数据库服务器搭建完成后...

    mysql备份shell脚本

    backup mysql databases and keep newest 5 days backup

    mysql自动备份脚本

    在本文中,我们将深入探讨MySQL自动备份脚本的原理、编写方法以及如何利用shell脚本来实现这一功能。 首先,理解MySQL备份的必要性至关重要。数据库是任何应用程序的核心,其中存储着关键的业务数据。因此,定期...

    mysql数据库自动备份脚本

    mysql数据库定期自动备份的shell脚本。如定期每三天自动备份数据库,并只保存20份备份文件,多余的删除。

Global site tag (gtag.js) - Google Analytics