MySQL自動備份實戰--xtrabackup備份


MySQL數據備份企業實戰。制作shell腳本

功能1:使用xtrabackup以每周為一個備份周期做備份(數據庫+二進制日志,備份至本地/data/backup)。提示: 周一某個時間點做一次完全備份,周二、三、四、五、六、日增量,備份存儲目錄"/data/backup/2018/52/1/備份數據" 目錄解釋"/data/backup/年/本年度的第幾周/本周的第幾天/數據" 一年52周一周7天。可以在新的服務器上進行還原測試。

功能2:通過xtrabackup手動備份,全備份將數據備份到/data/backup/base。可根據base目錄進行增量備份到inc1,再根據inc1目錄進行增量備份到inc2。並在新的服務器上進行還原測試

 

shell腳本

#!/bin/bash
#
#********************************************************************
#Author:                qiangshu
#Tel:                   18610586896
#Date:                  2019-11-14
#FileName:             mysql_backup.sh
#URL:                   http://xxxxxx
#Description:          使用xtrabackup備份和恢復mysql數據庫
#測試環境為CentOS7,yum安裝的mariadb-server5.5,MySQL5.7.27二進制安裝成功                    
#Copyright (C):        2019 All rights reserved
#******************************************************************** # xtrabackup 備份后數據的存儲目錄
base_dir=/data/backup

# mysql的數據目錄,恢復的時候用
data_dir=/data/mysql

sql_user='root'
sql_host='localhost'
sql_pass='123456'
sql_login="--user=$sql_user --host=$sql_host --password=$sql_pass"

#安裝epel源,然后安裝percona-xtrabackup,yum安裝的xtrabackup版本為percona-xtrabackup-2.3.6
#不支持mysql5.7的備份,需要再percona官網下載percona-xtrabackup-24-2.4.12版本或以上版本

#判斷腳本參數 case $1 in
--all|-a)
#--all 手動執行全備份
    [ -d $base_dir ] || mkdir -p $base_dir
    xtrabackup $sql_login --backup --target-dir=$base_dir/base
    ;;

--increment|-i)
#--incrementd 手動執行增量備份  
    end_dir=`ls $base_dir | tail -1`

 #如果數據目錄中只有base,那么就針對base目錄進行增量備份 if [ "$end_dir" == "base" ];then
        xtrabackup $sql_login --backup --target-dir=$base_dir/inc1 --incremental-basedir=$base_dir/base
 #如果數據目錄中已經含有inc的目錄,那么根據inc數字最大的目錄進行增量備份 elif  [[ "$end_dir" =~ "inc" ]];then
        num=`echo $end_dir | grep -o [0-9]*`
        let num_add=num+1
        xtrabackup $sql_login --backup --target-dir=$base_dir/inc$num_add --incremental-basedir=$base_dir/inc$num
    fi
    ;;

--manualrecovery|-m)
#手動恢復數據,判斷數據庫的目錄是否是空,不為空退出
    [ "`ls $data_dir`" == "" ] || { echo MySQL data dir is not null !!!;exit 2; }
    inc_num=`ls -d $base_dir/inc* 2> /dev/null | wc -l`
 #如果沒有增量數據直接還原 if [ "$inc_num" -eq 0 ];then
        xtrabackup --prepare --target-dir=$base_dir/base
  #有增量數據的時候,根據增量數據的文件夾個數,循環恢復 elif [ "$inc_num" -ge 1 ];then
        xtrabackup --prepare --apply-log-only --target-dir=$base_dir/base
        for i in `seq 1 $inc_num`;do
            if [ $i -eq $inc_num ];then
                xtrabackup --prepare  --target-dir=$base_dir/base --incremental-dir=$base_dir/inc$i
                break
            fi
            xtrabackup --prepare --apply-log-only --target-dir=$base_dir/base --incremental-dir=$base_dir/inc$i
        done
    fi
    xtrabackup --copy-back --target-dir=$base_dir/base
 # 修改數據目錄所有文件的用戶名為mysql chown -R mysql:mysql $data_dir
    ;;

--autobackup|b)
# 可以放在cron計划任務里,每天執行自動備份任務,周一生成全量數據,周二至周日生成增量數據 # 數據目錄格式/data/backup/2019/45/1 表示2019年第45周,周一
    year=`date +%Y`
    week_number=`date +%U`
    date_of_week=`date +%u`
    full_dir=$base_dir/$year/$week_number
    mkdir -p $base_dir/$year/$week_number
    if [ $date_of_week -eq 1 ];then # 周1進行全備份
        xtrabackup $sql_login --backup --target-dir=$full_dir/$date_of_week
    else
        # 周2-7,針對前一天的數據做增量備份
        let yesterday=$date_of_week-1 # 前一天的目錄如果不存在,證明沒有備份數據
        [ -d $base_dir/$year/$week_number/$yesterday ] || { echo Not exist yesterday backup data !!!;exit 1; }
        xtrabackup $sql_login --backup --target-dir=$full_dir/$date_of_week --incremental-basedir=$full_dir/$yesterday
    fi
    ;;

