この記事では、mysql 原則における InnoDB ストレージ エンジン アーキテクチャ設計に関する関連知識を提供します。お役に立てば幸いです。

InnoDB コンポーネント構造:
バッファ プール: バッファ プール、キャッシュ ディスク データ
-
redo ログ バッファ: バッファ プール上の操作を記録し、ダウンタイムによるデータ損失を防ぐためのポリシーに従ってディスクに書き込みますが、トランザクションは送信されました
undo ログ: バッファ プール内のデータが処理されるとき変更を行う場合、トランザクションがコミットされる前にロールバックできます。ロールバックを容易にするために古い値がアンドゥ ログ ファイルに書き込まれます。このとき、バッファ内のデータはプールはディスク内のプールと矛盾しており、ダーティ データです
1. バッファ プール
##今、更新ステートメントがあるとします:
update users set name = 'lisi' where id = 1
ログイン後にコピー
データベースを更新する必要があります。InnoDB はどのような操作を実行しますか?

まず、InnoDB はデータ ID = 1 がバッファ プールに存在するかどうかを確認し、存在しない場合はディスクからバッファ プールにロードされます。また、行データに排他ロックを追加して、複数の SQL が同時に行データを変更するのを防ぎます。

2. undo ログ ファイル
ID = 1、このデータ名の元の値が name = 'zhangsan であると仮定します。 '、今度は name = 'lisi' に更新したいので、古い値 name='zhangsan' と id=1 をアンドゥ ログ ファイルに書き込む必要があります。
データベースに精通している学生の場合、トランザクションの概念は全員理解しています。トランザクションが送信される前に、すべての操作をロールバックできます。つまり、name = 'lisi' は name = にロールバックできます。 'zhangsan' なので、更新前の値が undo ログ ファイルに書き込まれます。

#3. バッファ プール データの更新
UNDO ログ ファイルが書き込まれた後、メモリ データ内のこのエントリの更新を開始します。 name = 'zhangsan'、id = 1 を name = 'lisi' に更新します。このとき、メモリ上のデータは更新されていますが、ディスク上のデータは変化していないため、不整合なダーティデータが出現します。
現時点でご質問があるかもしれません。トランザクションは送信されたものの、MySQL サービスがダウンしており、メモリ内のデータがディスクに書き込まれていない場合データ損失が発生し、SQL 実行データの不整合が発生します。
4. REDO ログ バッファ
InnoDB 構造には、REDO ログを保存するための REDO ログ バッファ バッファがあります。 id=1、name='zhangsan'をname='lisi'に変更したログです。
#しかし、現時点では REDO ログバッファはメモリ上にのみ存在しており、MySQL ダウン後のデータ復旧は実現できません。
5. トランザクションが送信されない場合、データベースがダウンした場合に影響はありますか?
実際には、影響はありません。トランザクションは送信されませんでした。つまり、実行が成功しませんでした。MySQL がクラッシュまたはダウンした後でも、バッファ プールと REDO ログ内の変更されたデータは残ります。メモリ内のバッファは失われますが、データの整合性には影響しません。トランザクションのコミットが失敗した場合、データベース内のデータは変更されません。

6. トランザクションの送信、REDO ログ構成戦略
トランザクションを送信すると、REDO ログは次に従って REDO を実装します。戦略 ログは REDO ログ バッファからディスクに書き込まれます。ポリシーは innoDB_flush_log_at_trx_commit を介して構成されます。
innoDB_flush_log_at_trx_commit のパラメータは 0 です。トランザクションがコミットされた後でも、REDO ログはディスクに書き込まれません。 MySQL がクラッシュすると、メモリ内のデータが失われます。

