天天看點

兩套mysql備份腳本

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

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

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

<code>#!/bin/sh</code>

<code>###每天運作一次</code>

<code>###定義使用者 密碼 備份目錄等資訊</code>

<code>user=mysqldump</code>

<code>psd=mysqldump</code>

<code>backup_base=</code><code>/data/mysql_backup</code>

<code>date</code><code>=`</code><code>date</code> <code>+%Y%m%d`</code>

<code>old_date=`</code><code>date</code> <code>+%Y%m%d -d -30days`    </code><code>###儲存的天數</code>

<code>###擷取庫名,排除不需要備份的庫</code>

<code>for</code> <code>db </code><code>in</code> <code>`mysql -u$user -p$psd -s -N -e </code><code>"show databases"</code><code>|</code><code>grep</code> <code>-</code><code>v</code> <code>-E </code><code>"(test|percona|information_schema|performance_schema)"</code><code>`</code>

<code>do</code>

<code>  </code><code>###建立備份目錄</code>

<code>  </code><code>if</code> <code>[ ! -d $backup_base/$db ];</code><code>then</code>

<code>    </code><code>mkdir</code> <code>$backup_base/$db</code>

<code>  </code><code>fi</code>

<code> </code> 

<code>  </code><code>cd</code> <code>$backup_base/$db</code>

<code>  </code><code>chattr -i ./*    </code>

<code>  </code><code>rm</code> <code>-f $old_date.sql* &amp;&gt;</code><code>/dev/null</code>     <code>#删除30天以前的</code>

<code>  </code><code>mysqldump -u$user -p$psd --events --routines  $db |</code><code>gzip</code> <code>&gt; $</code><code>date</code><code>.sql.gz    </code><code>###備份&amp;壓縮</code>

<code>  </code><code>chattr +i ./*    </code><code>###這裡加了個防誤删的屬性</code>

<code>done</code>

接下來看基于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

計劃任務設定如下

<a href="http://s3.51cto.com/wyfs02/M02/74/9C/wKiom1YjllLjfwWHAABUb2Zxa3Q422.jpg" target="_blank"></a>

全備腳本 innobackupex_all.sh

<code>###每周日淩晨4點,執行全量備份</code>

<code>base_dir=</code><code>/ljk/data</code>

<code>rm</code> <code>-rf $base_dir/* 2&gt;&gt; $base_dir</code><code>/all</code><code>.log    </code><code>###清空base_dir,執行全備</code>

<code>###備份并将日志記錄于base_dir下的all.log</code>

<code>/usr/bin/innobackupex</code> <code>--user=xtrabackup --password=xtrabackup $base_dir 2&gt;&gt; $base_dir</code><code>/all</code><code>.log</code>

<code>cd</code> <code>$base_dir</code>

<code>#将以'目前時間命名的全備目錄'重命名為'0'</code>

<code>mv</code> <code>20* 0 2&gt;&gt; $base_dir</code><code>/all</code><code>.log</code>

增備腳本innobackupex_increment.sh

<code>###周1--周6淩晨4點 增量備份</code>

<code>today=`</code><code>date</code> <code>+%u`</code>

<code>yesterday=`</code><code>expr</code> <code>$today - 1`</code>

<code>echo</code> <code>-e </code><code>"\n===================================\n"</code> <code>&gt;&gt; $base_dir</code><code>/increment</code><code>.log    </code><code>###增備日志記錄于$base_dir/increment.log</code>

<code>/usr/bin/innobackupex</code> <code>--user=xtrabackup --password=xtrabackup --incremental $base_dir --incremental-basedir=$base_dir/$yesterday 2&gt;&gt; $base_dir</code><code>/increment</code><code>.log</code>

<code>#重命名備份檔案,以0 1 2 3 4 5 6 代表周日到 周六</code>

<code>mv</code> <code>20* $today 2&gt;&gt; $base_dir</code><code>/increment</code><code>.log</code>

恢複腳本innobackupex_restore.sh

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

<code>###檢查上次指令執行是否成功的函數</code>

<code>function</code> <code>check {</code>

<code>   </code><code>if</code> <code>[ $? -</code><code>ne</code> <code>0 ];</code><code>then</code>

<code>        </code><code>echo</code> <code>-e </code><code>"\e[1;31m\n $1 exec failed,please check it !\e[0m \n"</code>

<code>        </code><code>echo</code> <code>"$1 failed,please check it !"</code>

<code>        </code><code>sleep</code> <code>1</code>

<code>        </code><code>exit</code> <code>-1</code>

<code>   </code><code>fi</code>

<code>}</code>

<code>backup_dir=`</code><code>ls</code> <code>-l $base_dir|</code><code>grep</code> <code>-e </code><code>"^d.*"</code><code>|</code><code>awk</code> <code>'{print $NF}'</code><code>`</code>

<code>echo</code> <code>-e </code><code>"the backup dir is: $backup_dir \n"</code>

<code>sleep</code> <code>1</code>

<code>###開始恢複</code>

<code>echo</code> <code>-e </code><code>"------ 準備階段 0 ------\n"</code>

<code>/usr/bin/innobackupex</code> <code>--apply-log --redo-only $base_dir</code><code>/0</code>

<code>check </code><code>"準備階段 0"</code><code>;</code>

<code>###執行除去 0 和 最後一個目錄 之外的其他目錄的恢複準備</code>

<code>dir_num=`</code><code>ls</code> <code>-l $base_dir|</code><code>grep</code> <code>-e </code><code>"^d.*"</code><code>|</code><code>wc</code> <code>-l`      </code><code>#取出有幾個備份目錄</code>

<code>for</code> <code>i </code><code>in</code> <code>`</code><code>seq</code> <code>1 $(($dir_num - 2))`</code>

<code>  </code><code>do</code>

<code>    </code><code>echo</code> <code>-e </code><code>"------ 準備階段 $i ------ \n"</code>

<code>    </code><code>sleep</code> <code>1</code>

<code>    </code><code>/usr/bin/innobackupex</code> <code>--apply-log --redo-only $base_dir</code><code>/0</code> <code>--incremental-</code><code>dir</code><code>=$base_dir/$i</code>

<code>    </code><code>check </code><code>"準備階段 $i"</code><code>;</code>

<code>###最後一個增量備份</code>

<code>echo</code> <code>-e </code><code>"------ 準備階段 $(($dir_num - 1)) ------ \n"</code>

<code>/usr/bin/innobackupex</code> <code>--apply-log $base_dir</code><code>/0</code> <code>--incremental-</code><code>dir</code><code>=$base_dir/$(($dir_num - 1))</code>

<code>check </code><code>"準備階段 $(($dir_num - 1))"</code><code>;</code>

<code>###以上步驟将所有增量備份中記錄的變化應用到了最初的全量備份中</code>

<code>echo</code> <code>-e </code><code>"------ 應用所有變化到$base_dir/0 ------\n"</code>

<code>/usr/bin/innobackupex</code> <code>--apply-log $base_dir</code><code>/0</code>

<code>check </code><code>"應用所有變化到$base_dir/0"</code><code>;</code>

<code>###将資料考回資料目錄</code>

<code>echo</code> <code>-e </code><code>"------ 将處理好的資料考回至資料目錄 ------\n"</code>

<code>/usr/bin/innobackupex</code> <code>--copy-back $base_dir</code><code>/0</code>

<code>check </code><code>"copy-back"</code><code>;</code>

實體備份目錄結構截圖

     本文轉自kai404 51CTO部落格,原文連結:http://blog.51cto.com/kaifly/1704105,如需轉載請自行聯系原作者