45 MySQLの戦闘ストレスの研究ノート:グローバルロックとテーブルロック - プラスどのようにテーブルのフィールドにはあまりを妨げていますか?(講義6)

まず、今日の内容の要約

今日、私は、MySQLのロックについてあなたにお話したいと思います。データベースのロックは元々並行性の問題に対処するために設計されました。同時アクセスがある場合など、複数のユーザーが、リソースを共有し、データベースアクセスルールは、資源の合理的な制御を必要とします。ロックをするために使用される
これらの重要なデータ・アクセス・ルール構造を実現します。

ロックロック範囲、MySQLはグローバル・ロック・テーブル・レベル3と行ロックに分割することができます。今日は、この記事では、私はあなたとのグローバルロックと表ロックを共有します。ラインロック上のコンテンツは、私は再び次の記事に保つとなります
詳しくます。

ロックの設計が複雑であることに留意すべきは、これらの2つの記事は、ロックに特定の実装の詳細を伴わその背後にある原則の現象を説明し、ロックをヒットしません。

第二に、グローバルロック

1.グローバルロックとは何ですか

名前が示すように、データベース・インスタンス全体をロックするグローバルロックです。
MySQLは、グローバル読み取りロックを追加するための方法を提供し、コマンドがリードロック(FTWRL)とフラッシュテーブルです 。あなたが読み取り専用の状態でライブラリ全体をする必要があるときは、このコマンドを使用することができ、
その後、次の文他のスレッドがブロックされます。

  • 図1に示すように、データ更新(データの付加および欠失)
  • (等テーブルの構築、修飾テーブル構造を含む)2、データ定義文
  • 3は、更新クラスのトランザクションは、ステートメントをコミットします。

2、グローバルロックの典型的な使用シナリオ?

典型的な使用シナリオグローバルロックは、データベース全体の論理的バックアップを行うつまり、ライブラリ全体の各テーブルには、それがテキストとして保存を選択することです。

3、プラスグローバルロックは非常に良いではありません

以前は他のスレッドがデータベースの更新をしない、その後、ライブラリ全体のバックアップを作成していることを確認しFTWRLで、練習していました。バックアッププロセスが完全にライブラリ全体が読み取り専用であることに注意してください。
しかし、聞かせて全体のライブラリは読み取り専用で、それは非常に危険な音:

  1. あなたがメインのライブラリにバックアップした場合は、それがバックアップ中に更新を行うことができない、ビジネスは基本的にシャットダウンする必要があり、
  2. あなたがバックアップライブラリから、ライブラリーは、バックアップのbinlogから同期中にメインライブラリーから実行することができない場合は、マスター・スレーブ遅延につながります

それはそうですプラスグローバルロックは非常に良いではありません。しかし、あなたがそれをバックロックしたい理由について慎重に検討?問題はロックされていないものを見てみましょう。

4、バックアップなぜロック?何の問題ロックを解除?

あなたは、ユーザーとユーザーアカウントの残高のカリキュラムを懸念し、「オタクの時間」購買システムを維持するとします。今、論理バックアップを開始します。バックアップを取る間に、彼はビジネス・ロジックにコースを買って、ユーザーが存在し
、彼のバランスを控除した後に購入コースプラスコースの内側に行きます。

注文が口座残高(u_account)をバックアップするための時間であれば、ユーザーが購入した後、ユーザーのカリキュラム(u_course)をバックアップするために、何が起こるのだろうか?あなたは、このグラフを見ることができます:

あなたは、ユーザAのデータ状態は、バックアップの結果を見ることができる「口座残高がバックルが、複数のコースを持っているユーザーのカリキュラムませんでした。」後でデータを復元するには、このバックアップを使用する場合は、ユーザーAは、彼が作っていたことを発見しました。

ユーザーはそれがああ良いことだと思うことができないとして、あなたは想像することができます:テーブルをバックアップするためには、今度は、ユーザーアカウントの残高のカリキュラムをバックアップし、テーブルをバックアップし、そして何が発生する可能性がありますした場合は?

言い換えれば、それをロックしない、ライブラリを取得するためにバックアップするバックアップシステムが時間内に論理的なポイントではありません、このビューは矛盾した論理です。

5、mysqldumpをバックアップ処理が正常に更新されたデータ