innoDB_flush_log_at_trx_commit のパラメータは 1 です。トランザクションが送信された後、REDO ログはメモリからメモリにフラッシュされます。トランザクションが正常に送信される限り、REDO ログはディスク上に存在する必要があります。
この時点でバッファプールのデータがディスクにフラッシュされない場合でも、REDO ログからどのデータが変更されたかを知ることができます。 、MySQL がシャットダウンして再起動します。その後、変更されたデータを REDO ログから復元できます。 
innoDB_flush_log_at_trx_commit のパラメータは 2 です。トランザクションが送信された後、REDO ログは OS キャッシュにのみ残り、この時点でサービスがダウンした場合に備えてディスクにはフラッシュされません。その場合、OS キャッシュ内のデータも失われ、トランザクションが正常に送信された場合でも、データは失われます。

これらを読んだ後、データのセキュリティを確保するにはパラメータ 1 が最良の戦略であると思います。
7. トランザクションの最終送信である binlog
binlog は実際には MySQL Server に属するログ ファイルであり、大きな関係があるためここで提案されています。 REDO ログ関連付け付き。
1) biglog と redo ログの違い
#2) トランザクションを送信するときに、同時にバイナリログを書き込みます
更新の実行中、innoDB と実行プログラムは、バッファー プールへのデータのロード、UNDO ログ ファイルの書き込み、メモリ データの更新、REDO ログの書き込み、ディスクへのフラッシュなどの対話を継続的に行います。 binlog への書き込みも実行プログラムによって実行されます。

ステップ 1、2、3、および 4 は、update ステートメントを実行するときに実行する処理であり、ステップ 5 と 6 は、トランザクションをコミットするときに実行する処理です。
3) ビンログ ログ フラッシュ戦略の分析
sync_binlog パラメーターは、ビンログ フラッシュ戦略を制御します
- トランザクションの送信後、sync_binlog のデフォルト値は 0 です。 , binlog ログは OS キャッシュに保存されます。MySQL がダウンすると、OS キャッシュのデータは失われます。
- sync_binlog 値は 1 です。トランザクションが送信された後は、 、binlog ログはディスクに直接フラッシュされます。
4) binlog と redo ログに基づいてトランザクションの送信を完了する
binlog がディスクに書き込まれると、binlog ログ ファイルの場所とファイル名は次のようになります。 REDO ログ ファイルに書き込まれ、REDO ログ ファイルにコミット マークが書き込まれます。

5) commit タグの意味は何ですか?
コミット マークは、REDO ログと binlog ログの一貫性を保つことを意味します。トランザクションの送信がステップ 5 またはステップ 6 で開始され、MySQL がダウンし、REDO ログにコミット マークがない場合、トランザクションの送信は失敗したとみなされます。
は、コミット マークがトランザクションが最終的に正常に送信されたことを意味します。
8. バッファ プール ダーティ データがディスクにフラッシュされる
ダーティ データは、バックグラウンド IO スレッドによってランダムにディスクにフラッシュされます。

これを考慮してください。ディスクをフラッシュする前に MySQL がダウンした場合はどうすればよいでしょうか?この時点ではトランザクションは正常に送信されており、REDOログにはコミットマークが残っていますが、たとえダウンしていても、再起動後はREDOログファイルに従ってメモリ上にデータが更新され、IOを待ちます。ディスクをフラッシュするスレッド。
9. 概要
update ステートメントによる分析を実行した後、InnoDB ストレージ エンジンにはバッファ プール、REDO ログ バッファ、その他のキャッシュが含まれていることがわかりました。データ: undo ログや reod ログなどのログ ファイル、および MySQL Server ログ ファイル。
update ステートメントを実行すると、バッファ プール、UNDO ログ ファイルの書き込み、REDO ログ バッファの書き込み、およびその他の操作が変更されます。トランザクションが送信されると、REDO ログがフラッシュされ、binlog がフラッシュされます。 、binlog ファイル名が書き込まれ、位置、コミット マークを書き込み、最後に IO スレッドがバッファ プール内のダーティ データをランダムにフラッシュするのを待ちます。
推奨学習:
mysql ビデオ チュートリアル
以上がMySQL の原則と InnoDB ストレージ エンジンのアーキテクチャ設計を完全にマスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。