Xtrabackup を使用して MySQL をバックアップおよび復元する方法

Xtrabackup を使用して MySQL をバックアップおよび復元する方法

1. バックアップ

バックアップする前に、バックアップ ユーザーを作成する必要があります。root ユーザーを使用して直接バックアップすることもできますが、これは標準ではありません。

    '123456' で識別されるユーザー backup@'localhost' を作成します。
    *.* の再ロード、プロセス、テーブルのロック、レプリケーション クライアントの権限を backup@localhost に付与します。

1.1 万全の準備

バックアップユーザーを使用してライブラリ全体をバックアップし、バックアップファイルは/backup/に保存されます。

    innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 /backup/

1.2 追加の準備

増分バックアップを指定します。バックアップ ユーザーを使用し、増分基準は最後のフル バックアップであり、--incremental-basedir を使用して指定されています。バックアップ ファイルは /backup/ に保存されます。

    innobackupex --defaults-file=/etc/my.cnf --user=backup --password=123456 --incremental --incremental-basedir=/backup/2021-06-01_14-44-54 /backup/

2 バックアップとリカバリ

2.1 データの準備

コミットされていないトランザクションをロールバックし、コミットされたトランザクションをデータファイルに同期して、データファイルの一貫性を保ちます。

    innobackupex --apply-log --redo-only /backup/2021-06-01_14-44-54/

2.2 回復

復元する前に、MySQL データ ディレクトリが削除されていることを確認する必要があります。

    innobackupex --copy-back --datadir=/usr/local/mysql/data /backup/2021-06-01_14-44-54/

リカバリ後、MySQL データ ディレクトリへの権限を再度付与する必要があります。

    chown -R mysql:mysql データ/

この時点で回復は完了です。

3 ディレクトリ構造

4 バックアップ スクリプト

4.1 スクリプト

バックアップ.sh

    #!/bin/bash
    # プログラム パス名を取得します。program_dir=`dirname $0`/..
    # 設定ファイル内のすべての変数値を読み取り、グローバル変数として設定します# 設定ファイル 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 フルバックアッププレフィックス識別子 full_backup_prefix=`sed '/^full_backup_prefix=/!d;s/.*=//' $conf_file`
    #mysql 増分プレフィックス識別子 increment_prefix=`sed '/^increment_prefix=/!d;s/.*=//' $conf_file`
    # エラーログファイルをバックアップ 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`
    # バックアップ時間 backup_time=`date +%H-%M-%S`
    # バックアップの曜日 backup_week_day=`date +%u`
    # 関連するディレクトリを作成します log_dir=$program_dir/log/backup
    var_dir=$プログラムディレクトリ/var
    mkdir -p $バックアップディレクトリ
    mkdir -p $log_dir
    mkdir -p $var_dir
    mkdir -p $gzip_dir
    # フルバックアップ関数 full_backup() {
      バックアップフォルダー=${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
      mkdir -p $backup_dir/$backup_folder
      $xtrabackup_bin \
        --user=$user \
        --password=$パスワード\
        --バックアップ\
        --target-dir=$backup_dir/$backup_folder > $log_dir/${backup_folder}.log 2>&1
      $を返しますか?
    }
    # 増分バックアップ関数 increment_backup() {
      バックアップフォルダー=${増分プレフィックス}_${バックアップ日付}_${バックアップ時間}_${バックアップ曜日}
      incr_base_folder=`sed -n '$p' $index_file | \
                       awk -F '[, {}]*' '{print $3}' | \
                       awk -F ':' '{$2 を印刷}'`
      mkdir -p $backup_dir/$backup_folder
      $xtrabackup_bin \
        --user=$user \
        --password=$パスワード\
        --バックアップ\
        --target-dir=$backup_dir/$backup_folder \
        --incremental-basedir=$backup_dir/$incr_base_folder > $log_dir/${backup_folder}.log 2>&1
      $を返しますか?
    }
    # 以前のバックアップを削除します(通常は完全バックアップが完了した後に使用されます)
    関数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)}}' | \
        バイナリ
      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)}}' | \
        バイナリ
      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)}}' | \
        バイナリ
    }
    #インデックスファイルのバックアップ関数backup_index_file() {
      cp $index_file ${index_file}_$(date -d "1日前" +%F)
    }
    #インデックスファイルのバックアップ関数 send_index_file_to_remote() {
      # ./expect_scp IP アドレス アカウント パスワード ${index_file} ターゲット サーバー フォルダー ポート番号 echo 'send index file ok'
    }
    # 最新のバックアップを記録するインデックスを追加する function append_index_to_file() {
      echo "{week_day:$backup_week_day, \
             dir:${1}_${バックアップ日付}_${バックアップ時刻}_${バックアップ曜日}, \
             タイプ:${1}, \
             日付:${backup_date}}" >> $index_file
    }
    # エラーメッセージをファイルに記録する function logging_backup_err() {
      echo "{week_day:$backup_week_day, \
             dir:${1}_${バックアップ日付}_${バックアップ時刻}_${バックアップ曜日}, \
             タイプ:${1}, \
             日付:${backup_date}}" >> $error_log
    }
    # インデックスをクリアする function purge_index_from_file() {
      > $インデックスファイル
    }
    # エラーログ情報をクリアする function purge_err_log() {
      > $エラーログ
    }
    #パッケージバックアップ関数 tar_backup_file() {
      $backup_dir をコピー
      tar -jcf ${gzip_dir}/${1}_${バックアップ日付}_${バックアップ時刻}_${バックアップ曜日}.tar.bz2 \
               ${1}_${バックアップ日付}_${バックアップ時刻}_${バックアップ曜日}
      cd -> /dev/null
      rm -rf ${バックアップディレクトリ}/${1}_${バックアップ日付}_${バックアップ時刻}_${バックアップ曜日}
    }
    # バックアップをリモートに送信する function send_backup_to_remote() {
      # ./expect_scp IP アドレス アカウント パスワード ${gzip_dir}/${1}_${backup_date}_${backup_time}_${backup_week_day}.tar.bz2 ターゲット サーバー フォルダー ポート番号 echo "send $1 remote ok"
    }
    # フルバックアップまたは増分バックアップを実行するかどうかを決定します# 0:full、1:incr
    関数 get_backup_type() {
      バックアップタイプ=0
      [ 1 -eq `date +%H` ]の場合;
        バックアップタイプ=0
      それ以外
        バックアップタイプ=1
      フィ
      $index_file をタッチ
      if [ ! -n "`cat $index_file`" ]; then
        バックアップタイプ=0
      フィ
      $backup_typeを返す
    }
    # 設定ファイルの正確さをテストする function test_conf_file() {
      # 設定ファイルで各変数が設定されているかどうかを確認します。設定されていない場合はプログラムを終了します if [ ! -n "$user" ]; then echo 'fail: configure file user not set'; exit 2; fi
      if [ ! -n "$password" ]; then echo '失敗: configureファイルのパスワードが設定されていません'; exit 2; fi
      if [ ! -n "$backup_dir" ]; then echo '失敗: configure ファイルの backup_dir が設定されていません'; exit 2; fi
      if [ ! -n "$gzip_dir" ]; then echo '失敗: configure ファイルの backup_dir が設定されていません'; exit 2; fi
      if [ ! -n "$full_backup_prefix" ]; then echo '失敗: configure ファイルの full_backup_prefix が設定されていません'; exit 2; fi
      if [ ! -n "$increment_prefix" ]; then echo '失敗: configureファイルのincrement_prefixが設定されていません'; exit 2; fi
      if [ ! -n "$error_log" ]; then echo '失敗: configureファイルerror_logが設定されていません'; exit 2; fi
      if [ ! -n "$index_file" ]; then echo '失敗: configureファイルindex_fileが設定されていません'; exit 2; fi
    }
    # 関数 main() を実行する {
      # 検出設定ファイルの値 test_conf_file
      # フルバックアップか増分バックアップかを決定する get_backup_type
      バックアップタイプ=$?
      $backup_typeの場合
        0 )
          # フルバックアップ full_backup
          バックアップOKですか?
          [ 0 -eq "$backup_ok" ]の場合;
          # 完全バックアップが成功しました# 最新のバックアップをパックします tar_backup_file $full_backup_prefix
            # # tar バックアップをリモートに送信する send_backup_to_remote $full_backup_prefix
            #インデックスファイルのバックアップbackup_index_file
            # 前回のバックアップをクリアする delete_before_backup
            # インデックスファイルをクリアする purge_index_from_file
            # 最新のバックアップを記録するインデックスを追加します append_index_to_file $full_backup_prefix
            # インデックスファイルをリモートに送信する send_index_file_to_remote
          それ以外
          # 完全バックアップに失敗しました # バックアップディレクトリを削除します rm -rf ${backup_dir}/${full_backup_prefix}_${backup_date}_${backup_time}_${backup_week_day}
            # エラーログの記録 loglogging_backup_err$full_backup_prefix
          フィ
          ;;
        1 )
          # 増分バックアップ increment_backup
          バックアップOKですか?
          [ "$backup_ok" -eq 0 ]の場合;
          # 増分バックアップが成功しました # 最新のバックアップをパックします tar_backup_file $increment_prefix
            # # tar バックアップをリモートに送信する send_backup_to_remote $increment_prefix
            # 最新のバックアップを記録するインデックスを追加します append_index_to_file $increment_prefix
            # # インデックスファイルをリモートに送信する send_index_file_to_remote
          それ以外
          # 増分バックアップに失敗しました # バックアップディレクトリを削除します rm -rf ${backup_dir}/${increment_prefix}_${backup_date}_${backup_time}_${backup_week_day}
            # エラーログを記録するlogging_backup_err $increment_prefix
          フィ
          ;;
      エサック
    }
    主要

4.2 設定ファイル

バックアップ.conf

    #mysql ユーザー名 user=backup
    #mysql パスワード パスワード=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
    # エラー ログ ファイル (このファイルはバックアップが成功したかどうかを判断するために使用されます)
    # フォーマット:
    # {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
    # インデックスファイル# 形式:
    # {week_day:1、dir:full/incr_2015-12-29_00-00-00_7、type:full/incr、date:2015-12-30}
    インデックスファイル=mysql_increment_hot_backup.index

5 回復スクリプト

5.1 スクリプト

復元.sh

    #!/bin/bash
    # プログラム パス名を取得します。program_dir=`dirname $0`/..
    # 設定ファイル内のすべての変数値を読み取り、グローバル変数として設定します# 設定ファイル conf_file="$program_dir/conf/restore.conf"
    # MySQL データフォルダ 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() {
        # 設定ファイルで各変数が設定されているかどうかを確認します。設定されていない場合はプログラムを終了します if [ ! -n "$data_dir" ]; then echo 'fail: configure file data_dir not set'; exit 2; fi
        if [ ! -n "$backup_index_file" ]; then echo '失敗: 設定ファイルbackup_index_fileが設定されていません'; exit 2; fi
        if [ ! -n "$xtrabackup_bin" ]; then echo '失敗: 設定ファイル xtrabackup_bin が設定されていません'; exit 2; fi
        if [ ! -n "$backup_restore_dir" ]; then echo '失敗: configureファイルbackup_restore_dirが設定されていません'; exit 2; fi
    }
    # バックアップファイルが圧縮形式であるかどうかを確認する function exam_backup_restore_file(){
        file_backup_restore_name_arr=`ls $backup_restore_dir`
        $file_backup_restore_name_arrのfile_nameに対して、
            if [ "${file_name##*.}"x = "bz2"x ];then
                tar -jxf $backup_restore_dir/$file_name -C $backup_restore_dir
                rm -rf $バックアップ復元ディレクトリ/$ファイル名
            フィ

        終わり
    }
    # MySQLが停止しているかどうかを確認する function exam_mysql_is_stop(){
        if [ 0 -eq `ps -ef | grep mysql | grep -v grep | wc -l` ]; then
            echo "MySQL サービスが停止しました"
        それ以外
            /etc/init.d/mysqld を停止します
            echo "MySQL サービスを停止します"
            睡眠3
            echo "MySQL サービスが停止されました"
        フィ
    }
    # MySQLデータファイルが削除されているかどうかを確認する function exam_data_is_del(){
        if [ -d $data_dir ];then
            echo "MySQL データファイルを削除しています"
            rm -rf $データディレクトリ
        それ以外
            echo "MySQL データ ファイルが削除されました"
        フィ
    }
    # バックアップインデックスファイルを読み取る function read_backup_index() {
        cat $backup_index_file | awk '{print $2}' | awk -F: '{print $2}' | awk '{sub(/.$/,"")}1'
    }
    # 完全なファイルを準備する function ready_full(){
        full_file_name=`echo ${1} | awk '{print $1}'`
        $xtrabackup_bin/innobackupex \
            --apply-log \
            --redo-only \
            $バックアップ_リストア_dir/$フルファイル名

        echo "すべてのファイルが準備完了です"
    }
    # ファイル追加の準備 function ready_incr(){
        バックアップインデックス=$(read_backup_index)
        full_file_name=`echo $backup_index | awk '{print $1}'`
        $backup_indexのfile_nameに対して、
            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
            フィ
        終わり
        echo "追加ファイルが準備できました"
    }
    # バックアップと復元を実行する関数 exec_backup_restore(){
        echo "バックアップと復元を開始します"
        full_file_name=`echo ${1} | awk '{print $1}' `
        $xtrabackup_bin/innobackupex \
            --コピーバック \
            --datadir=$データディレクトリ\
            $バックアップ_リストア_dir/$フルファイル名
    }
    # 関数 main() を実行する {
        # 設定ファイル exam_conf_file の正確性を確認します
        # バックアップファイルが圧縮形式であるかどうかを確認する exam_backup_restore_file
        # MySQL が停止しているかどうかを確認する exam_mysql_is_stop
        # MySQLデータファイルが削除されているかどうかを確認します exam_data_is_del
        # インデックスファイルを読み取る backup_index=$(read_backup_index)
        # 完全バックアップファイルを準備する ready_full $backup_index
        # ファイルready_incrを追加する準備をする
        # バックアップと復元を実行する exec_backup_restore $backup_index
        # データファイルへの権限を付与する echo "データディレクトリへの権限を再付与する"
        chown -R mysql:mysql $data_dir
        echo "MySQL を起動しています"
        /etc/init.d/mysqld を起動します
        echo "バックアップと復元が成功しました"
    }
    主要