実際には右、一貫性のあるビューを取得することができるようにする方法がある場合、あなたはそれについて考える必要がありますビューと言えば、我々は以前のトランザクション分離では約話していますか?

はい、それはダウン反復可能読み取りトランザクション分離レベルを開くことです。

注:私はあなたが変更を見ることができない理由:あなたは、分離の概念レベルは非常に明確ではありませんされている場合、トランザクションは、第三の記事」トランザクションの分離を確認することができますか?「関連するコンテンツで。

公式には、論理的なバックアップツールは、mysqldumpをされています。パラメータ-single-トランザクションを使用してmysqldumpをするとすると、それは一貫性のあるビューを取得するために確保するために、ガイドデータの前にトランザクションを開始します。そして、MVCCのサポートのため、
このプロセス内のデータが正常に更新されます。

6、この機能を使用するとmysqldumpを、なぜあなたはそれをFTWRL必要なのですか?

一貫性は良い読み物ですが、唯一のエンジンは、この分離レベルをサポートすること更新のバックアッププロセスは、常に最新のデータだけを取る場合たとえば、MyISAMのエンジンのために、このようなトランザクションをサポートしていない
、それは一貫性のあるバックアップを損ないます。この時点で、我々はFTWRLコマンドを使用する必要があります。

したがって、単一の取引方法は、トランザクションエンジンライブラリを使用して、すべてのテーブルにのみ適用されます。エンジンを使用して任意のテーブルには、トランザクション、唯一FTWRLメソッドを通じてバックアップをサポートしていない場合。
これは、多くの場合、理由の一つである、代替のInnoDB MyISAMテーブルを使用するDBA事業開発スタッフが必要です。

7は、読み取り専用にするライブラリ全体以来、なぜ設定されているグローバル読み取り専用=真の方法を使用していませんか?

設定されたグローバル読み取り専用= trueのように使用しないで、なぜあなたは、読み取り専用ためにライブラリ全体から、頼むかもしれませんか?実際、読み取り専用モードは、読み取り専用の状態に全体のリザーバを可能にするが、私は主に、あなたがFTWRL方法を使用することをお勧め
二つの理由:

  • まず、いくつかのシステムでは、読み取り専用の値は、ライブラリがメインライブラリまたはライブラリの機器を決定するために使用されるような他のロジックを、行うために使用されます。したがって、私はあなたが使用することをお勧めしません、グローバル変数は道に大きな表面に影響を与える変更します。
  • 第二に、例外処理メカニズムに違いがあります。あなたは、クライアントが切断されているので、その後、MySQLは自動的にグローバルロックを解除FTWRL異常の後にコマンドを実行した場合、ライブラリ全体は、通常のステータスの更新に戻してもよいです。全体のライブラリは、例外を読み取り専用に設定された後、クライアントが失敗した場合でも、データベースは、これは高いリスク、非書き込み可能な状態で長時間ライブラリ全体の原因となります、読み取り専用の状態のままになります。

更新操作データに付加および欠失(DML)だけではないが、テーブルの構造プラスフィールドなどを変更する(DDL)が作動されてもよいです。グローバルライブラリがロックされた後にどのような方法で、あなたは内部テーブル上の任意の操作を行うためのフィールドを追加したい、すべてがロックされます。

しかし、たとえグローバルロックされることなく、プラス私たちは紹介したいあなたの隣には、テーブルレベルのロックが発生しますので、フィールドは、簡単にはできません。

第三に、テーブルレベルのロック

MySQLのテーブルレベルロックの内側に二つある:一つは、テーブルがロックメタデータをロックである(メタデータロック、MDL)

1、テーブルロック

構文は、テーブルロックロックテーブル...読み取り/書き込みです。そしてFTWRL類似し、また、自動的にクライアントの切断を解除することができ、テーブルにロックを解除するためのイニシアチブのロックを解除することができます。注、ロックテーブルはほかに構文を制限しない
雄ねじを読み書きするには、このスレッドはまた、次の操作対象を定義します。

あなたが行う場合たとえば、ロックテーブルはA、T2の書き込みでのスレッドで読むT1;この文は、他のスレッドをt1を書き、t2は文がブロックされます読んで。一方、ロック解除テーブルをスレッド実行する前に、あなただけ行うことができる
行をT1を読み出す、読み出しのT2および書き込み動作。T1のために書くが、当然、他のテーブルにアクセスすることはできませんすることはできません。

