xtrabackup備份恢復

#xtrabackup備份腳本,放在crontab每天執行。策略是每週進行一次全備,接下來6天執行增量備份,並保留上一週的一套備份。

#備份目錄會存在全備full和rec0-5 六個增量備份目錄。

#!/bin/bash 

BEGINTIME=`date +"%Y-%m-%d %H:%M:%S"` 

format_time=`date +"%Y-%m-%d_%H:%M:%S"` 

week=`date +%w` 

port=3306 

ip=192.168.1.222

backdir=/data/xtrabackup 

file_cnf=/usr/local/mysql1/my.cnf

user_name=root 

password=ffffff 

out_log=$backdir/Xtrabackup.log

time_cost=$backdir/Xtrabackup_time.txt

if [ -d "$backdir/rec5" ];then 

rm $backdir-bak -rf

        mv $backdir $backdir-bak

fi


if [ ! -f "$backdir/Xtrabackup_time.txt" ];then

mkdir $backdir

touch $backdir/Xtrabackup_time.txt

fi


#full 

if [ ! -d "$backdir/full" ];then

        echo "#####start full backup at $BEGINTIME to directory full" >>$time_cost

mkdir $backdir/full

         innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --throttle=400 --user=$user_name --password=$password --host=$ip --port=$port  $backdir/full 1> $out_log 2>&1

elif [ ! -d "$backdir/rec0" ];then 

        echo "#####start 0 incremental backup at $BEGINTIME to directory rec0" >>$time_cost 

        mkdir $backdir/rec0

innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --throttle=400 --user=$user_name --password=$password --host=$ip --port=$port --incremental --incremental-basedir=$backdir/full $backdir/rec0 1> $out_log 2>&1

elif [ ! -d "$backdir/rec1" ];then

        echo "#####start 1 incremental backup at $BEGINTIME to directory rec1" >>$time_cost

        mkdir $backdir/rec1

innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --throttle=400 --user=$user_name --password=$password --host=$ip --port=$port --incremental --incremental-basedir=$backdir/rec0 $backdir/rec1 1> $out_log 2>&1

elif [ ! -d "$backdir/rec2" ];then

        echo "#####start 2 incremental backup at $BEGINTIME to directory rec2" >>$time_cost

        mkdir $backdir/rec2

innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --throttle=400 --user=$user_name --password=$password --host=$ip --port=$port --incremental --incremental-basedir=$backdir/rec1 $backdir/rec2 1> $out_log 2>&1

elif [ ! -d "$backdir/rec3" ];then

        echo "#####start 3 incremental backup at $BEGINTIME to directory rec3" >>$time_cost

        mkdir $backdir/rec3

innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --throttle=400 --user=$user_name --password=$password --host=$ip --port=$port --incremental --incremental-basedir=$backdir/rec2 $backdir/rec3 1> $out_log 2>&1

elif [ ! -d "$backdir/rec4" ];then

        echo "#####start 4 incremental backup at $BEGINTIME to directory rec4" >>$time_cost

        mkdir $backdir/rec4

innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --throttle=400 --user=$user_name --password=$password --host=$ip --port=$port --incremental --incremental-basedir=$backdir/rec3 $backdir/rec4 1> $out_log 2>&1

elif [ ! -d "$backdir/rec5" ];then

        echo "#####start 5 incremental backup at $BEGINTIME to directory rec5" >>$time_cost

        mkdir $backdir/rec5

innobackupex --defaults-file=$file_cnf --no-timestamp --parallel=4 --throttle=400 --user=$user_name --password=$password --host=$ip --port=$port --incremental --incremental-basedir=$backdir/rec4 $backdir/rec5 1> $out_log 2>&1

 fi

 ENDTIME=`date +"%Y-%m-%d %H:%M:%S"`

 begin_data=`date -d  "$BEGINTIME" +%s`

 echo "Complete at $ENDTIME" >>$time_cost


 

恢復:

#prepare

innobackupex --defaults-file=/usr/local/mysql1/my.cnf --apply-log --redo-only --use-memory=4GB --user=root --password=fffffff  --host=192.168.1.222 --port=3306  /tmp/full

innobackupex --defaults-file=/usr/local/mysql1/my.cnf --copy-back --user=root --password=fffffff  --host=192.168.1.222 --port=3306  /tmp/full


#修改增量備份目錄,逐個apply-log,到第五天的增量rec4都是輸出都顯示innobackupex-1.5.1: completed OK!

innobackupex-1.5.1 --apply-log --redo-only --defaults-file=$file_cnf --user=$user_name --password=$password  --host=$ip --port=$port  $backdir/full --incremental-dir=$backdir/rec5


chown -R mysql.mysql data/

[root@newbidb script]# ./mysql_install_db --basedir=/u01/mysql --no-defaults --skip-name-resolve --user=mysql --datadir=/u01/mysql/data

touch  mysql.sock 並修改文件權限。



先做基於全備的apply,注意,此時使用了--redo-only

innobackupex --apply-log --redo-only --user=robin -password=xxx --port=3606 \ > --defaults-file=/etc/my3606.cnf /hotbak/full 

基於增備的apply, --此時沒有--redo-only,如果有多個增備,僅僅最後一個增備無需指定--redo-only 

innobackupex --apply-log --user=robin -password=xxx --port=3606 --defaults-file=/etc/my3606.cnf \ > /hotbak/full --incremental-dir=/hotbak/inc 

進行copy back

mv /data/inst3606/data3606 /data/inst3606/data3606bk 

mkdir -p /data/inst3606/data3606 

innobackupex --user=robin -password=xxx --port=3606 --copy-back /hotbak/full --defaults-file=/etc/my3606.cnf

chown -R mysql:mysql /data/inst3606/data3606 

啓動恢復後的實例 

mysqld_safe --defaults-file=/etc/my3606.cnf & SHELL> sql -P3606 robin@localhost[(none)]> use tempdb; 


使用binlog做完全恢復

more xtrabackup_binlog_info --從innobackupex獲得binlog的位置 inst3606bin.000014 893 --使用mysqlbinlog 追加的最新

mysqlbinlog /data/inst3606/log/bin/inst3606bin.000014 --start-position=893 \ > |mysql -urobin -pxxx -P3606 -S /tmp/mysql3606.sock 

如果是gtid

reset master

set global grid_purged='D68DBC47-3AAE-11E2-BC2F-842B2B699BDA:1-141';

在基於binlog恢復。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章