zoukankan      html  css  js  c++  java
  • MYSQL-innobackupex备份脚本

    自动化运维,是数据库管理员的不懈追求。目前出现了一些数据库自动管理平台,但出现时间较短,不够稳定。最常用的工具依然是shell脚本。

    现在需要管理的某mysql数据库,数据量在800G,使用dump备份时间过长,从而使用了网上推荐的innobackupex方式。影响备份速率的因素很多,这里就不一一讨论,也可以添加

     --parallel 参数,开启多并行度备份,但会增加服务器负荷。

    以下是我写的备份脚本,要求备份目录的磁盘容量至少是数据文件的3倍以上。

    #每天备份一次。一次全量,与两次增量,循环备份。备份保留三天。
    #!/bin/bash
    # 定义变量
    user_name=root
    password="123456"
    socket="/mysqldb/home/mysql.sock"
    file_cnf=/mysqldb/config/my.cnf
    
    
    BEGINTIME=`date +"%Y-%m-%d %H:%M:%S"`
    format_time=`date +"%Y-%m-%d_%H:%M:%S"`
    #week=`date +%Y-%m-%d -d "-24hour"`
    time=`date +"%Y-%m-%d"`
    time_old=$( date +"%Y-%m-%d" -d "-24hour" )
    backupbin=/usr/bin
    
    backdir=/mysql_backup/$time   #备份目录,数据文件形式,保留一天,第二天压缩
    old_dir=/mysql_backup/$time_old  
    redo=/mysql_backup/redofile   #留存目录,tar.gz格式
    out_log=/mysql_backup/info/xtrabackup_log_$format_time     #innobackupex输出信息日志
    time_cost=/mysql_backup/info/xtrabackup_time.txt           #innobackupex记录
    
    
    #创建目录
    
    if [ ! -d "/mysql_backup/redofile" ];
    then 
    mkdir -p /mysql_backup/redofile
    fi
    
    if [ ! -f "/mysql_backup/info/xtrabackup_time.txt" ];
    then
    mkdir -p /mysql_backup/info/
    touch /mysql_backup/info/xtrabackup_time.txt
    fi
    
    #全量、增量备份
    #如果今天有full,则创建incr1
    if [ -d "$backdir"_full ];then
    (echo "#####开始今日一次增量备份 at $BEGINTIME " ) && >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf  --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$backdir"_full "$backdir"_incr1 1> $out_log 2>&1
    tar -czvf ${redo}/redofile_"$time"_full.tar.gz "$backdir"_full >/dev/null  2>&1;
    rm -rf "$backdir"_full;
    break;
    
    #如果今天有incr1,则创建incr2
    elif [ -d "$backdir"_incr1 ];then
    (echo "#####开始今日第2次增量备份  at $BEGINTIME " ) && >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf  --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$backdir"_incr1 "$backdir"_incr2 1> $out_log 2>&1
    tar -czvf ${redo}/redofile_"$time"_incr1.tar.gz "$backdir"_incr1 >/dev/null  2>&1
    rm -rf "$backdir"_incr1;
    break;
    
    #如果昨天没有文件,则创建全量
    elif [ ! -d "$old_dir"_* ];then
    (echo "#####创建[新]全量备份 at $BEGINTIME " ) && >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket  "$backdir"_full 1> $out_log 2>&1
    break;
    
    #如果昨天有incr2,则创建full
    elif [ -d "$old_dir"_incr2 ];then
    (echo "#####覆盖[旧]备份,创建[新]全量备份 at $BEGINTIME " ) && >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket  $backdir 1> $out_log 2>&1
    mv "$backdir" "$backdir"_full
    break;
    
    #如果昨天有full,则创建incr1
    elif [ -d "$old_dir"_full ];then
    (echo "#####开始第1次增量备份  at $BEGINTIME ") && >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf  --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$old_dir"_full "$backdir"_incr1 1> $out_log 2>&1
    break;
    
    #如果昨天有incr1,则创建incr2
    elif [ -d "$old_dir"_incr1 ];then
    (echo "#####开始第2次增量备份  at $BEGINTIME " ) && >>$time_cost
    $backupbin/innobackupex --defaults-file=$file_cnf  --no-timestamp --parallel=4 --user=$user_name --password=$password --socket=$socket --incremental --incremental-basedir="$old_dir"_incr1 "$backdir"_incr2 1> $out_log 2>&1
    break;
    
    fi
    
    #对昨天的文件压缩归档,删除三天前的文件
    
    a=`ls /mysql_backup|grep "$time_old"_*`;
    
    if [ -d "$old_dir"_* ];then
    tar -czvf ${redo}/redofile_${a}.tar.gz "$old_dir"_*  >/dev/null  2>&1
    #删除已归档文件夹
    
    rm -rf "$old_dir"_* && echo "#####删除已归档的数据文件"$old_dir"" 1>>$time_cost
    break;
    fi
    
    #删除3天前的归档文件
    
    find /mysql_backup/redofile/ -mtime +3 -name "redofile_*" && echo "#####删除3天前的归档文件">>$time_cost;
    find /mysql_backup/redofile/ -mtime +3 -name "redofile_*" -exec rm -rf {} ;
    
    
    #输出时间变量
    b=`(ls /mysql_backup/${*} |grep ''-'')`
    ENDTIME=`date +"%Y-%m-%d %H:%M:%S"`
    begin_data=`date -d "$BEGINTIME" +%s`
    end_data=`date -d "$ENDTIME" +%s`
    spendtime=`expr $end_data - $begin_data`
    (echo "耗时 $spendtime sec 用于创建备份文件 $b") && >>$time_cost

    脚本写完后,加入crontab中,我设置的是每天23点30份执行

    30 23 * * * /root/innobackupex.sh

    注意脚本的执行权限

    恢复的脚本预计下周写完。

  • 相关阅读:
    objectivec 多个参数的函数的例子
    EDM 电子邮件制作规范
    一封让老总流泪的辞职申请书
    10个优秀的JavaScript参考手册
    应聘需知
    理解内联(display:inline)和浮动(float:left;)的区别
    写CSS常见错误,童鞋们注意了
    15个css常识
    经典设计网站推荐
    2011年春运电话订火车票流程
  • 原文地址:https://www.cnblogs.com/shc336/p/10077027.html
Copyright © 2011-2022 走看看