この記事では、mysql に関する関連知識を提供します。主にグローバル ロックに関する関連問題を紹介します。グローバル ロックは、データベース全体をロックします。データベースに読み取りロックを追加すると、他のリクエストはデータベースに書き込みロックを追加できなくなります。一緒に見てみましょう。皆さんのお役に立てれば幸いです。
推奨学習: mysql ビデオ チュートリアル
データベース設計の本来の目的は、共有リソースとして同時実行の問題に対処することです。複数のユーザーによる同時アクセスが発生した場合、データベースはリソース アクセス ルールを合理的に制御する必要があります。ロックは、このアクセス ルールを実装するために使用される重要なデータ構造です。
まず、ロックの一般的な分類の図を掲載しましょう。
ロックの範囲に応じて、MySQL のロックはグローバル ロックに大別できます。 、テーブル ロック、テーブル ロック、ロック、行ロック。最初にこれらの種類のロックを主に学習しますが、この記事ではグローバル ロックについて学習します。
グローバル ロックは、データベース全体をロックすることです。データベースに読み取りロックを追加した後、他のリクエストはデータベースに書き込みロックを追加できません。データベースに書き込みロックを追加すると、後続の他のリクエストはデータベースに読み取りまたは書き込みロックを追加できません。
MySQL は、グローバル読み取りロック、読み取りロック付きテーブルのフラッシュ (FTWRL) を追加するメソッドを提供します。ライブラリ全体を読み取り専用状態にする必要がある場合、このコマンドを使用すると、他のスレッドの次のステートメントがブロックされます: データ更新ステートメント (追加、削除、変更)、データ定義ステートメント (テーブルの作成を含む) 、テーブル構造の変更など)および更新 クラス トランザクションのコミット ステートメント。
グローバル ロックの使用シナリオ: データベース全体の論理バックアップを作成します。論理バックアップとは、データベース全体のすべてのテーブルを選択し、テキストとして保存することを意味します。つまり、グローバル ロックは、マスタ/スレーブ データのバックアップまたはデータのインポートとエクスポートを実行する場合にのみ使用されます。
データのバックアップやデータのインポート、エクスポートを行う際、この期間中にデータの追加、削除、変更が同時に行われると、データの不整合が発生するためです。
以前は、前述の FTWRL を使用して、バックアップ中に他のスレッドがデータベースを更新しないようにする方法がありました。 注: バックアップ プロセス中、ライブラリ全体は完全に読み取り状態になります。状態のみ。
グローバル ロックはこのデータベースに向けられているため、グローバル ロックの追加は非常に危険に思えます:
グローバル ロックの追加は非常に大きな影響を与えるため、ロックを回避できるでしょうか?
上記の導入により、ロックはデータの不整合の問題を解決するためのものであることがわかりました。したがって、データの不整合の問題を解決できる限り、グローバル ロックを追加する必要はありません。データのバックアップ開始時に操作ログを記録しておけば、バックアップ中はロックなしでデータベースへの追加・削除・変更・問い合わせが可能となり、バックアップ中は追加・削除の操作記録が残るという考え方もあります。 、変更とクエリは 1 つのログ ファイルに記録されます。バックアップが完了した後、この期間中にログ ファイル内のすべての操作が実行されます。これにより、バックアップの前後でデータの一貫性が確保されます。
要約すると、ロックがないと、バックアップ データとメイン データは論理的な時点になく、このビューは論理的に矛盾します。論理時点が一貫していること、つまり論理ビューが一貫していることを確認すれば、データの一貫性を確保できます。ここから、以前に学習したトランザクション分離レベルを考えます。反復可能な分離レベルでトランザクションを開くことは、一貫した見解。
MySQL のデフォルト エンジンである InnoDB には、データの一貫性を確保するためのメカニズムがあります。 InnoDB エンジンにはデータ スナップショット バージョン機能があります。MVCC は履歴バージョンのスナップショットを保持するため、この機能は MVCC と呼ばれます。各スナップショットはトランザクション バージョン番号に対応します。データをバックアップするとき、トランザクション バージョン番号を申請します。読み取り時データをフェッチする場合は、自分のトランザクション バージョン番号よりも小さいトランザクション バージョン番号を持つデータを読み取るだけで済みます。
公式の論理バックアップ ツールは mysqldump です。 mysqldump がパラメーター -single-transaction を使用する場合、一貫したビューが確実に取得されるように、データをインポートする前にトランザクションが開始されます。 MVCC のサポートにより、このプロセス中にデータは正常に更新されます。
--single-transaction パラメータの役割は、トランザクションの分離レベルを反復可能な読み取り、つまり REPEATABLE READ に設定することです。これにより、トランザクション内のすべての同じクエリが同じデータを読み取ることが保証されます。ダンプ中に、他の InnoDB エンジン スレッドがテーブル データを変更して送信しても、ダンプ スレッドのデータには影響しません。
そして、WITH CONSISTENT SNAPSHOT をスナップショット レベルに設定します。反復可能な読み取りのみの場合、トランザクションの開始時にデータがダンプされる前に、他のスレッドがデータを変更して送信し、この時点での最初のクエリの結果が他のスレッドによって送信された結果であり、WITH であると想像してください。 CONSISTENT SNAPSHOT では、トランザクションの開始時に、最初のクエリの結果がトランザクション開始時のデータ A であることを保証できます。この時点で他のスレッドがデータを B に変更したとしても、クエリの結果は A のままです。
単一トランザクション方式は、すべてのテーブルがトランザクション エンジンを使用するライブラリにのみ適用されます。 mysqldump プロセスに --single-transaction を追加すると、InnoDB データの完全な一貫性を確保できます。トランザクションをサポートしていない MyISAM のようなエンジンの場合、バックアップ プロセス中に更新がある場合、最新のデータのみを取得できます。バックアップの一貫性が破壊されます。現時点ではまだグローバル ロックが必要なので、FTWRL コマンドを使用する必要があります。
ライブラリ全体が読み取り専用なので、なぜ set global readonly = true を使用しないのですか?という質問もあるかもしれません。
readonly メソッドでもライブラリ全体を読み取り専用状態にできることは事実ですが、主に次の 2 つの理由により、それでも FTWRL メソッドを使用することをお勧めします。 #一部のシステムでは、readonly の値は、データベースがメイン データベースであるかスタンバイ データベースであるかを決定するなど、他のロジックに使用されます。したがって、グローバル変数を変更すると、より大きな影響が生じます。
mysql ビデオ チュートリアル
以上がMySQL グローバル ロックについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。