MySQLデータベースの操作とメンテナンスのデータ復旧方法

MySQLデータベースの操作とメンテナンスのデータ復旧方法

これまでの 3 つの記事では、論理バックアップと物理バックアップを含む、MySQL データベースの一般的なバックアップ方法を紹介しました。この記事では、MySQL データベースのデータ復旧に関連する内容をまとめます。これらのデータ復旧ソリューションは、以前のバックアップ コンテンツで紹介されました。ここでは、復旧ソリューションをまとめ、データベースのバイナリ ログと組み合わせたデータ復旧を実演します。

1. 復旧計画

1. データ量がそれほど大きくない場合は、mysql client コマンドまたは source コマンドを使用して、mysqldump コマンドでバックアップしたデータを復元できます。
2. Xtrabackup を使用してデータベースの物理バックアップとリカバリを完了します。その間、データベース サービスを再起動する必要があります。
3. LVM スナップショット ボリュームを使用してデータベースの物理バックアップとリカバリを完了します。その間、データベース サービスを再起動する必要があります。

2. ポイントインタイムリカバリにmysqlbinlogを使用する

1. はじめに

mysqlbinlog はバイナリ ログからステートメントを読み取るツールで、インストール後に mysql に付属します。

2. バイナリログリカバリの原理

mysqldump を使用してデータベースをバックアップすると、生成されたバックアップ ファイルには、データベース DML 操作の時点とバックアップ時のバイナリ ログ位置情報が含まれます。単一データベースの場合は、特定の時点から開始してポイントインタイム リカバリを実行できます。マスター スレーブ アーキテクチャの場合は、バックアップ中に --master-data=2 および --single-transaction に従って、時点または位置ポイントに基づいてリカバリを完了できます。

3. バイナリログリカバリの例

(1)単一データベースのリカバリ例

データベースを作成し、テストデータを挿入する

mysql> SHOW CREATE DATABASE test_db;
mysql> テーブル `student` を作成します (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) NOT NULL,
 `age` tinyint(4) デフォルト NULL,
 主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 デフォルト CHARSET=utf8;
mysql> INSERT INTO 学生 (名前、年齢) VALUES('Jack',23),('Tomcat',24),('XiaoHong',22),('ZhangFei',29);

mysqldumpを使用してフルバックアップを実行し、バックアップ時にログをロールし、バイナリログファイル名とログの場所を記憶します。

[root@WB-BLOG ~]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --databases test_db --single-transaction --triggers --routines --flush-logs --events > /tmp/test_db.sql
[root@WB-BLOG ~]# mysql -e "バイナリログを表示" > bin_pos_`date +%F`.out

この時点で、バイナリログファイル名とログポイントの場所を次のように表示します。

mysql> バイナリログを表示します。
+------------------+-----------+
| ログ名 | ファイルサイズ |
+------------------+-----------+
|mysql-bin.000001 | 1497 |
|mysql-bin.000002 | 397 |
+------------------+-----------+
セット内の 2 行 (0.00 秒)

しばらく使用した後、誤って次のステートメントを実行し、データベース内のすべてのデータを変更しました。

mysql> UPDATE STUDENT SET name = 'admin';

しばらくして、おそらく数分か数時間後、誰かがウェブサイトのログインに問題があると報告しました。確認したところ、多くのデータが誤って変更されたことがわかりました。この期間中、次の新しいレコードなどの書き込み操作がまだありました。

mysql> 学生にINSERT INTO(名前、年齢) VALUES('Hbase',23),('BlackHole',30);

このとき、データを復元する必要があります。まず、データが書き込まれないように、テーブルをロックし、書き込みサービスを一時停止し、ユーザーにシステムメンテナンスを通知してから、次の操作を実行します。

