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 の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: CSS の overflow: hidden の使い方 (オーバーフローの非表示とフロートのクリア)
場合によっては、SQL へのデータのエクスポートとインポートを容易にするために、特定のツールを使用し...
序文最近、オンラインでデータが誤って操作されました。データベースが直接変更されたため、それを回復する...
この質問は、MySQL の権限に関する WeChat グループのネットユーザー間の議論です。次のよう...
参考までに、Vue3でナビゲーションバーコンポーネントをカプセル化し、スクロールバーのスクロールに合...
サーバー: Ubuntu Server 16.04 LSSクライアント: Ubuntu 16.04 ...
ハードディスクのファイル属性のバッチ表示など、特定の種類のファイルに対してバッチ操作を実行する場合、...
目次if判定の最適化1. 最も簡単な方法:判断2. より良い方法: スイッチ3. より良いアプローチ...
序文: MySQL データベースは、よく使用される集計関数、日付および文字列処理関数など、幅広い関数...
mysql-5.7.19-winx64インストールフリー版の設定方法、参考までに具体的な内容は以下の...
方法1: SET PASSWORDコマンドを使用する mysql -u ルート mysql> ...
Nginx の紹介Nginx は、高性能な HTTP およびリバース プロキシ サーバーであり、IM...
設定ファイルに直接 サーバー{ listen 80 default; # IPへの直接アクセスを禁止...
この記事では、シンプルなカルーセルを実装するためのJavaScriptの具体的なコードを参考までに紹...
序文基本的なデータ構造として、配列とオブジェクトはさまざまなプログラミング言語で重要な役割を果たしま...
1. リストクエリインターフェースの効果コード処理ロジックを紹介する前に、まずは感覚的に理解し、レン...