一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Mysql - MySQL如何使用使用Xtrabackup進(jìn)行備份和恢復(fù)

MySQL如何使用使用Xtrabackup進(jìn)行備份和恢復(fù)

2021-08-20 17:02Frost Boy Mysql

Xtrabackup是由Percona開發(fā)的一個(gè)開源軟件,可實(shí)現(xiàn)對InnoDB的數(shù)據(jù)備份,支持在線熱備份(備份時(shí)不影響數(shù)據(jù)讀寫)。本文講解如何使用該工具進(jìn)行備份和恢復(fù)

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)

MySQL如何使用使用Xtrabackup進(jìn)行備份和恢復(fù)

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 全色黄大色黄大片爽一次 | 成年人在线播放视频 | 污到你怀疑人生 | 精品无码久久久久久久动漫 | 特黄特级高清免费视频毛片 | 成年人在线免费看 | 精品区卡一卡2卡三免费 | 久久这里只有精品视频e | 嫩草影院永久入口在线观看 | 99re热精品这里精品 | 亚洲va在线va天堂成人 | 国产日韩精品一区二区在线观看 | 99ri国产在线 | 国产日韩欧美视频 | 青青青久在线视频免费观看 | 免费一级国产大片 | 国产午夜大片 | chinese东北痞子gay | 我半夜摸妺妺的奶C了她软件 | 亚洲国产精品综合一区在线 | 久久久精品国产免费A片胖妇女 | 亚洲欧美影院 | 窝窝午夜理伦影院 | 高清视频在线播放ww | 色综合视频一区二区观看 | 亚州男人的天堂 | 四虎影视网站 | 欧美高清在线精品一区二区不卡 | 无码观看AAAAAAAA片 | 免费福利资源站在线视频 | 亚洲高清中文字幕 | 日韩在线天堂免费观看 | 精品在线视频一区 | 99久久国语露脸精品国产 | 99精彩视频在线观看 | 出差被灌醉绝伦的上司日本 | 毛片亚洲毛片亚洲毛片 | 十大免费b2b网站 | 午夜免费体验30分 | 国产精品va在线观看手机版 | 成人免费在线视频 |