天天看點

xtra+binlog增量備份腳本(下)

四.容災測試

寫入測試資料

建立腳本,腳本将建立一個single庫,s1表,持續寫入資料。

vim /root/bin/mysql_test.sh

  1. #!/bin/bash

  2. #混合測試資料庫腳本

  3. #将建立一個single資料庫,其中建立一個s1表

  4. #如果資料庫存在,将會寫入資料,可以在寫入部分sleep 1 來讓資料持續寫入

  5. #使用方法 ./xx.sh -uroot -p'123456'

  6. #檢查

  7. mysql $*

    -e "show databases;"

    &>

    /tmp/info_error.txt

  8. if

    [[ $?

    -ne 0

    ]];then

  9. echo "time:$(date +%F-%H-%M-%S) info:登陸指令錯誤"

  10. cat /tmp/info_error.txt #如果錯誤則顯示錯誤資訊

  11. echo

  12. echo "./xx.sh -uroot -p'123456'"

  13. exit 1

  14. fi

  15. #檢查庫是否存在

  16. mysql $*

    -e "use single;"

    &>

    /tmp/info_error.txt

  17. if

    [[ $?

    -eq 0

    ]];then

  18. mysql $*

    -e "use single;select * from s1 where id=1;"

  19. if

    [[ $?

    -ne 0

    ]];then

  20. mysql $*

    -e "use single;drop table s1;"

  21. mysql $*

    -e "use single;create table s1(id int AUTO_INCREMENT PRIMARY KEY,name char(20),age int);"

  22. fi

  23. else

  24. mysql $*

    -e "create database single;"

  25. mysql $*

    -e "use single;create table s1(id int AUTO_INCREMENT PRIMARY KEY,name char(20),age int);"

  26. fi

  27. #name随機數

  28. random_name()

    {

  29. local zu=(q w e r t y u i o p a s d f g h j k l z x c v b n m)

  30. for i in

    `seq 1

    5`

  31. do

  32. local a=`echo $[RANDOM%24]`

  33. echo -n ${zu[a]}

  34. done

  35. }

  36. #age随機數

  37. random_age()

    {

  38. local a=`echo $[RANDOM%99]`

  39. echo $a

  40. }

  41. #寫入部分

  42. for i in

    `seq 1

    1000`

  43. do

  44. b=`random_name`

  45. c=`random_age`

  46. sleep 2

  47. mysql $*

    -e "use single;insert into s1(name,age) values('${b}',${c});"

  48. done

執行腳本,持續寫入測試資料

bash /root/bin/mysql_test.sh -uroot -p'123456'

模拟備份

1.開啟另一個終端,檢查資料是否在寫入

mysql -uroot -p'123456' -e "use single;select count(*) from s1;"

2.進行全備份,傳回ok正确

cd /root/bin

bash mybak-all.sh

3.模拟第一天晚上,因為在持續寫入資料,等一會再進行增量備份,并備份binlog

bash mybak-section.sh

bash mybak-binlog.sh -uback -p'123456'

4.等一會,模拟第二天晚上

bash mybak-section.sh

bash mybak-binlog.sh -uback -p'123456'

錯誤恢複

1.模拟出現問題了,停止寫入

ctl + c

2.檢視目前總資料,為129條

mysql -uroot -p'123456' -e "use single;select count(*) from s1;"

3.模拟誤删除資料庫

mysql -uroot -p'123456' -e "drop database single;"

4.對最新的狀态備份binlog

bash mybak-binlog.sh -uback -p'123456'

5.關閉mysql

systemctl stop mysql

6.删除資料目錄,否則無法恢複

rm -fr /usr/local/mysql/data/*

7.對全備份進行封裝,傳回ok正确

innobackupex --apply-log --redo-only /bak/mysql-xback/all-backup/

8.合并第一次模拟到全備份,最後一個參數是指定全備份

innobackupex --apply-log --redo-only --incremental-dir=/bak/mysql-xback/2018-12-12-14-51-26/ /bak/mysql-xback/all-backup/

9.合并第二次模拟到全備份

innobackupex --apply-log --redo-only --incremental-dir=/bak/mysql-xback/2018-12-12-14-52-47/ /bak/mysql-xback/all-backup/

10.開始恢複

innobackupex --copy-back /bak/mysql-xback/all-backup/

11.添權重限并啟動

chown -R mysql.mysql /usr/local/mysql/data/

systemctl start mysql

12.檢視資料恢複到125條,正常前是129條

mysql -uroot -p'123456' -e "use single;select count(*) from s1;"

13.檢視備份時的pos點

cat /bak/mysql-xback/2018-12-12-14-52-47/xtrabackup_info | grep binlog_pos

顯示如下

binlog_pos = filename ‘mysql-bin.000003’, position ‘1509’

14.解壓最後2個binlog壓縮包

cd /bak/mysql-binback/

tar -xf mybak-section-2018-12-12-15-07.tar.gz

tar -xf mybak-section-2018-12-12-15-15.tar.gz

15.進入第二個包,它是在最後一次增量備份後才執行的binlog

cd mybak-section-2018-12-12-15-07

将1509pos點之前的行删除,每個binlog檔案前18行要保留

mysqlbinlog mysql-bin.000003 > 03.log

cat 03.log | grep -n 1509

xtra+binlog增量備份腳本(下)

恢複資料

cat 03.log | mysql -uroot -p'123456'

目前總是為128

mysql -uroot -p'123456' -e "use single;select count(*) from s1;"

16.進入倒數第一個包,它存放出問題之前的資料

cd mybak-section-2018-12-12-15-15

将drop這個有問題的指令之後的行删除

mysqlbinlog mysql-bin.000004 > 04.log

cat 04.log | grep -n drop

xtra+binlog增量備份腳本(下)

恢複資料

cat 04.log | mysql -uroot -p'123456'

目前總是為129

mysql -uroot -p'123456' -e "use single;select count(*) from s1;"

五.重寫測試

進入到腳本目錄

cd /root/bin

執行重寫腳本

bash mybak-rewrite.sh

可以看到原先目錄隻有一個全備份

ls /bak/mysql-xback/

原先的全備份和增量備份的打包

ls -lh /bak/xback/