#データベースにログインし、テーブルをロックします。この時点では、テーブルは読み取りのみ可能で、書き込みはできません。mysql> USE test_db;
mysql> LOCK TABLE 学生の読み取り;
#次に、セッション ウィンドウを再度開きます (再度開くことに注意してください)。そうしないと、セッションが終了した後にロックが解除されます。次に、既存のデータとバイナリ ログ ファイルを圧縮してバックアップします [root@WB-BLOG mysql_logs]# tar zcvf mysql_data.tar.gz /mysql_data/*
[root@WB-BLOG mysql_logs]# tar zcvf mysql_bin.tar.gz /mysql_logs/*
#最新のフルバックアップデータをインポートします [root@WB-BLOG ~]# mysql -uroot -proot -h127.0.0.1 -P3306 < /tmp/test_db.sql 

# フルバックアップ中のバイナリログファイルとログポイントを表示します [root@WB-BLOG ~]# cat bin_pos_2018-06-24.out 
  ログ名 ファイルサイズ
  mysql-bin.000001 1497
  mysql-bin.000002 397
#ポイント 861 以降のバイナリ ログ ファイルを SQL ファイルに変換します [root@WB-BLOG bin]# ./mysqlbinlog /mysql_logs/mysql-bin.000002 --start-position=397 > /tmp/tmp.sql
# vim エディタを使用してこの sql ファイルを編集し、無条件 UPDATE ステートメントを見つけて削除し、UPDATE ステートメントを削除した後の sql スクリプトの内容をデータベース [root@WB-BLOG bin] にインポートします。# vim /tmp/tmp.sql
  `test_db`/*!*/ を使用します。
  タイムスタンプを 1522088753/*!*/ に設定します。
  update student set name = 'admin' #この文を削除 [root@WB-BLOG bin]# mysql -uroot -proot -h127.0.0.1 -P3306 < /tmp/tmp.sql
#データベースにログインして、データが復元されたかどうかを確認します。誤って変更されたデータが復元されたかどうかを確認し、テーブルのロックを解除してデータを再度準備することができます。mysql> UNLOCK TABLES;

(2)マスタースレーブアーキテクチャのデータ復旧例

環境

メインデータベース: 192.168.199.10 (node01)
ライブラリから: 192.168.199.11 (node02)

まず、スレーブ データベースの SQL スレッドを停止し、スレーブ データベース上のすべてのデータをバックアップして、バックアップ ファイルに「SHOW SLAVE STATUS」情報を入力します。「SHOW SLAVE STATUS」の出力情報には、マスター データベースへの現在のアプリケーションの情報が記録されます。

#スレーブ データベースにログインし、SQL スレッドをシャットダウンします。mysql> STOP SLAVE SQL_THREAD;
クエリは正常、影響を受けた行は 0 行 (0.01 秒)
#次に、現在スレーブライブラリに適用されているマスターライブラリのバイナリログファイル情報を記録します [root@node02 mysql_data]# mysql -e "SHOW SLAVE STATUS \G" > slave_`date +%F`.info
[root@node02 mysql_data]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --databases test_db --routines --triggers --single-transaction > /tmp/mysql_test_db_`date +%F`.sql

スレーブでバックアップが完了したら、スレーブの SQL スレッドを再起動します。

mysql> スレーブ SQL_THREAD を開始します。
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

SQL スレッドが開始されると、バックアップ期間中のマスター データベース上の DML 操作がスレーブ データベースに再同期されます。マスターデータベースでエラーが発生し、条件を追加せずに学生テーブルのすべてのデータを更新すると、テーブル内のすべてのデータが変更されます。このとき、同期操作により、スレーブデータベースも変更されます。

# メイン データベースにログインし、データベースの外部ユーザーを一時的にサービスを提供しないように変更してから、ログをロールします。 mysql> UPDATE mysql.user SET Host = '127.0.0.1' WHERE User='tomcat';
クエリは正常、1 行が影響を受けました (0.00 秒)
#権限テーブルを更新しますmysql> FLUSH PRIVILEGES;
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
#ローリング logmysql> FLUSH LOGS;
クエリは正常、影響を受けた行は 0 行 (0.01 秒)
#スレーブデータベースのバックアップデータとバックアップ時のスレーブデータベースのスレーブ情報をマスターデータベース [root@node02 mysql_data] に転送します# scp /tmp/mysql_test_db_2018-06-24.sql 192.168.199.10:/root/
[root@node02 mysql_data]# scp スレーブ_2018-06-24.info node01:/root/

マスターライブラリのデータディレクトリとバイナリログファイルディレクトリをバックアップします

[root@node01 mysql_logs]# tar zcvf mysql_master_data.tar.gz /mysql_data/*
[root@node01 mysql_logs]# tar zcvf mysql_logs.tar.gz /mysql_logs/*

データベースの最新のバックアップからデータをインポートする

[root@node01 mysql_logs]# mysql -uroot -proot -h127.0.0.1 -P3306 < /root/mysql_test_db_2018-03-26.sql 
#注: 上記の操作ではメイン データベースのテーブルをロックできません。そうしないと、完全バックアップ データをインポートできません。

バックアップ時にスレーブデータベースから適用されたマスターデータベースのバイナリログファイル名と場所を表示します。

[root@node01 mysql_logs]# cat /root/slave_2018-03-26.info
  Master_Log_File: master-bin.000002 #バックアップ中に適用されるマスターバイナリログファイルの名前 Read_Master_Log_Pos: 395 #バックアップ中に適用されるマスターバイナリログファイルの場所

このログ ファイルとログ ポイントから開始して、ログ ポイント 395 以降のログ ファイルを SQL スクリプトに変換します。バイナリ ログ ファイルが複数ある場合は、次に示すように、それらを同時に SQL スクリプトに変換できます。

[root@node01 mysql_logs]# mysqlbinlog /mysql_logs/master-bin.000002 --start-position=395 > /tmp/tmp.sql
#master-bin.000003、master-bin.000004、master-bin.000005 を /tmp.sql ファイルにマージします [root@node01 mysql_logs]# mysqlbinlog /mysql_logs/master-bin.00000{3,4,5} --start-position=395 > /tmp/tmp.sql

間違った更新ステートメントを見つけて削除し、増分SQLスクリプトをデータベースにインポートします。

[root@node01 mysql_logs]# vim /tmp/tmp.sql
  `test_db`/*!*/ を使用します。
  学生セット名を 'admin' に更新します #この文を削除します [root@node01 mysql_logs]# mysql -uroot -proot -h127.0.0.1 -P3306 < /tmp/tmp.sql 

データベースにログインして、データが正常かどうか、誤って変更されたデータが復元されているかどうかを確認します。復元されている場合は、マスターデータベースのデータをバックアップし、スレーブデータベースに転送して、スレーブデータベースのリカバリを完了します。

[root@node01 mysql_data]# mysqldump -uroot -proot -h127.0.0.1 -P3306 --databases test_db --routines --triggers --single-transaction --master-date=1 > /tmp/master_test_db_`date +%F`.sql
[root@node01 mysql_data]# scp /tmp/master_test_db_2018-06-24.sql node01:/root/
#スレーブ データベースが読み取り専用に設定されている場合、最初に読み取り専用制限を削除する必要があります。mysql> SET GLOBAL read_only = OFF;
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
#データベース [root@node02 mysql_logs] からデータをインポートします。# mysql -uroot -proot -h127.0.0.1 -P3306 < /root/master_test_db_2018-06-24.sql
# 読み取り専用スレーブを有効にする mysql> SET GLOBAL read_only = ON;
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

マスター データベースにバックアップするときに --master-date=1 パラメータが追加されたため、データベースからインポートした後にマスター変更操作を再実行する必要はありません。

スレーブデータベースにログインし、SHOW SLAVE STATUS 情報が正常かどうかを確認します。正常であれば、マスターデータベースにログインし、再度認証テーブルを変更してから、外部にサービスを提供します。

mysql> UPDATE mysql.user で Host = '192.168.0.%' を設定し、 User = 'tomcat' とします。
mysql> 権限をフラッシュします。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)