よりきめの細かいロックがまだ現れていない場合には、テーブルロックは、同時実行を処理するための最も一般的な方法です。そして、InnoDBの行ロックのエンジンについては、このサポートは、一般的にロックテーブルを同時実行を制御するためのコマンドを使用していない、すべての後に、インパクトはテーブル全体がロックされていた
、まだ大きすぎます。

2、ロックメタデータ

他のテーブル・レベルのロッキングはMDL(メタデータロック)です。MDL明示的な使用、テーブルにアクセスするとき

候補者は、自動的に追加されます。MDLの役割は、読み取りと書き込みの精度を確保することです。あなたは、検索、クエリは、テーブル内のデータを介して行われた場合、想像して、このテーブルの構造上の別のスレッドの実行中に変更を加え、1を削除することができます
確かに、クエリがテーブルの上にスレッド構造と結果をいない取得しますそれは動作しません。

したがって、MDLを追加するとき、テーブルがCRUD操作を行うためのMySQL 5.5リリースでは、MDLの導入は、ロックを読んで、あなたが操作を行うには、テーブルの構造、プラスMDLの書き込みロックを変更したいとき。

  • 相互に排他的ではない読み取りロック、あなたがテーブルのCRUD上で同時に複数のスレッドを持つことができます。
  • 読み書きロックの間に、チェンジ・テーブル構造の操作の安全性を確保するために、相互に排他的な間のロックを記述します。そのため、2つのスレッドがある場合は、同時に実行の実行を開始するために別のものを待つために、テーブルにフィールドを追加します。

図3は、ライブラリ全体がハングアップ引き起こし、小さなテーブルのフィールドを追加します。

MDLロックですが、システムのデフォルトが増加しますが、それはあなたが無視できない仕組みです。たとえば、次の例では、私はよく見る人は穴に落ちた:小さなテーブルにライブラリ全体がハングアップ引き起こし、フィールドを追加します

あなたは、確かに知ってテーブルにフィールドを追加したり、フィールドを変更、または索引、あなたが全表スキャンデータを必要とします。大きなテーブルを操作する場合、あなたは確かにオンラインサービスへの影響を避けるために、特に注意が必要だろう。実際、小さなでは
、テーブル、不注意な操作が間違って行くでしょう。私たちが見て次の一連の操作は、仮定するテーブルtは小さなテーブルです。

注:この実験環境では、MySQL 5.6です。

私たちは、MDLがロックを読んTこの時間は、テーブルを追加します、最初のスタートのセッションを見ることができます。セッションBも必要とされるようなMDLは、ロックを読んで、あなたは適切に実行することができます。

セッションCがブロックされます後MDLセッションA読まロックが解除されていない、とセッションCは、MDLの書き込みロックを必要とするので、それだけでブロックすることができます。

彼らはセッションCない行うには何をブロックされているが、唯一の場合はMDLを要求するために、すべての新しいアプリケーションは、テーブルセッションC tにロックを読んだ後にブロックされます。しかし、我々は、検索操作を変更するには、テーブルへのすべての追加や削除を申請する必要がある、と述べた
ロックを読んMDL、すべての読み取りと書き込みのパフォーマンスを完全に等しくなく、ロックされました。

頻繁にテーブルの上にクエリ、およびクライアントが再びタイムアウト要求新しいセッションの後に更新される再試行メカニズムを持っている場合は、スレッドライブラリがすぐにいっぱいになります。

あなたは今、MDLロックトランザクションを知っている必要があります、ステートメントは、アプリケーションの開始時に実行されますが、文の終了後、すぐに解放されることはありませんが、前にコミットするトランザクション全体のリリースまで待つことになりますさ。

上記の分析に基づいて、我々は問題を議論し、どのように安全に少しのテーブルにフィールドを追加するには?

4、どのように安全に少しのテーブルにフィールドを追加します

まず、私たちは長いトランザクションを解決するために持っているすべてのトランザクションが提出されていない、それはMDLロックを占領されていたであろう。MySQLのINFORMATION_SCHEMAライブラリでInnodb_trxテーブルには、トランザクションの現在の実行を確認することができます。あなたがしたい場合は
、単に長いトランザクションの実行をDDL変更テーブルを行う、DDLを検討、または長いトランザクションを殺すために一時停止します。

