• innobackupex 恢复脚本


    此脚本需要与我前几天写的备份脚本配套才能使用

    这里也对innobackupex吐槽下,当使用innobackupex进行恢复的时候,必须要清除所有原数据文件,但是一旦恢复失败,则连实例都将丢失,不成功,则成仁。所以使用innobackupex恢复的时候一定要慎重,最好对数据文件做个冷备。

    #!/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"`
    time=`date +"%Y-%m-%d"`
    time_1=$( date +"%Y-%m-%d" -d "-24hour" )
    time_2=`date +%Y-%m-%d -d "-48hour"`
    backupbin=/usr/bin
    
    backdir=/mysql_backup/$time                                    
    old_dir=/mysql_backup/$time_1
    redo=/mysql_backup/redofile                                  
    log=/mysql_backup/info/recover_log_$time            #innobackupex输出信息日志
    
    
    if [ ! -d "$log" ];then
    touch /mysql_backup/info/recover_log_$time
    break;
    fi
    
    #我的备份定在当日凌晨开始。如果选择当日夜间,恢复的脚本需要重新规划。
    #判断备份的形式
    if [ -d "$backdir"_incr2 ];then
    (echo "#####开始二次增量恢复 `date`") &&  >>$log;
    
    #关闭数据库(已经将控制命令加入系统启动项)。
    systemctl stop mysqld;
    sleep 5;
    
    #解压出数据文件
    tar -xvf "$redo"/*_"$time_2"_* -C "$redo"/ >/dev/null  2>&1;
    sleep 2;
    tar -xvf "$redo"/*_"$time_1"_* -C "$redo"/ >/dev/null  2>&1;
    sleep 2;
    
    #prepare redo log
    (echo "#####准备全量日志  `date`") && >>$log;
    ( innobackupex --apply-log --redo-only "$redo"/mysql_backup/"$time_2"_full 1>/dev/null 2>>$log; ) && ( sleep 3; ) && ( echo "#####准备一次增量日志 `date` " && >>$log );
    
    (innobackupex --apply-log --redo-only "$redo"/mysql_backup/"$time_2"_full --incremental-dir="$redo"/mysql_backup/"$time_1"_incr1 1>/dev/null 2>>$log ) && (sleep 3 ) && ( echo "#####准备二次增量日志  `date`" && >>$log);
    
    (innobackupex --apply-log --redo-only "$redo"/mysql_backup/"$time_2"_full --incremental-dir="$backdir"_incr2  1>/dev/null 2>>$log ) && (sleep 3) && (echo "#####重做日志一致性准备完毕 `date` " && >>$log);
    
    sleep 2;
    
    #删除数据库原始data
    rm -rf /mysqldb/data/*;
    sleep 2;
    
    #copy
    (echo "#####开始重做 $format_time") && >>$log;
    (innobackupex --user=$user_name --password=$password --copy-back --datadir=/mysqldb/data/ "$redo"/mysql_backup/"$time_2"_*  1>/dev/null 2>>$log ) && (echo "#####恢复动作完毕   $format_time" && >>$log);
    
    #授权
    chown -R mysql:mysql /mysqldb/data/ ;
    
    #清理过程文件
    rm -rf "$redo"/mysql_backup ;
    
    #重启数据库
    systemctl start mysqld;
    sleep 8;#根据服务器性能设定,新能高,就设定短些
    break;
    
    
    elif [ -d "$backdir"_incr1 ];then
    (echo "#####开始一次增量恢复 $format_time" ) && >>$log;
    
    systemctl stop mysqld;
    sleep 5;
    
    tar -xvf "$redo"/*_"$time_1"_* -C "$redo"/ >/dev/null  2>&1;
    sleep 2;
    
    (echo "#####准备全量日志 $format_time" ) && >>$log;
    ( innobackupex --apply-log --redo-only "$redo"/mysql_backup/"$time_1"_full 1>/dev/null 2>>$log; ) && ( sleep 3; ) && ( echo "#####准备一次增>量日志 $format_time" && >>$log );
    sleep 1;
    
    (innobackupex --apply-log --redo-only "$redo"/mysql_backup/"$time_1"_full --incremental-dir="$backdir"_incr1  1>/dev/null 2>>$log ) && (sleep 3) && (echo "#####重做日志一致性准备完毕 $format_time " && >>$log);
    sleep 1;
    
    rm -rf /mysqldb/data/*;
    sleep 1;
    
    (echo "#####开始重做 $format_time" ) && >>$log;
    (innobackupex --user=$user_name --password=$password --copy-back --datadir=/mysqldb/data/ "$redo"/mysql_backup/"$time_1"_*  1>/dev/null 2>>$log ) && (echo "#####恢复动作完毕   $format_time" && >>$log);
    sleep 1;
    
    chown -R mysql:mysql /mysqldb/data/ ;
    
    rm -rf "$redo"/mysql_backup ;
    
    systemctl start mysqld;
    sleep 8;
    break;
    
    
    elif [ -d "$backdir"_full ];then
    (echo "#####开始全量恢复 $format_time" ) && >>$log;
    
    systemctl stop mysqld;
    sleep 5;
    
    (echo "#####准备全量日志 $format_time" ) && >>$log;
    ( innobackupex --apply-log --redo-only "$backdir"_full 1>/dev/null 2>>$log; ) && ( sleep 3; ) 
    sleep 1;
    
    rm -rf /mysqldb/data/*;
    sleep 1;
    
    (echo "#####开始重做 $format_time") && >>$log;
    (innobackupex --user=$user_name --password=$password --copy-back --datadir=/mysqldb/data/ "$backdir"_full 1>/dev/null 2>>$log ) && (echo "#####恢复动作完毕   $format_time"  >>$log);
    sleep 1;
    
    chown -R mysql:mysql /mysqldb/data/ ;
    sleep 3;
    rm -rf "$redo"/mysql_backup ;
    systemctl start mysqld;
    sleep 6; 
    break;
    fi
    
    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  $format_time ") && >>$log
    
    mysql -u$user_name -p$password -e "show databases" ; 
    
    if [ $? -ne 0 ]; then
        (echo "#####恢复失败 `date` ") && >>$log
    else
        (echo "#####恢复成功 `date` ") && >>$log
    fi
  • 相关阅读:
    ASP.NET&Spring.NET&NHibernate最佳实践(五)——第3章人事子系统(2)
    项目估算与计划不是一般的难!
    Spring.Net+NHibenate+Asp.Net mvc +ExtJs系列总结(持续更新)
    ASP.NET&Spring.NET&NHibernate最佳实践(四)——第3章人事子系统(1)
    ASP.NET&Spring.NET&NHibernate最佳实践(三)——第2章环境准备
    ASP.NET&Spring.NET&NHibernate最佳实践(六)——第3章人事子系统(3)
    ASP.NET&Spring.NET&NHibernate最佳实践(一)——目录
    Spring工作原理探秘
    ASP.NET&Spring.NET&NHibernate最佳实践(二)——第1章前言
    如何:使用线程池(C# 编程指南《msdn线程池》
  • 原文地址:https://www.cnblogs.com/shc336/p/10102610.html
Copyright © 2020-2023  润新知