• 重要业务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

  • 相关阅读:
    微信聊天框测试思路
    巧用&&和|| 让逻辑代码更简洁,逼格看起来更高一点(玩笑脸)
    获取URL中的参数
    解决移动端点击闪烁问题
    npm安装依赖包 --save-dev 和 --save; package.json的devDependencies和dependencies 的区别!
    vue-cli 3配置接口代理
    js小方法积累,将一个数组按照n个一份,分成若干数组
    web前端识别文字转语音
    html 锚点
    ES6 必须要用的数组Filter() 方法,不要再自己循环遍历了!!!
  • 原文地址:https://www.cnblogs.com/i4oolish/p/3970180.html
Copyright © 2020-2023  润新知