1 備份
進(jìn)行備份前需要先創(chuàng)建備份用戶,直接使用 root 用戶進(jìn)行備份也行,但是這樣不太規(guī)范。
1
2
|
create user backup@ 'localhost' identified by '123456' ; grant reload,process,lock tables,replication client on *.* to backup@localhost; |
1.1 全備
備份整個(gè)庫,使用的是備份用戶,備份文件存放地址為 /backup/
1
|
innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 /backup/ |
1.2 增備
指定為增量備分,使用的是備份用戶,增量的基礎(chǔ)為上一次的全備,已經(jīng)使用 --incremental-basedir 進(jìn)行指定了,備份后存放的文件為 /backup/
1
|
innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 --incremental --incremental-basedir=/backup/2021-06-01_14-44-54 /backup/ |
2 備份恢復(fù)
2.1 準(zhǔn)備數(shù)據(jù)
回滾未提交的事務(wù)及同步已經(jīng)提交的事務(wù)至數(shù)據(jù)文件使數(shù)據(jù)文件處于一致性狀態(tài)
1
|
innobackupex --apply-log --redo-only /backup/2021-06-01_14-44-54/ |
2.2 進(jìn)行恢復(fù)
在恢復(fù)前,需要確保 mysql 的數(shù)據(jù)目錄為已經(jīng)刪除了。
1
|
innobackupex --copy-back --datadir=/usr/local/mysql/data /backup/2021-06-01_14-44-54/ |
恢復(fù)后,需要對 mysql 的data 目錄進(jìn)行重新賦權(quán):
1
|
chown -r mysql:mysql data/ |
到這恢復(fù)就完成了。
3 目錄結(jié)構(gòu)
4 備份腳本
4.1 腳本
backup.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
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
|
#!/bin/bash # 獲得程序路徑名 program_dir=`dirname $0`/.. # 讀取配置文件中的所有變量值, 設(shè)置為全局變量 # 配置文件 conf_file= "$program_dir/conf/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` # mysql 備份壓縮打包目錄 gzip_dir=`sed '/^gzip_dir=/!d;s/.*=//' $conf_file` # percona-xtrabackup命令xtrabackup路徑 xtrabackup_bin=`sed '/^xtrabackup_bin=/!d;s/.*=//' $conf_file` # mysql 全備前綴標(biāo)識(shí) full_backup_prefix=`sed '/^full_backup_prefix=/!d;s/.*=//' $conf_file` # mysql 增量備前綴標(biāo)識(shí) increment_prefix=`sed '/^increment_prefix=/!d;s/.*=//' $conf_file` # 備份錯(cuò)誤日志文件 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` # 備份時(shí)間 backup_time=` date +%h-%m-%s` # 備份時(shí)的周幾 backup_week_day=` date +%u` # 創(chuàng)建相關(guān)目錄 log_dir=$program_dir/log/backup var_dir=$program_dir/var mkdir -p $backup_dir mkdir -p $log_dir mkdir -p $var_dir mkdir -p $gzip_dir # 全量備份 function full_backup() { backup_folder=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day} mkdir -p $backup_dir/$backup_folder $xtrabackup_bin \ --user=$user \ --password=$password \ --backup \ --target-dir=$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_bin \ --user=$user \ --password=$password \ --backup \ --target-dir=$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 gzip_dir=$gzip_dir -f ':' '{if($2!=""){printf("rm -rf %s/%s\n", gzip_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() { # ./expect_scp ip地址 賬號 密碼 ${index_file} 目標(biāo)服務(wù)器存放的文件夾 端口號 echo 'send index file ok' } # 添加索引, 索引記錄了當(dāng)前最新的備份 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 } # 記錄錯(cuò)誤消息到文件 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 } # 清空錯(cuò)誤日志信息 function purge_err_log() { > $error_log } # 打包備份 function tar_backup_file() { cd $backup_dir tar -jcf ${gzip_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}.tar.bz2 \ ${1}_${backup_date}_${backup_time}_${backup_week_day} cd - > /dev/ null rm -rf ${backup_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day} } # 發(fā)送備份到遠(yuǎn)程 function send_backup_to_remote() { # ./expect_scp ip地址 賬號 密碼 ${gzip_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}.tar.bz2 目標(biāo)服務(wù)器存放的文件夾 端口號 echo "send $1 remote ok" } # 判斷是應(yīng)該全備還是增量備份 # 0: full , 1:incr function get_backup_type() { backup_type=0 if [ 1 -eq ` date +%h` ]; then backup_type=0 else backup_type=1 fi touch $index_file if [ ! -n "`cat $index_file`" ]; then backup_type=0 fi return $backup_type } # 測試配置文件正確性 function test_conf_file() { # 判斷每個(gè)變量是否在配置文件中有配置,沒有則退出程序 if [ ! -n "$user" ]; then echo 'fail: configure file user not set' ; exit 2; fi if [ ! -n "$password" ]; then echo 'fail: configure file password not set' ; exit 2; fi if [ ! -n "$backup_dir" ]; then echo 'fail: configure file backup_dir not set' ; exit 2; fi if [ ! -n "$gzip_dir" ]; then echo 'fail: configure file backup_dir not set' ; exit 2; fi if [ ! -n "$full_backup_prefix" ]; then echo 'fail: configure file full_backup_prefix not set' ; exit 2; fi if [ ! -n "$increment_prefix" ]; then echo 'fail: configure file increment_prefix not set' ; exit 2; fi if [ ! -n "$error_log" ]; then echo 'fail: configure file error_log not set' ; exit 2; fi if [ ! -n "$index_file" ]; then echo 'fail: configure file index_file not set' ; exit 2; fi } # 執(zhí)行 function main() { # 檢測配置文件值 test_conf_file # 判斷是執(zhí)行全備還是增量備份 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備份發(fā)送到遠(yuǎn)程 send_backup_to_remote $full_backup_prefix # 備份索引文件 backup_index_file # 清除之前的備份 delete_before_backup # 清除索引文件 purge_index_from_file # 添加索引, 索引記錄了當(dāng)前最新的備份 append_index_to_file $full_backup_prefix # 發(fā)送索引文件到遠(yuǎn)程 send_index_file_to_remote else # 全備失敗 # 刪除備份目錄 rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day} # 記錄錯(cuò)誤日志 logging_backup_err $full_backup_prefix fi ;; 1 ) # 增量備份 increment_backup backup_ok=$? if [ "$backup_ok" -eq 0 ]; then # 增量備份成功 # 打包最新備份 tar_backup_file $increment_prefix # # 將tar備份發(fā)送到遠(yuǎn)程 send_backup_to_remote $increment_prefix # 添加索引, 索引記錄了當(dāng)前最新的備份 append_index_to_file $increment_prefix # # 發(fā)送索引文件到遠(yuǎn)程 send_index_file_to_remote else # 增量備份失敗 # 刪除備份目錄 rm -rf ${backup_dir}/${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day} # 記錄錯(cuò)誤日志 logging_backup_err $increment_prefix fi ;; esac } main |
4.2 配置文件
backup.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# mysql 用戶名 user =backup # mysql 密碼 password =123456 # 備份路徑 backup_dir=/data/backup # 備份壓縮打包目錄 gzip_dir=/data/backups/backups_zip # innobackupex 命令路徑 xtrabackup_bin=/opt/xtrabackup/bin/xtrabackup # 全量備信息名稱 前綴 full_backup_prefix= full # 增量備信息名稱 前綴 increment_prefix=incr # 錯(cuò)誤日志文件(根據(jù)此文件知道備份是否成功) # 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 |
5 恢復(fù)腳本
5.1 腳本
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
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
106
107
108
109
110
111
112
113
114
115
116
117
|
#!/bin/bash # 獲得程序路徑名 program_dir=`dirname $0`/.. # 讀取配置文件中的所有變量值, 設(shè)置為全局變量 # 配置文件 conf_file= "$program_dir/conf/restore.conf" # mysql 數(shù)據(jù)文件夾 data_dir=`sed '/^data_dir=/!d;s/.*=//' $conf_file` # 備份索引文件路徑 backup_index_file=`sed '/^backup_index_file=/!d;s/.*=//' $conf_file` # percona-xtrabackup命令xtrabackup路徑 xtrabackup_bin=`sed '/^xtrabackup_bin=/!d;s/.*=//' $conf_file` # 備份文件目錄 backup_restore_dir=`sed '/^backup_restore_dir=/!d;s/.*=//' $conf_file` # 檢查配置文件正確性 function exam_conf_file() { # 判斷每個(gè)變量是否在配置文件中有配置,沒有則退出程序 if [ ! -n "$data_dir" ]; then echo 'fail: configure file data_dir not set' ; exit 2; fi if [ ! -n "$backup_index_file" ]; then echo 'fail: configure file backup_index_file not set' ; exit 2; fi if [ ! -n "$xtrabackup_bin" ]; then echo 'fail: configure file xtrabackup_bin not set' ; exit 2; fi if [ ! -n "$backup_restore_dir" ]; then echo 'fail: configure file backup_restore_dir not set' ; exit 2; fi } # 檢查備份文件是否是壓縮格式 function exam_backup_restore_file(){ file_backup_restore_name_arr=`ls $backup_restore_dir` for file_name in $file_backup_restore_name_arr;do if [ "${file_name##*.}" x = "bz2" x ]; then tar -jxf $backup_restore_dir/$file_name -c $backup_restore_dir rm -rf $backup_restore_dir/$file_name fi done } # 檢查 mysql 是否停止 function exam_mysql_is_stop(){ if [ 0 -eq `ps -ef | grep mysql | grep -v grep | wc -l` ]; then echo "mysql 服務(wù)已停止" else /etc/init.d/mysqld stop echo "正在停止 mysql 服務(wù)" sleep 3 echo "已停止 mysql 服務(wù)" fi } # 檢查 mysql data 文件是否刪除 function exam_data_is_del(){ if [ -d $data_dir ]; then echo "正在刪除 mysql 的data文件" rm -rf $data_dir else echo "mysql 的數(shù)據(jù)文件已刪除 " fi } # 讀取備份索引文件 function read_backup_index() { cat $backup_index_file | awk '{print $2}' | awk -f: '{print $2}' | awk '{sub(/.$/,"")}1' } # 準(zhǔn)備全備文件 function ready_full(){ full_file_name=`echo ${1} | awk '{print $1}' ` $xtrabackup_bin/innobackupex \ --apply-log \ --redo-only \ $backup_restore_dir/$full_file_name echo "全備文件已準(zhǔn)備好" } # 準(zhǔn)備增備文件 function ready_incr(){ backup_index=$(read_backup_index) full_file_name=`echo $backup_index | awk '{print $1}' ` for file_name in $backup_index;do if [ 1 -eq `echo "$file_name" | grep incr | wc -l` ]; then $xtrabackup_bin/innobackupex \ --apply-log \ --redo-only \ $backup_restore_dir/$full_file_name \ --incremental-dir=$backup_restore_dir/$file_name fi done echo "增備文件已準(zhǔn)備好" } # 執(zhí)行備份恢復(fù) function exec_backup_restore(){ echo "開始進(jìn)行備份恢復(fù)" full_file_name=`echo ${1} | awk '{print $1}' ` $xtrabackup_bin/innobackupex \ --copy-back \ --datadir=$data_dir \ $backup_restore_dir/$full_file_name } # 執(zhí)行 function main() { # 檢查配置文件正確性 exam_conf_file # 檢查備份文件是否是壓縮格式 exam_backup_restore_file # 檢查 mysql 是否停止 exam_mysql_is_stop # 檢查 mysql data 文件是否刪除 exam_data_is_del # 讀取索引文件 backup_index=$(read_backup_index) # 準(zhǔn)備全備文件 ready_full $backup_index # 準(zhǔn)備增備文件 ready_incr # 執(zhí)行備份恢復(fù) exec_backup_restore $backup_index # 對數(shù)據(jù)文件進(jìn)行賦權(quán) echo "重新對數(shù)據(jù)目錄賦權(quán)" chown -r mysql:mysql $data_dir echo "正在啟動(dòng)mysql" /etc/init.d/mysqld start echo "備份恢復(fù)成功" } main |
5.2 配置文件
restore.conf
1
2
3
4
5
6
7
8
|
# mysql 數(shù)據(jù)文件夾 data_dir=/opt/mysql/data #備份索引文件路徑 backup_index_file=/opt/xtrabackup/backup/var/mysql_increment_hot_backup. index #xtrabackup bin 的目錄 xtrabackup_bin=/opt/xtrabackup/bin # 備份文件目錄 backup_restore_dir=/data/backups/backups_zip |
以上就是mysql如何使用使用xtrabackup進(jìn)行備份和恢復(fù)的詳細(xì)內(nèi)容,更多關(guān)于mysql 用xtrabackup備份和恢復(fù)的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://www.cnblogs.com/FrostBoy/p/14885065.html