しかし、このシナリオを検討してください。あなたは、テーブルを変更したい場合は、データの量が、上記の要求が頻繁にあり、そしてあなたがフィールドを追加する必要があるが、どのようにあなたがそれを行うだろう、ホットテーブルのですか?

新しい要求がすぐにここになりますので、この時間殺傷は、有用ではないかもしれません。理想的メカニズム、我々は最高の内部このMDL指定された待機時間書き込みロックに得ることができる場合、それを得る、ALTER TABLE文で待ち時間を設定し
、ビジネスの背面とあきらめる前に、文を詰まらせません。開発者やDBA後この手順は、コマンドを再試行を繰り返しました。

MariaDBは、すでにこの機能AliSQLを組み込んだので、現在のオープンソースサポートDDLNOWAIT / WAIT nは、この構文の二つの分岐されます。

テーブルtbl_nameは、列を追加NOWAIT ALTER ... 
テーブルtbl_nameのWAITをALTER N列を追加...

IVの概要

今日、私はあなたとグローバルロックとMySQLのテーブルレベルのロックを導入しました。

グローバル・ロック・ロジックは、主にバックアッププロセスで使用されています。すべてのInnoDBエンジンライブラリのために、私はあなたが-single・トランザクションパラメータを使用することを選択した提案は、アプリケーションはより友好的になります。

行ロックをサポートしていないデータベースエンジンが使用される場合、テーブルロックが通常です。あなたのアプリケーションは、この声明の中でロックテーブルを持っていることが判明した場合、あなたはそれを追跡する必要があり、より多くの可能性が高い状況は次のとおりです。

  • お使いのシステムは、使用MyISAMテーブルにまだあるエンジンのこのタイプのトランザクションをサポートしていません、そのエンジンは、変更をアップグレードするための手配しますか。
  • どちらかあなたのエンジンをアップグレードしますが、コードはアップグレードされません。私は、このようなケースを見てきました、最後の事業展開は、テーブルをロックし、テーブルは問題が解決され、変更してコミットし始めロックを解除することです。

トランザクションがコミットされるまで、MDLは、テーブル構造の変更を行う、解放しません、あなたは照会および更新するために、大手行をロックしないように注意する必要があります。

最後に、私は今あなたに質問を残しました。DDL上の小さなテーブルが一次ライブラリーは、このような追加するテーブルの上として、作られた場合、通常は、スタンバイ・データベース上で実行されたバックアップは、あなたは、-single・トランザクション処理を使用して、論理バックアップ方法を行っている
リストを。この時点では、スタンバイ・データベースから、あなたはどのような現象を見るのだろうか?

あなたは、私は次の記事を終了し、あなたがこの問題を議論、コメント欄に書かれた自分の考えやアイデアを置くことができます。聴いてくれてありがとう、あなたは一緒に読むためにもっとたくさんの友達にこの共有を送るために歓迎されています。

注:この記事は、物理的なバックアップを説明していない、バックアップは物理的に別の記事になります。

第五に、の問題について

共同主キー索引および索引構成表のInnoDBの理解の問題について。表レコード:私は返事以下のようにわずかに変更された同志ヤン@掲示を(私はオレンジ色でマーク部分を修正)に指示します

-a-- | -b-- | -c-- | -d-- 
1 2 3 D 
1 3 2 D 
1 4 3 D 
2 1 3 D 
2 2 2 D 
2 3 4 D

、B、即ちプレスソートし、次にソートB、Cの障害によってクラスタ化インデックス組織等価配列順序Bプライマリ鍵A、。

主キーの一部b--(これはABではないことに注意してください、だけB) - | -a-- | -c--主キーを記録しながら、インデックスのCA組織は、並べ替え、その後、cで最初にソートされます

2 1 3 
2 2 2 
3 1 2 
3 1 4 
3 2 1 
4 2 3

指数cとこのデータはまったく同じです。

パートA--主キー(前出) - | -b-- | -c--メインキーを記録している間のCb指数cの報道機関は、仕分けbでソートされています

2 2 2 
2 3 1 
3 1 2 
3 1 2 
3 4 1 
4 3 2

そのため、CAを削除することができ結論は、CBが保持する必要があります。

おすすめ

転載: www.cnblogs.com/luoahong/p/11592035.html