--autorecovery|-r)
#自動備份恢復方法,使用格式如: ./backup --autorecovery 2019 45 3 恢復到2019年45周第3天的數據
    year=$2
    week_number=$3
    date_of_week=$4
    full_dir=$base_dir/$year/$week_number
    
 # 如果日期的目錄不存在,報錯退出
    [ -d $full_dir/$date_of_week ] || { echo Wrong input date !!!;exit 3; }

  # 如果日期目錄為空,報錯退出
    [ "`ls $full_dir/$date_of_week`" == "" ] && { echo Dir no data !!!;exit 4; }
    
  # num表示恢復到的周幾
    num=$date_of_week
  # 如果數量為1,則只有周1的全備份,按全備份恢復 if [ $num -eq 1 ];then
        xtrabackup --prepare --target-dir=$full_dir/1
    fi

    # 如果數量>=2,則有周1的全備份,還有多個備份,每個增量分別還原
    if [ $num -ge 2 ];then
        xtrabackup --prepare --apply-log-only --target-dir=$full_dir/1
        for i in `seq 2 $num`;do
            if [ $i -eq $num ];then
                xtrabackup --prepare  --target-dir=$full_dir/1 --incremental-dir=$full_dir/$i
                break
            fi
            xtrabackup --prepare  --apply-log-only  --target-dir=$full_dir/1 --incremental-dir=$full_dir/$i
        done
    fi

    xtrabackup --copy-back --target-dir=$full_dir/1
    chown -R mysql:mysql $data_dir
    ;;

--help|-h)
    cat << EOF
本腳本通過xtrabackup程序進行mysqld的備份,需要安裝percona-xtrabackup-24-2.4.12或更高版本

參數選項:
--all或 -a:全備份,全備份默認路徑是/data/backup/base

--increment 或 -i:增量備份,必須有全備份的情況下在進行增量備份,第一次的增量備份為/data/backup/inc1,第二次為/data/backup/inc2,以此類推

--manualrecovery 或 -m:恢復全備份和增量備份的數據,需要提前把全量備份置於/data/backup/base目錄,增量1/data/backup/inc1,以此類推

--autobackup 或 -b:按照年,第幾周,周幾的格式備份數據。存儲路徑如/data/backup/2019/45/{1,2,3},判斷如果是周一進行全備份,周二至周日針對前一天的備份進行增量備份。可以把腳本放到crontab任務中每天執行一次。例如:0 30 * * * /bin/bash 腳本名。

--autorecoveryh 或 -r:把--autobackup備份的數據進行還原,還原的時候需要輸入年,第幾周,周幾。例如:script.sh --autorecovery 2019 45 2,意思是恢復到2019年第45周周2的數據

--help 或 -h:查看幫助

EOF
    ;;

*)
  echo "use --help"

esac

 

腳本使用方法

1、手動備份還原

備份
1、安裝percona-xtrabackup-24-2.4.12
2、拷貝腳本到服務器A上,腳本名為mysql_backup.sh
3、修改腳本中的數據庫登錄用戶參數,要有所有權限
sql_user='root' sql_host='192.168.1.33' sql_pass='123456'
4、手動對當前數據庫進行全備份 ./mysql_backup.sh -a 數據默認存儲到/data/backup/base中
5、手動對當前數據庫進行第一次增量備份 ./mysql_backup.sh -i 數據默認存儲到/data/backup/inc1中
6、手動對當前數據庫進行第二次增量備份 ./mysql_backup.sh -i 數據默認存儲到/data/backup/inc2中 還原 1、將A服務器的/data/backup/*所有文件拷貝到B服務器(192.168.1.100)/data/backup目錄中 scp -r /data/backup/* 192.168.1.100:/data/backup
2、拷貝腳本到服務器A上,腳本名為mysql_backup.sh
3、修改腳本中的mysql實際路徑名 data_dir=/var/lib/mysql
4、清空mysql目錄中的數據(請確認是否有用) rm -rf /var/lib/mysql
5、執行腳本進行恢復 ./mysql_backup.sh -m

 

2、自動備份還原

備份
1、安裝percona-xtrabackup-24-2.4.12 2、拷貝腳本到服務器A上,腳本名為mysql_backup.sh 將腳本放於/scrpit/mysql_backup.sh 3、修改腳本中的數據庫登錄用戶參數,要有所有權限
sql_user='root'
sql_host='192.168.1.33'
sql_pass='123456'

4、編輯定時任務,每天凌晨1:00備份
crontab -e
0 1 * * * /bin/bash /scrpit/mysql_backup.sh -b

還原
1、將A服務器的/data/backup/*所有文件拷貝到B服務器(192.168.1.100)/data/backup目錄中 scp -r /data/backup/* 192.168.1.100:/data/backup 2、拷貝腳本到服務器A上,腳本名為mysql_backup.sh 3、修改腳本中的mysql實際路徑名 data_dir=/var/lib/mysql 4、清空mysql目錄中的數據(請確認是否有用) rm -rf /var/lib/mysql 5、執行腳本進行恢復 ./mysql_backup.sh -r 2019 45 3 注意:./mysql_backup.sh -r 2019 45 3 含義是恢復到2019年第45周的周3。需要提前確認本周1,周2的目錄中是否有數據

 

后話:本腳本已測試過CentOS7,yum安裝的mariadb-server5.5.64 以及 二進制安裝的MySQL 5.7.27。其他版本未測試。依賴於xtrabackup的版本

本次使用的版本是percona-xtrabackup-24-2.4.12。如有問題請聯系微信18610586896

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM