資料備份其重要性無需多言,再細想一步,我們至少需要兩種備份:一種邏輯備份(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* &></code><code>/dev/null</code> <code>#删除30天以前的</code>
<code> </code><code>mysqldump -u$user -p$psd --events --routines $db |</code><code>gzip</code> <code>> $</code><code>date</code><code>.sql.gz </code><code>###備份&壓縮</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>> $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>> $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>> $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>>> $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>> $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>> $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,如需轉載請自行聯系原作者