InnoDB のロック メカニズムについて話したい場合、必然的に MySQL ログ システム、binlog、redo ログ、undo ログなどが関係することになります。悪い、急いで友達と共有してください。
ログは mysql
データベースの重要な部分であり、データベースの操作中のさまざまなステータス情報を記録します。 mysql
ログには主に、エラー ログ、クエリ ログ、スロー クエリ ログ、トランザクション ログ、バイナリ ログが含まれます。
開発者として注目する必要があるのは、バイナリ ログ (binlog
) とトランザクション ログ (redo ログ
および undo ログ## を含む) です。 #). この記事では、次にこれら 3 種類のログについて詳しく紹介します。
binlog は、データベースによって実行された書き込み操作 (クエリを除く) 情報を記録するために使用され、バイナリ形式でディスクに保存されます。
binlog は
mysql の論理ログで、
Server レイヤーによって記録されます。任意のストレージ エンジンを使用する
mysql データベースは ## を記録します# binlog
ログ。
データは最終的にデータ ページに保存され、物理ログにデータ ページの変更が記録されます。
は追加によって書き込まれます。各 binlog
ファイルは、max_binlog_size
パラメータを通じて設定できます。サイズが指定された値に達すると、ログを保存するために新しいファイルが生成されます。 実際のアプリケーションでは、
にはマスター/スレーブ レプリケーションとデータ リカバリという 2 つの主な使用シナリオがあります。
側で binlog
を開き、binlog
を各 ## に送信します。 #スレーブ 側、
スレーブ 側は
binlog を再生して、マスターとスレーブのデータの一貫性を実現します。
biglog 、この時点ではレコードはまだメモリ内にあるため、
biglog がディスクにフラッシュされたのはいつですか?
mysql
sync_binlog パラメータを通じて
biglog のフラッシュ タイミングを制御します。値の範囲は
0 ~ N:
N:
binlog
は、N 個のトランザクションごとにディスクに書き込まれる場合、
上記のことからわかるように、
であり、これは MySQL 5.7.7 でもあります。
以降のバージョンのデフォルト値。ただし、より大きな値を設定するとデータベースのパフォーマンスが向上するため、実際の状況では、値を適切に増やし、ある程度の一貫性を犠牲にしてパフォーマンスを向上させることもできます。 binlog ログ形式
、ROW
、MIXED# という 3 つの形式があります。 ##。
MySQL 5.7.7
より前のデフォルト形式は
STATEMENT
MySQL 5.7.7 以降のデフォルト値は
ROW 。ログ形式は
binlog-format で指定します。
STATMENT
ステートメントベースのレプリケーション、SBR)、各ステートメントは次のようになります。変更 データの SQL ステートメントは
binlog に記録されます。
ROW
MIXED
ROW 、MBR
) に基づく混合ベースのレプリケーション、一般的なコピーSTATEMENT
モードを使用して binlog
を保存します。STATEMENT
モードでコピーできない操作の場合は、ROW
モードを使用します。 binlog# を保存します。
##redo ログ
redo ログが必要な理由
簡単な方法は、トランザクションがコミットされるたびに、ディスクへの変更に関係するすべてのデータ ページをフラッシュすることです。ただし、これを行うと、主に次の 2 つの側面に反映される重大なパフォーマンス上の問題が発生します。
Innodb
は ページ
単位でディスク操作を実行し、トランザクションで変更できるのは数ページのデータのみであるためです。現時点で完全なデータ ページをディスクにフラッシュするのはリソースの無駄です。
そこで、REDO ログの基本概念mysql
は
redo ログを設計しました。具体的には、トランザクションがデータ ページに加えた変更を記録するだけです。これにより、パフォーマンスの問題 (比較的ファイルが小さく、シーケンシャル IO) が完全に解決されます。
REDO ログ には 2 つの部分が含まれます。1 つはメモリ内のログ バッファ (
REDO ログ バッファ) , もう 1 つはディスク上のログ ファイル (
redo logfile) です。
mysqlDML
ステートメントが実行されるたびに、レコードは最初に
redo ログ バッファに書き込まれ、その後、操作レコードは
redo ログ ファイル に書き込まれます。最初にログを書き込んでからディスクに書き込むこのテクノロジーは、
MySQL でよく言及されている
WAL (Write-Ahead Logging) テクノロジーです。
ユーザー スペース ) のバッファ データは通常、ディスクに直接書き込むことができず、オペレーティング システムのカーネル スペース (
kernel space) を経由する必要があります。 ) バッファ (
OS バッファ)。
redo logbufferwriting
redo logfile は、実際には最初に
OS Buffer に書き込み、次にシステム fsync() を通じて
を呼び出します。 それを
redo ログ ファイル にフラッシュします。プロセスは次のとおりです。
mysqlサポート 3 つのタイミング
redo ログ バッファ を
redo ログ ファイル に書き込む場合は、
innodb_flush_log_at_trx_commit パラメーターを使用して構成できます。各パラメーター値の意味は次のとおりです:
REDO ログは実際にデータ ページへの変更を記録します。全ての変更記録を保存する必要はないため、
redoログは固定サイズかつ循環書き込み方式で実装されており、最後まで書き込むと先頭に戻ってログを書き込みます。ループ。以下に示すように:
redo ログ があることが簡単にわかります。
データ ページ もフラッシュする必要があります。また、フラッシュする必要がある
データ ページ もあります。
redo ログ の主な意義は、
データ ページ
上の図の
write pos は、
redo log 現在のレコード
の LSN
(論理シーケンス番号) 位置を表します。チェックポイント は、データ ページ変更レコードがフラッシュされた後の
redo log に対応する
LSN
write pos
check point
間の部分は、新しいレコードの記録に使用される
redo ログ の空の部分です。
check の間point および
write pos は、ディスクに書き込まれるデータ ページの
redo log 変更レコードです。
write pos が
check point に追いつくと、まず
check point
innodb
を起動すると、前回正常終了、異常終了に関わらず、必ず回復操作が行われます。
redo ログ はデータ ページの物理的な変更を記録するため、回復速度は論理ログ (
binlog
innodb
を再起動すると、最初にディスク内のデータ ページの
LSN がチェックされます。データ ページの
LSN がログ LSN
の よりも小さい場合、リカバリは
checkpoint
ダウンタイム前に
checkpoint のディスク ブラッシング プロセスが進行中で、データ ページのディスク ブラッシングの進行状況がログ ページのディスク ブラッシングの進行状況を超える状況もあります。このとき、データが表示されます。ページに記録されている
LSN は、ログの
LSN
binlog
と
redo log# の違いからわかります。 ##: binlog
ログはアーカイブにのみ使用され、binlog
のみに依存する場合、クラッシュ セーフ
機能はありません。
ただし、redo log
だけは機能しません。redo log
は InnoDB
に固有であり、ログ内のレコードは書き込まれた後に上書きされるためです。ディスク。したがって、データベースが停止して再起動されたときにデータが失われないようにするには、binlog
と redo log
の両方を同時に記録する必要があります。
データベース トランザクションの 4 つの主要な特性の 1 つはアトミック性です。具体的には、アトミック性とは、データベースに対する一連の操作 (すべてが成功するかすべてが失敗するかのいずれか) を指します。成功。
実際、原子性の最下層は undo log
によって実現されます。 undo ログ
は主にデータの論理的な変更を記録します。たとえば、INSERT
ステートメントは、それぞれの DELETE
の undo ログ
に対応します。 UPDATE
ステートメントは、反対側の UPDATE
の undo ログ
に対応するため、エラーが発生したときにトランザクション前のデータ状態にロールバックできます。
同時に、アンドゥ ログ
は、MVCC
(マルチバージョン同時実行制御) 実装の鍵でもあります。
以上がMySQL の binlog/redolog/undolog の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。