目錄
- 1 備份
- 2 備份恢復(fù)
- 2.1 準(zhǔn)備數(shù)據(jù)
- 2.2 進(jìn)行恢復(fù)
- 3 目錄結(jié)構(gòu)
- 4 備份腳本
- 5 恢復(fù)腳本
1 備份
進(jìn)行備份前需要先創(chuàng)建備份用戶,直接使用 root 用戶進(jìn)行備份也行,但是這樣不太規(guī)范。
create user backup@'localhost' identified by '123456';
grant reload,process,lock tables,replication client on *.* to backup@localhost;
1.1 全備
備份整個(gè)庫,使用的是備份用戶,備份文件存放地址為 /backup/
innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 /backup/
1.2 增備
指定為增量備分,使用的是備份用戶,增量的基礎(chǔ)為上一次的全備,已經(jīng)使用 --incremental-basedir 進(jìn)行指定了,備份后存放的文件為 /backup/
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)
innobackupex --apply-log --redo-only /backup/2021-06-01_14-44-54/
2.2 進(jìn)行恢復(fù)
在恢復(fù)前,需要確保 MySQL 的數(shù)據(jù)目錄為已經(jīng)刪除了。
innobackupex --copy-back --datadir=/usr/local/mysql/data /backup/2021-06-01_14-44-54/
恢復(fù)后,需要對(duì) MySQL 的data 目錄進(jìn)行重新賦權(quán):
chown -R mysql:mysql data/
到這恢復(fù)就完成了。
3 目錄結(jié)構(gòu)
4 備份腳本
4.1 腳本
backup.sh
#!/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地址 賬號(hào) 密碼 ${index_file} 目標(biāo)服務(wù)器存放的文件夾 端口號(hào)
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地址 賬號(hào) 密碼 ${gzip_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}.tar.bz2 目標(biāo)服務(wù)器存放的文件夾 端口號(hào)
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
}
# 測(cè)試配置文件正確性
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() {
# 檢測(cè)配置文件值
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
# 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
#!/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
# 對(duì)數(shù)據(jù)文件進(jìn)行賦權(quán)
echo "重新對(duì)數(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
# 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ù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- 安裝使用Percona XtraBackup來備份恢復(fù)MySQL的教程
- 利用Xtrabackup工具備份及恢復(fù)(MySQL DBA的必備工具)
- mysql xtrabackup 備份恢復(fù)實(shí)現(xiàn)分享
- MySQL使用Xtrabackup備份流程詳解
- xtrabackup備份還原MySQL數(shù)據(jù)庫
- MySQL使用xtrabackup進(jìn)行備份還原操作
- 使用xtrabackup實(shí)現(xiàn)mysql備份
- 編寫腳本令Xtrabackup對(duì)MySQL數(shù)據(jù)進(jìn)行備份的教程
- MySQL中使用innobackupex、xtrabackup進(jìn)行大數(shù)據(jù)的備份和還原教程