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

 

posted on 2018-12-11 15:43  shc336  阅读(208)  评论(0编辑  收藏  举报

导航