溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL用Xtrabackup進(jìn)行備份和恢復(fù)的步驟

發(fā)布時(shí)間:2021-06-21 11:07:42 來(lái)源:億速云 閱讀:276 作者:chen 欄目:開發(fā)技術(shù)

這篇文章主要講解了“MySQL用Xtrabackup進(jìn)行備份和恢復(fù)的步驟”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“MySQL用Xtrabackup進(jìn)行備份和恢復(fù)的步驟”吧!

目錄
  • 1 備份

    • 1.1 全備

    • 1.2 增備

  • 2 備份恢復(fù)

    • 2.1 準(zhǔn)備數(shù)據(jù)

    • 2.2 進(jìn)行恢復(fù)

  • 3 目錄結(jié)構(gòu)

    • 4 備份腳本

      • 4.1 腳本

      • 4.2 配置文件

    • 5 恢復(fù)腳本

      • 5.1 腳本

      • 5.2 配置文件

    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è)庫(kù),使用的是備份用戶,備份文件存放地址為 /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)

    MySQL用Xtrabackup進(jìn)行備份和恢復(fù)的步驟

    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ù)的步驟”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)MySQL用Xtrabackup進(jìn)行備份和恢復(fù)的步驟這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI