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ルータールーティングの詳細な説明

推薦する

node.js でマルチコア CPU を最大限に活用する方法

目次概要node.js でマルチコア CPU を最大限に活用する方法Node で子プロセスを作成する...

MySQL で絵文字表現を挿入できない理由と解決策

失敗のシナリオMySQL データベースに絵文字表現を挿入するために JDBC を呼び出すと、例外ja...

JavaScriptの信頼性の低い未定義

undefined JavaScript では、値が undefined かどうかを判断したい場合は...

HTML外部参照CSSファイルが効果を発揮しない理由の分析と解決

フロントエンドの初心者として、私は数日間フロントエンドをいじってみました。 。今日、私は自分が固く信...

円形/扇形メニューを2分で実装する方法を教えます(基本バージョン)

序文このプロジェクトでは円形のメニューが必要です。オンラインで検索しましたが、適切なものが見つからな...

MySQL 5.7.17 のインストールと使用方法のグラフィックチュートリアル

MySQL は、スウェーデンの会社 MySQL AB によって開発され、現在は Oracle が所有...

ウェブフォームデザインのための5つの実用的なヒント

1. フォームテキスト入力のモバイル選択: テキスト入力フィールドにプロンプ​​トが追加されている場...

Linuxサービスの監視と運用および保守

目次1. psutilパッケージをインストールする次に、オペレーティングシステム内のすべてのサービス...

Html、sHtml、XHtml の違いのまとめ

たとえば、<u>には終了文字がなく、ブラウザはそれを認識します。 SHTML は Ser...

CentOS7でFTPサーバーを設定する方法

FTP は主にファイル転送に使用され、Linux では vsftpd で実装されるのが一般的です。F...

nodejsとyarnをインストールし、Taobaoソースプロセスレコードを構成する

目次1. nodejsをダウンロードする2. ダブルクリックしてインストール3. グローバル npm...

Node.js で Bash スクリプトを書くための究極のソリューション

目次序文zxライブラリ$`コマンド` CD()フェッチ()質問()寝る()スローしない()チョークフ...

MySQL でテーブルデータをクリアする 2 つの方法とその違い

MySQL でデータを削除するには 2 つの方法があります。切り詰めは大まかな伐採の一種である削除は...

WIN2008 サーバーのコマンド ラインを使用して IIS7 コンポーネントをインストールおよびアンインストールする方法

注意: .NET FrameWork はコア モードで実行できないため、コア インストール モードの...

CentOS7.8 に mysql 8.0.20 をインストールするための詳細なチュートリアル

1. MySQLソフトウェアをインストールするMySQL 公式 Yum リポジトリ、MySQL バー...