重要业务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
2.2 备份服务器->公司磁盘
采用rsync备份,需要备份服务器和公司磁盘之间可以直接rsync,可以通过ssh来设置。
View Code