Xtrabackup每週增量備份指令碼程式(含附件)
程式描述
本程式是一個對percona xtrabackup使用的指令碼,它完成了MySQL每週的備份。
程式結構
此程式包含了4個目錄(bin、conf、log、var):
- bin:存放執行備份的主指令碼程式(*.sh)。
- conf:存放著程式執行的配置檔案變數(*.conf)。
- log:存放的是備份時xtrabackup的輸出內容(*.log)。
- var:存放了索引檔案(*.index)和錯誤記錄檔案(*.err)。
- *.index:每當備份成功後都會記錄一條資訊到此檔案中,此檔案也是增量備份的一個基礎檔案,程式會用過此檔案判斷是增量備份還是全量備份。
- *.err:每當備份出錯了會記錄一條資料到此檔案。如果需要對備份成功與否進行監控,可以通過此檔案的變化來判斷是否備份成(檔案無變化就是備份成功了)。
程式流程圖
先決條件
確保你的xtrabackup 程式在機器上已經可以正確使用。
注意事項
為了安全請使用root以外的使用者來使用本程式,本人專門使用了一個mysql使用者來執行mysql相關的操作。
使用方式
- 執行
1
2
|
#你的程式路徑
/bin/bash /tmp/xtrabackup_cron/bin/mysql_increment_hot_backup.sh
|
- 備份成功索引檔案內容
1
2
3
|
# 備份成功 索引檔案內容
{week_day:3, dir:full_2015-12-30_21-45-53_3, type:full, date:2015-12-30}
{week_day:3, dir:incr_2015-12-30_22-09-23_3, type:incr, date:2015-12-30}
|
- 備份失敗錯誤檔案內容
1
2
3
|
# 備份失敗 索引檔案內容
{week_day:3, dir:full_2015-12-30_21-45-53_3, type:full, date:2015-12-30}
{week_day:3, dir:incr_2015-12-30_22-09-23_3, type:incr, date:2015-12-30}
|
(提示:其實索引檔案的內容格式和錯誤檔案的一樣)
程式展示
以下主要展示了程式檔案中的內容。附件將會在文章尾部附上
- 配置檔案 mysql_increment_hot_backup.conf
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
|
# mysql 使用者名稱
user=root
# mysql 密碼
password=root
# 備份路勁
backup_dir=/tmp/backup
# percona-xtrabackup 備份軟體路徑
xtrabackup_dir=/usr/local/percona-xtrabackup
# 全備是在一週的第幾天
full_backup_week_day=2
# 全量備資訊名稱 字首
full_backup_prefix=full
# 增量備資訊名稱 字首
increment_prefix=incr
# mysql配置檔案
mysql_conf_file=/etc/my.cnf
# 錯誤日誌檔案(更具此檔案知道備份是否成功)
# format:
# {week_day:1,dir:full/incr_2015-12-29_00-00-00_7,type:full/incr,date:2015-12-30}
error_log=mysql_increment_hot_backup.err
# 索引檔案
# format:
# {week_day:1,dir:full/incr_2015-12-29_00-00-00_7,type:full/incr,date:2015-12-30}
index_file=mysql_increment_hot_backup.index
|
- 主程式說明
程式說明這裡分4個模組來看(主邏輯、變數初始化、檢測檔案正確性、使用的其他方法)
- 主邏輯
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
54
55
56
57
58
59
60
|
function run() {
# 檢測配置檔案值
test_conf_file
# 判斷是執行全備還是曾量備份
get_backup_type
backup_type=$?
case $backup_type in
0 )
# 全量備份
full_backup
backup_ok=$?
if [ 0 -eq "$backup_ok" ]; then
# 全備成功
# # 打包最新備份
# tar_backup_file $full_backup_prefix
# # 將tar備份傳送到遠端
# send_backup_to_remote $full_backup_prefix
# 備份索引檔案
backup_index_file
# # 傳送索引檔案到遠端
# send_index_file_to_remote
# 清除之前的備份
delete_before_backup
# 清除索引檔案
purge_index_from_file
# 新增索引, 索引記錄了當前最新的備份
append_index_to_file $full_backup_prefix
else
# 全備失敗
# 刪除備份目錄
rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
# 記錄錯誤日誌
logging_backup_err $full_backup_prefix
fi
;;
1 )
# 增量備份
increment_backup
backup_ok=$?
if [ 0 -eq "$backup_ok" ]; then
# 增量備份成功
# # 打包最新備份
# tar_backup_file $increment_prefix
# # 將tar備份傳送到遠端
# send_backup_to_remote $increment_prefix
# 新增索引, 索引記錄了當前最新的備份
append_index_to_file $increment_prefix
else
# 增量備份失敗
# 刪除備份目錄
rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
# 記錄錯誤日誌
logging_backup_err $increment_prefix
fi
;;
esac
}
run
|
2. 變數初始化
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
|
# 獲得程式路徑名
program_dir=`dirname $0`/..
# 讀取配置檔案中的所有變數值, 設定為全域性變數
# 配置檔案
conf_file="$program_dir/conf/mysql_increment_hot_backup.conf"
# mysql 使用者
user=`sed '/^user=/!d;s/.*=//' $conf_file`
# mysql 密碼
password=`sed '/^password=/!d;s/.*=//' $conf_file`
# mysql 備份目錄
backup_dir=`sed '/^backup_dir=/!d;s/.*=//' $conf_file`
# percona-xtrabackup 備份軟體路徑
xtrabackup_dir=`sed '/^xtrabackup_dir=/!d;s/.*=//' $conf_file`
# 全備是在一週的第幾天
full_backup_week_day=`sed '/^full_backup_week_day=/!d;s/.*=//' $conf_file`
# mysql 全備字首標識
full_backup_prefix=`sed '/^full_backup_prefix=/!d;s/.*=//' $conf_file`
# mysql 增量備字首標識
increment_prefix=`sed '/^increment_prefix=/!d;s/.*=//' $conf_file`
# mysql 配置檔案
mysql_conf_file=`sed '/^mysql_conf_file=/!d;s/.*=//' $conf_file`
# 備份錯誤日誌檔案
error_log=$program_dir/var/`sed '/^error_log=/!d;s/.*=//' $conf_file`
# 備份索引檔案
index_file=$program_dir/var/`sed '/^index_file=/!d;s/.*=//' $conf_file`
# 備份日期
backup_date=`date +%F`
# 備份日期
backup_time=`date +%H-%M-%S`
# 備份日期
backup_week_day=`date +%u`
# 建立相關目錄
log_dir=$program_dir/log
var_dir=$program_dir/var
mkdir -p $backup_dir
mkdir -p $log_dir
mkdir -p $var_dir
|
3. 檢測配置檔案正確性
4. 使用的其他方法
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
# 全量備份
function full_backup() {
backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
mkdir -p $backup_dir/$backup_folder
$xtrabackup_dir/bin/innobackupex \
--defaults-file=$mysql_conf_file \
--user=$user \
--password=$password \
--no-timestamp \
$backup_dir/$backup_folder > $log_dir/${backup_folder}.log 2>&1
return $?
}
# 增量備份
function increment_backup() {
backup_folder=${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}
incr_base_folder=`sed -n '$p' $index_file | \
awk -F '[, {}]*' '{print $3}' | \
awk -F ':' '{print $2}'`
mkdir -p $backup_dir/$backup_folder
$xtrabackup_dir/bin/innobackupex \
--defaults-file=$mysql_conf_file \
--user=$user \
--password=$password \
--no-timestamp \
--incremental \
$backup_dir/$backup_folder \
--incremental-basedir=$backup_dir/$incr_base_folder > $log_dir/${backup_folder}.log 2>&1
return $?
}
# 刪除之前的備份(一般在全備完成後使用)
function delete_before_backup() {
cat $index_file | awk -F '[, {}]*' '{print $3}' | \
awk -v backup_dir=$backup_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s\n", backup_dir, $2)}}' | \
/bin/bash
cat $index_file | awk -F '[, {}]*' '{print $3}' | \
awk -v log_dir=$log_dir -F ':' '{if($2!=""){printf("rm -rf %s/%s.log\n", log_dir, $2)}}' | \
/bin/bash
}
# 備份索引檔案
function backup_index_file() {
cp $index_file ${index_file}_$(date -d "1 day ago" +%F)
}
# 備份索引檔案
function send_index_file_to_remote() {
echo 'send index file ok'
}
# 新增索引, 索引記錄了當前最新的備份
function append_index_to_file() {
echo "{week_day:$backup_week_day, \
dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \
type:${1}, \
date:${backup_date}}" >> $index_file
}
# 記錄 錯誤訊息到檔案
function logging_backup_err() {
echo "{week_day:$backup_week_day, \
dir:${1}_${backup_date}_${backup_time}_${backup_week_day}, \
type:${1}, \
date:${backup_date}}" >> $error_log
}
# 清空索引
function purge_index_from_file() {
> $index_file
}
# 清空錯誤日誌資訊
function purge_err_log() {
> $error_log
}
# 打包備份
function tar_backup_file() {
echo "tar $1 ok"
}
# 傳送備份到遠端
function send_backup_to_remote() {
echo "send $1 remote ok"
}
# 判斷是應該全備還是增量備份
# 0:full, 1:incr
function get_backup_type() {
full_backup_week_day=`sed '/^full_backup_week_day=/!d;s/.*=//' $conf_file`
backup_type=0
if [ "$full_backup_week_day" -eq `date +%u` ]; then
backup_type=0
else
backup_type=1
fi
if [ ! -n "`cat $index_file`" ]; then
backup_type=0
fi
return $backup_type
}
|
(提示:其實在程式中的有關將備份成功的檔案打包步驟和遠端傳輸步驟還沒有實現,有興趣的可以自行處理。當然,熟練使用xtrabackup的可以直接使用xtrabackup中的--stream 和 --remote-host 引數來進行遠端備份。這樣貌似自己實現將備份傳輸到遠端有點多餘。 :) )