xtrabackup自动备份脚本

[sql]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #backup.sh  
  2. #!/bin/sh  
  3. #on xtrabackup 2.2.8  
  4. # 第一次执行它的时候它会检查是否有完全备份,否则先创建一个全库备份  
  5. # 当你再次运行它的时候,它会根据脚本中的设定来基于之前的全备或增量备份进行增量备份  
  6. #ocpyang@126.com  
  7.   
  8. INNOBACKUPEX_PATH=innobackupex  #INNOBACKUPEX的命令  
  9. INNOBACKUPEXFULL=/usr/local/xtrabackup/bin/$INNOBACKUPEX_PATH  #INNOBACKUPEX的命令路径  
  10.   
  11. #mysql目标服务器以及用户名和密码  
  12. MYSQL_CMD="--host=192.168.5.189 --user=root --password=password --port=3306"    
  13.   
  14. MYSQL_UP=" --user=root --password='password' --port=3306 "  #mysqladmin的用户名和密码  
  15.   
  16. TMPLOG="/tmp/innobackupex.$$.log"  
  17.   
  18. MY_CNF=/usr/local/mysql/my.cnf #mysql的配置文件  
  19.   
  20. MYSQL=/usr/bin/mysql  
  21.   
  22. MYSQL_ADMIN=/usr/bin/mysqladmin  
  23.   
  24. BACKUP_DIR=/backup # 备份的主目录  
  25.   
  26. FULLBACKUP_DIR=$BACKUP_DIR/full # 全库备份的目录  
  27.   
  28. INCRBACKUP_DIR=$BACKUP_DIR/incre # 增量备份的目录  
  29.   
  30. FULLBACKUP_INTERVAL=86400 # 全库备份的间隔周期,时间:秒  
  31.   
  32. KEEP_FULLBACKUP=1 # 至少保留几个全库备份  
  33.   
  34. logfiledate=backup.`date +%Y%m%d%H%M`.txt  
  35.   
  36. #开始时间  
  37. STARTED_TIME=`date +%s`  
  38.   
  39.   
  40.   
  41. #############################################################################  
  42.   
  43. # 显示错误并退出  
  44.   
  45. #############################################################################  
  46.   
  47. error()  
  48. {  
  49.     echo "$1" 1>&2  
  50.     exit 1  
  51. }  
  52.   
  53.    
  54.   
  55. # 检查执行环境  
  56.   
  57. if [ ! -x $INNOBACKUPEXFULL ]; then  
  58.   error "$INNOBACKUPEXFULL未安装或未链接到/usr/bin."  
  59. fi  
  60.   
  61.    
  62.   
  63. if [ ! -d $BACKUP_DIR ]; then  
  64.   error "备份目标文件夹:$BACKUP_DIR不存在."  
  65. fi  
  66.   
  67.    
  68.   
  69. mysql_status=`netstat -nl | awk 'NR>2{if ($4 ~ /.*:3306/) {print "Yes";exit 0}}'`  
  70.   
  71. if [ "$mysql_status" != "Yes" ];then  
  72.     error "MySQL 没有启动运行."  
  73. fi  
  74.   
  75.   
  76.   
  77.    
  78.   
  79. if ! `echo 'exit' | $MYSQL -s $MYSQL_CMD` ; then  
  80.  error "提供的数据库用户名或密码不正确!"  
  81. fi  
  82.   
  83.    
  84.   
  85. # 备份的头部信息  
  86.   
  87. echo "----------------------------"  
  88. echo  
  89. echo "$0: MySQL备份脚本"  
  90. echo "开始于: `date +%F' '%T' '%w`"  
  91. echo  
  92.   
  93.    
  94.   
  95. #新建全备和差异备份的目录  
  96.   
  97. mkdir -p $FULLBACKUP_DIR  
  98. mkdir -p $INCRBACKUP_DIR  
  99.   
  100.   
  101.   
  102. #查找最新的完全备份  
  103. LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`  
  104.   
  105.    
  106.   
  107. # 查找最近修改的最新备份时间  
  108.   
  109. LATEST_FULL_BACKUP_CREATED_TIME=`stat -c %Y $FULLBACKUP_DIR/$LATEST_FULL_BACKUP`  
  110.   
  111.   
  112. #如果全备有效进行增量备份否则执行完全备份  
  113. if [ "$LATEST_FULL_BACKUP" -a `expr $LATEST_FULL_BACKUP_CREATED_TIME + $FULLBACKUP_INTERVAL + 5` -ge $STARTED_TIME ] ; then  
  114.     # 如果最新的全备未过期则以最新的全备文件名命名在增量备份目录下新建目录  
  115.     echo -e "完全备份$LATEST_FULL_BACKUP未过期,将根据$LATEST_FULL_BACKUP名字作为增量备份基础目录名"  
  116.     echo "                     "  
  117.     NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP  
  118.     mkdir -p $NEW_INCRDIR  
  119.   
  120.     # 查找最新的增量备份是否存在.指定一个备份的路径作为增量备份的基础  
  121.     LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n"  | sort -nr | head -1`  
  122.         if [ ! $LATEST_INCR_BACKUP ] ; then  
  123.             INCRBASEDIR=$FULLBACKUP_DIR/$LATEST_FULL_BACKUP  
  124.             echo -e "增量备份将以$INCRBASEDIR作为备份基础目录"  
  125.             echo "                     "  
  126.         else  
  127.             INCRBASEDIR=$INCRBACKUP_DIR/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}  
  128.             echo -e "增量备份将以$INCRBASEDIR作为备份基础目录"  
  129.             echo "                     "  
  130.         fi  
  131.   
  132.     echo "使用$INCRBASEDIR作为基础本次增量备份的基础目录."  
  133.     $INNOBACKUPEXFULL --defaults-file=$MY_CNF --use-memory=4G $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMPLOG 2>&1  
  134.   
  135.     #保留一份备份的详细日志  
  136.   
  137.     cat $TMPLOG>/backup/$logfiledate  
  138.   
  139.     if [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then  
  140.      echo "$INNOBACKUPEX命令执行失败:"; echo  
  141.      echo -e "---------- $INNOBACKUPEX_PATH错误 ----------"  
  142.      cat $TMPLOG  
  143.      rm -f $TMPLOG  
  144.      exit 1  
  145.     fi  
  146.   
  147.     THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`  
  148.     rm -f $TMPLOG  
  149.   
  150.   
  151.     echo -n "数据库成功备份到:$THISBACKUP"  
  152.     echo  
  153.   
  154.     # 提示应该保留的备份文件起点  
  155.   
  156.     LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`  
  157.   
  158.     NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP  
  159.   
  160.     LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n"  | sort -nr | head -1`  
  161.   
  162.     RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}  
  163.   
  164.     RES_INCRE_BACKUP=`dirname ${INCRBACKUP_DIR}/${LATEST_FULL_BACKUP}/${LATEST_INCR_BACKUP}`  
  165.   
  166.     echo  
  167.     echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色  
  168.     echo -e "必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}和${RES_INCRE_BACKUP}目录中所有增量备份."  
  169.     echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色  
  170.     echo  
  171.   
  172.   
  173.   
  174. else  
  175.     echo  "*********************************"  
  176.     echo -e "正在执行全新的完全备份...请稍等..."  
  177.     echo  "*********************************"  
  178.     $INNOBACKUPEXFULL --defaults-file=$MY_CNF  --use-memory=4G  $MYSQL_CMD $FULLBACKUP_DIR > $TMPLOG 2>&1   
  179.     #保留一份备份的详细日志  
  180.   
  181.     cat $TMPLOG>/backup/$logfiledate  
  182.   
  183.   
  184.     if [ -z "`tail -1 $TMPLOG | grep 'innobackupex: completed OK!'`" ] ; then  
  185.      echo "$INNOBACKUPEX命令执行失败:"; echo  
  186.      echo -e "---------- $INNOBACKUPEX_PATH错误 ----------"  
  187.      cat $TMPLOG  
  188.      rm -f $TMPLOG  
  189.      exit 1  
  190.     fi  
  191.   
  192.        
  193.     THISBACKUP=`awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" $TMPLOG`  
  194.     rm -f $TMPLOG  
  195.   
  196.     echo -n "数据库成功备份到:$THISBACKUP"  
  197.     echo  
  198.   
  199.     # 提示应该保留的备份文件起点  
  200.   
  201.     LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`  
  202.   
  203.     RES_FULL_BACKUP=${FULLBACKUP_DIR}/${LATEST_FULL_BACKUP}  
  204.   
  205.     echo  
  206.     echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色  
  207.     echo -e "无增量备份,必须保留$KEEP_FULLBACKUP份全备即全备${RES_FULL_BACKUP}."  
  208.     echo -e '\e[31m NOTE:---------------------------------------------------------------------------------.\e[m' #红色  
  209.     echo  
  210.   
  211. fi  
  212.   
  213.   
  214.   
  215.   
  216.   
  217.   
  218. #删除过期的全备  
  219.   
  220. echo -e "find expire backup file...........waiting........."  
  221. echo -e "寻找过期的全备文件并删除">>/backup/$logfiledate  
  222. for efile in $(/usr/bin/find $FULLBACKUP_DIR/ -mtime +6)  
  223. do  
  224.     if [ -d ${efile} ]; then  
  225.     rm -rf "${efile}"  
  226.     echo -e "删除过期全备文件:${efile}" >>/backup/$logfiledate  
  227.     elif [ -f ${efile} ]; then  
  228.     rm -rf "${efile}"  
  229.     echo -e "删除过期全备文件:${efile}" >>/backup/$logfiledate  
  230.     fi;  
  231.       
  232. done  
  233.   
  234. if [ $? -eq "0" ];then  
  235.    echo  
  236.    echo -e "未找到可以删除的过期全备文件"  
  237. fi  
  238.   
  239.   
  240.   
  241. echo  
  242. echo "完成于: `date +%F' '%T' '%w`"  
  243. exit 0  
  244.   
  245.   
  246.   
  247.   
  248.   
  249. -------------------------执行结果如:  
  250. Warning: Using a password on the command line interface can be insecure.  
  251. ----------------------------  
  252.   
  253.   
  254. ./backup.sh: MySQL备份脚本  
  255. 开始于: 2015-04-03 16:35:11 5  
  256.   
  257.   
  258. *********************************  
  259. 正在执行全新的完全备份...请稍等...  
  260. *********************************  
  261. 数据库成功备份到:/backup/full/2015-04-03_16-35-11  
  262.   
  263.   
  264.  NOTE:---------------------------------------------------------------------------------.  
  265. 无增量备份,必须保留1份全备即全备/backup/full/2015-04-03_16-35-11.  
  266.  NOTE:---------------------------------------------------------------------------------.  
  267.   
  268.   
  269. find expire backup file...........waiting.........  
  270.   
  271.   
  272. 未找到可以删除的过期全备文件  
  273.   
  274.   
  275. 完成于: 2015-04-03 16:35:25 5  
  276. ./backup.sh: MySQL备份脚本  
  277. 开始于: 2015-04-03 16:35:50 5  
  278.   
  279.   
  280. 完全备份2015-04-03_16-35-11未过期,将根据2015-04-03_16-35-11名字作为增量备份基础目录名  
  281. <span style="white-space:pre">                    </span>     
  282. 增量备份将以/backup/full/2015-04-03_16-35-11作为备份基础目录  
  283. <span style="white-space:pre">                    </span>     
  284. 使用/backup/full/2015-04-03_16-35-11作为基础本次增量备份的基础目录.  
  285. 数据库成功备份到:/backup/incre/2015-04-03_16-35-11/2015-04-03_16-35-50  
  286.   
  287.   
  288.  NOTE:---------------------------------------------------------------------------------.  
  289. 必须保留1份全备即全备/backup/full/2015-04-03_16-35-11和/backup/incre/2015-04-03_16-35-11目录中所有增量备份.  
  290.  NOTE:---------------------------------------------------------------------------------.  
  291.   
  292.   
  293. find expire backup file...........waiting.........  
  294.   
  295.   
  296. 未找到可以删除的过期全备文件  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值