重要业务MySQL冷备解决方案

1、概述

    在公司业务里面,当对应的业务数据不是很重要的时候,我们一般会简单的写个脚本,每天半夜把数据库数据全量拉取下来,备份到本地磁盘。但当业务比较重要的时候,这样简单操作会存在许多问题,比如本地磁盘损坏。因此,为了保证数据的安全性和可恢复性,对于重要业务一般不会备份到本地磁盘。

    下面描述一下自己在工作中用到的解决方案,总体的架构图如下:DB系统为一主一从,然后第一步每天凌晨12点去备份从机上的数据;第二步凌晨1点再将备份数据库上的数据备份到公司的磁盘上。接下来根据这个架构,给出详细的备份代码:

2、详细备份方案

2.1 slave->备份服务器

采用的是mysqldump,slave数据库为InnoDB引擎。

  1 #!/bin/bash
  2 
  3 PROGRAM_NAME="cold_backup"
  4 LOG_FILE=$PROGRAM_NAME.log
  5 PID_FILE=$PROGRAM_NAME.pid
  6 
  7 LOG_LEVEL=0
  8 LOG_LEVEL_STRING=("TRACE" "DEBUG" "INFO" "WARNING" "ERROR" "FATAL")
  9 
 10 function LOG()
 11 {
 12     if [ $1 -gt $LOG_LEVEL ]; then
 13         echo "[$(date "+%y-%m-%d %H:%M:%S")][${LOG_LEVEL_STRING[$1]}]$2" >> ${LOG_DIR}$LOG_FILE
 14     fi  
 15 }
 16 
 17 function LOG_FATAL()
 18 {
 19     LOG 5 "$1"
 20 }
 21 
 22 function LOG_ERROR()
 23 {
 24     LOG 4 "$1"
 25 }
 26 
 27 function LOG_WARNING()
 28 {
 29     LOG 3 "$1"
 30 }
 31 
 32 function LOG_INFO()
 33 {
 34     LOG 2 "$1"
 35 }
 36 
 37 function LOG_DEBUG()
 38 {
 39     LOG 1 "$1"
 40 }
 41 
 42 function LOG_TRACE()
 43 {
 44     LOG 0 "$1"
 45 }
 46 
 47 # 其实不需要,因为每天就备份一次,log完全不会超过32M
 48 function shrink_file()
 49 {
 50     local file=$1
 51     if [ ! -f $file ]; then
 52         return 1
 53     fi
 54     local file_size=`du -b $file | awk '{print $1}'`
 55     if [ $? -ne 0 ]; then
 56         return 2
 57     fi
 58     max_size=32000000 #32M
 59     if [ $file_size -lt $max_size ]; then
 60         return 3
 61     fi
 62     truncate_row=$(wc -l $file | awk '{print $1}')
 63     ((truncate_row=truncate_row/2))
 64     if [ $truncate_row -ge 1 ]; then
 65         sed -i "1,${truncate_row}d" $file
 66         return 0
 67     fi
 68     return 4
 69 }
 70 
 71 function clear_file()
 72 {
 73     echo "" > $1
 74 }
 75 
 76 if [ -f $PID_FILE ]; then
 77     program_pid=`cat $PID_FILE`
 78     if [ $? -eq 0 ] && [ -n "$program_pid" ]; then
 79         if ps u -p "$program_pid" | grep -wc $PROGRAM_NAME ; then
 80             LOG_INFO "program is running, quit now"
 81             exit 0
 82         fi
 83     fi
 84 fi
 85 
 86 # XXX业务数据库 
 87 SLAVE_HOST="1.2.3.4:3306"
 88 SERVER_NAME="[ShangHai_XX_YY_ZZ_Slave]"
 89 
 90 BACKUP_DIR="/data/cold_backup"
 91 TODAY=`date '+%Y%m%d'`
 92 BACKUP_FILE=${SLAVE_HOST}_${SERVER_NAME}_${TODAY}.sql
 93 
 94 echo "$$" > $PID_FILE
 95 shrink_file $LOG_FILE
 96 LOG_INFO "--------------------START BACKUP--------------------"
 97 LOG_INFO "begindump:`date '+%y-%m-%d %H:%M:%S'`"
 98 
 99 /usr/local/services/mysql/bin/mysqldump --single-transaction --socket=/tmp/mysql_3306.sock --databases XXX数据库 > "$BACKUP_FILE"
100 rm -f $(find $BACKUP_DIR -name '*.sql' -mtime +7)
101 
102 count=`ls -l | grep $TODAY | grep sql | wc -l`
103 if [ $count -eq 0 ];then
104         # alarm, no today sql data
105         LOG_WARNING " NO cold backup"
106 fi
107 
108 LOG_INFO "enddump:`date '+%y-%m-%d %H:%M:%S'`"
109 
110 # remove pid_file
111 rm $PID_FILE
View Code

2.2 备份服务器->公司磁盘

采用rsync备份,需要备份服务器和公司磁盘之间可以直接rsync,可以通过ssh来设置。

 View Code

 

posted @ 2014-09-13 19:23  i4oolish  阅读(2378)  评论(0编辑  收藏  举报