5.2 設定ファイル

復元.conf

    #MySQL データフォルダ 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

上記は、Xtrabackup を使用して MySQL をバックアップおよび復元する方法の詳細です。Xtrabackup を使用した MySQL のバックアップと復元の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • Percona XtraBackup のインストールと使用方法のチュートリアル: MySQL のバックアップと復元
  • Xtrabackup ツール(MySQL DBA に必須のツール)を使用してバックアップと復元を行う
  • mysql xtrabackup バックアップとリカバリの実装の共有
  • Xtrabackup を使用した MySQL バックアップ プロセスの詳細な説明
  • xtrabackup による MySQL データベースのバックアップと復元
  • MySQLはバックアップと復元操作にxtrabackupを使用します
  • xtrabackup を使用して MySQL バックアップを実装する
  • Xtrabackup を使用して MySQL データをバックアップするためのスクリプトの作成に関するチュートリアル
  • innobackupex と xtrabackup を使用して MySQL のビッグデータをバックアップおよび復元するチュートリアル

<<:  CSS の overflow: hidden の使い方 (オーバーフローの非表示とフロートのクリア)

>>:  Vueルータールーティングの詳細な説明

推薦する

デザイン理論:テキスト表現とユーザビリティ

<br />テキストデザインでは、通常、テキストのレイアウト、つまりテキストをより美しく...

Vue+thinkphp5.1+axiosでファイルアップロードを実現

この記事では、thinkphp5.1 + Vue+axiosを使用してファイルをアップロードする方法...

MySQLは1億のテストデータを素早く挿入します

目次1. テーブルを作成する1.1 テストテーブルt_userを作成する1.2 一時テーブルの作成2...

VMware15/16 VMwareのロックを解除してMacOSをインストールする詳細な手順

VMware バージョン: VMware-workstation-full-16 VMware バー...

ServerSocketのデフォルトIPバインディングの実装プロセスの詳細な説明

開発中にサーバーを起動する必要がある場合、ローカルテストではポートを直接書き込み、実際の環境ではバイ...

nginxでgzip圧縮を有効にする手順を完了する

目次序文1. gzip圧縮を設定する2. 詳細設定3. nginxサービスを再起動する要約する序文ウ...

MySQL 5.7.10 インストール ドキュメント チュートリアル

1. 依存パッケージをインストールする yum -y インストール gcc-c++ ncurses-...

JavaScriptアップロードファイル制限パラメータケースの詳細な説明

プロジェクトシナリオ: 1. アップロードファイルの制限関数: 1. フロントエンド操作による異常な...

Linux sedコマンドの使用

1. 機能紹介sed (Stream EDitor) は、コンテンツを 1 行ずつ処理するストリーム...

MySQL 演算子の具体的な使用法 (and、or、in、not)

目次1. はじめに2. 本文2.1 および演算子2.2 または演算子2.3 オペレーター2.4 no...

小さなアイコンのフロントエンド処理ソリューションのグラフィカルな説明

序文この記事を始める前に、複数選択の質問をしてみましょう。フロントエンド開発でビルド ツールを使用す...

ウェブサイトの高速化における CDN、SCDN、DCDN の違いは何ですか?どうやって選ぶ?

1. CDNこれは、Web サイト上で最もよく使用される加速機能です。分散サーバー レイアウトによ...

MySQL インデックス カバレッジの例の分析

この記事では、MySQL インデックス カバレッジについて例を挙げて説明します。ご参考までに、詳細は...

GolangでMySQLデータベースを操作するための実装コード

序文Golang は、SQL データベースにアクセスするための database/sql パッケージ...