mysql 備份

數據備份其重要性無需多言,再細想一步,我們至少需要兩種備份:一種邏輯備份(mysqldump生成sql文件);一種物理備份(xtrabackup可很好完成)。邏輯備份在出問題時能提供更細粒度的恢復和對比;物理備份在整庫範圍的數據恢復或者增加從庫方面有着更高的效率。


首先看下邏輯備份腳本,比較簡單



接下來看基於xtrabackup的物理(整庫)備份腳本。相比上面的腳本,這個就有意思點兒了(在生成備份的時候遵循了一個規則,然後在恢復腳本里加邏輯判斷實現任意時候都能一鍵恢復)

    整套功能需要 三個腳本 innobackupex_all.sh、innobackupex_increment.sh、innobackupex_restore.sh

    我們知道xtrabackup可以第一次備份全量數據,之後設置增量備份。Linux crontab以數字0-6表示"週日"-"週六"。所以,我以一週爲週期:週日進行全備,存放於0目錄;週一至週六增備,存放於1-6目錄;下次週日清空目錄重新全備。

    上面以0-6這樣的目錄名存放備份數據,是爲了讓恢復腳本innobackupex_restore.sh處理起來更方便。無論在周幾執行恢復腳本,都能正確的執行xtrabackup的恢復過程

    依percona官方文檔。xtrabackup備份至少需要以下權限:GRANT RELOAD, SUPER, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE ON *.* TO 'xtrabackup'@'localhost' identified by xxxx


計劃任務設置如下

wKiom1YjllLjfwWHAABUb2Zxa3Q422.jpg


全備腳本 innobackupex_all.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/sh
###每週日凌晨4點,執行全量備份
 
base_dir=/ljk/data
 
rm -rf $base_dir/* 2>> $base_dir/all.log    ###清空base_dir,執行全備
 
###備份並將日誌記錄於base_dir下的all.log
/usr/bin/innobackupex --user=xtrabackup --password=xtrabackup $base_dir 2>> $base_dir/all.log
 
cd $base_dir
#將以'當前時間命名的全備目錄'重命名爲'0'
mv 20* 0 2>> $base_dir/all.log


增備腳本innobackupex_increment.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh
###周1--周6凌晨4點 增量備份
 
base_dir=/ljk/data
 
today=`date +%u`
yesterday=`expr $today - 1`
 
echo -e "\n===================================\n" >> $base_dir/increment.log    ###增備日誌記錄於$base_dir/increment.log
/usr/bin/innobackupex --user=xtrabackup --password=xtrabackup --incremental $base_dir --incremental-basedir=$base_dir/$yesterday 2>> $base_dir/increment.log
 
cd $base_dir
#重命名備份文件,以0 1 2 3 4 5 6 代表週日到 週六
mv 20* $today 2>> $base_dir/increment.log


恢復腳本innobackupex_restore.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/bin/sh
 
###檢查上次命令執行是否成功的函數
function check {
   if [ $? -ne 0 ];then
        echo -e "\e[1;31m\n $1 exec failed,please check it !\e[0m \n"
        echo "$1 failed,please check it !"
        sleep 1
        exit -1
   fi
}
 
base_dir=/ljk/data
 
backup_dir=`ls -l $base_dir|grep -e "^d.*"|awk '{print $NF}'`
echo -e "the backup dir is: $backup_dir \n"
sleep 1
 
###開始恢復
 
cd $base_dir
 
echo -e "------ 準備階段 0 ------\n"
sleep 1
/usr/bin/innobackupex --apply-log --redo-only $base_dir/0
check "準備階段 0";
 
###執行除去 0 和 最後一個目錄 之外的其他目錄的恢復準備
dir_num=`ls -l $base_dir|grep -e "^d.*"|wc -l`      #取出有幾個備份目錄
 
for in `seq 1 $(($dir_num - 2))`
  do
    echo -e "------ 準備階段 $i ------ \n"
    sleep 1
    /usr/bin/innobackupex --apply-log --redo-only $base_dir/0 --incremental-dir=$base_dir/$i
    check "準備階段 $i";
done
 
###最後一個增量備份
echo -e "------ 準備階段 $(($dir_num - 1)) ------ \n"
sleep 1
/usr/bin/innobackupex --apply-log $base_dir/0 --incremental-dir=$base_dir/$(($dir_num - 1))
check "準備階段 $(($dir_num - 1))";
 
###以上步驟將所有增量備份中記錄的變化應用到了最初的全量備份中
echo -e "------ 應用所有變化到$base_dir/0 ------\n"
/usr/bin/innobackupex --apply-log $base_dir/0
check "應用所有變化到$base_dir/0"
 
###將數據考回數據目錄
echo -e "------ 將處理好的數據考回至數據目錄 ------\n"
/usr/bin/innobackupex --copy-back $base_dir/0
check "copy-back";


物理備份目錄結構截圖

wKioL1Yl0YuS9eaIAADKyyzqV00547.jpg



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