実行が完了すると、マスタースレーブデータが復元されます。

ここまでで、データ復旧の紹介は完了です。上記では、フルバックアップとバイナリログを使用した、シングルインスタンスデータベースとマスタースレーブデータベースのデータ復旧プロセスを紹介しました。ご質問がある場合は、コメントしてご指摘ください。皆様も123WORDPRESS.COMを応援して頂ければ幸いです。

以下もご興味があるかもしれません:
  • MySQL バイナリログデータ復旧: 誤ってデータベースを削除した場合の詳細な説明
  • Navicat for MySQLのスケジュールされたデータベースバックアップとデータ復旧の詳細
  • MySQLバイナリログを介してデータベースデータを復元する方法の詳細な説明
  • MySQLデータベースを誤って削除した後にデータを回復するための手順
  • mysqldump (MySQL データベースのバックアップとリカバリ) の使用方法についての簡単な説明
  • mysql バイナリ ログ ファイル データベースの復元
  • MySQLデータベースのログファイル(binlog)を自動的に復元する方法を説明します
  • 時点別のMySQLデータベース復旧実績

<<:  PHP+nginx サービス 500 502 エラーのトラブルシューティングのアイデアの詳細な説明

>>:  JavaScript における継承の 3 つの方法

推薦する

nginx が複数のプロキシ層を通過して実際の送信元 IP を取得するプロセスの詳細な説明

質問Nginx は $remote_addr を実際の IP アドレスとして受け取りますが、実際には...

Nginxの書き換えモジュールの詳細な説明

書き換えモジュールは ngx_http_rewrite_module モジュールです。その主な機能は...

Centos7 での mysql 8.0.15 のインストールと設定

この記事では、参考までにMySQL 8.0.15のインストールと設定のグラフィックチュートリアルを紹...

JavaScriptで配列かどうかを判断するためのさまざまな方法のまとめ

目次序文配列.isArrayコンストラクタインスタンスプロトタイプオブジェクト.プロトタイプ.toS...

CentOS8 で Docker を使用してオープンソース プロジェクト Tcloud をデプロイするチュートリアル

1. Dockerをインストールする1. 仮想マシンに Centos7 をインストールしました。Li...

WeChatアプレットでQRコードを識別するために長押しする実装プロセス

序文公式アカウントのQRコードは長押しで認識できることは皆さんご存じですが、ミニプログラムに対する制...

Nginx を使用してグレースケール リリースを実装する

グレースケールリリースとは、白と黒をスムーズに移行できるリリース方法を指します。 ABテストとは、グ...

HTML の空リンク href="#" と href="javascript:void(0)" の違い

# には位置情報が含まれます。デフォルトのアンカーは #top で、これは Web ページの上部です...

Linux での Apache サービスの展開と構成

目次1 Apacheの役割2 Apacheのインストール3. Apacheを有効にする4 Apach...

JS を使用して要素がビューポート内にあるかどうかを確認する方法

序文要素がビューポート内にあるかどうかを監視する2つの方法を共有する1. 位置計算Element.g...

ウェブデザインの発展と西洋建築の類似点は何でしょうか?

歴史は常に驚くほどうまく繰り返される。西洋建築とウェブデザインは、どちらも工学と芸術の組み合わせです...

HTML で点線の境界線を設定する方法

CSSスタイルとHTMLタグ要素を使用するさまざまな HTML タグに点線の境界線を追加するために、...

Nginx Httpモジュールシリーズにおけるautoindexモジュールの具体的な使用法

ブラウザ モジュールの主な機能は、http リクエスト ヘッダーの「User-Agent」の値とブラ...

JSは単純なフィルタリングから複数条件のフィルタリングまで配列フィルタリングを実装します

目次単一条件単一データフィルタリング単一条件複数データフィルタリング複数の条件付きデータフィルタリン...

JavaScript で Webpack を使用するチュートリアル

目次0. Webpackとは1. Webpackの使用2. Webpackのコアコンセプト2.1 エ...