積極的に書き込まれているALTER TABLEに失敗のMySQL

低音:

私のアプリケーションの使用例1で、私は2つの同時持っているMySQLの接続を:

  • 積極的という名前のテーブルに書き込む1 T(実際には、継続的にこの表の単一の行を更新する)、および
  • 非常に同じテーブルに対してDDLを実行する別の(ALTER TABLE8つの新しい列を追加してから1列を延長varchar(80)しますvarchar(2000))。DDLは、最終的には完全に期待されています。

UPDATEDMLはされていない DDLによって影響を受けます。

テーブルは、単一の行(ある一つを含むUPDATED「参照)。

分析

何このユースケースをカバーする統合テストを実行すると、私は観察することは、テスト時間外(表はとても積極的DDLが完了したことがないのでこと、に書き込まれている)であるが、唯一のためのMySQL 5.7。通常、テストは(確かにするために起こる私達のハードウェア上で30秒未満で完了することが期待されているMySQLの 5.6および8.0)、しかしためのMySQL 5.7でも200秒は十分ではありません。私は別のを試してきたALGORITHMし、LOCK(参照値13.1.8 ALTER TABLE構文を運で、)。

私は自分のアプリケーション(プロファイリングする場合のMySQL 5.7の場合)を、私は、CPU時間の99%が(すなわち待っているソケットからの読み込み費やされていることを確認MySQLのテーブルが変更されたことを応答する)が、データベース・インスタンスが黒の一種であります私に箱-もちろん私がしているperformance_schema有効になっており、それに対してクエリを実行することができますが、私は私が探しています正確な情報見当がつかない。

合成

それと同時に、私は、最小限の自己完結型のユニットテストに問題を軽減するために失敗しました-私は観察するだけの事はある3倍10倍の時間経過の試験の増加MySQLの他に比べて5.7 MySQLのバージョンが、DDLはしていません永遠にハングアップします:

ここでは、画像の説明を入力します。

すべてのMySQLのバージョンはのためのいずれかの株式のバージョンされているWindowsののDebian Linuxは、からダウンロードwww.mysql.comに最小限の変更でmy.cnf、または公式ドッカーの画像。

質問:

  1. 以下のためにそれは確かに技術的には可能であるMySQLはの実行遅らせるようにALTER TABLE永遠にDDLを?それとも私が観察してることは非常に忙しいのデータベース・インスタンスだけでしょうか?それはどちらかすることが可能です
    • 要求ALTER TABLE割り込み可能に実行される一定のタイムアウトを超過した場合、すなわちエラーがデータベースによって返される、または
    • 潜在的にでも置くことができ、他のすべての接続を強制的SHAREDDDLが実行されている間、彼らは介入しないようにすることを、テーブルのロックまたは一時停止するには、その行の一部を?
  2. オリジナルの統合テストタイミングアウトを扱う場合、どのように私はさらにから状況を診断することができますMySQLの側?
ビルKarwin:

TL; DR - あなたのALTER TABLEのブロックを解除するために、あなたのトランザクションをコミットします。


はい、ALTER TABLEは長い時間のためにブロックすることができます。それは永遠のように見えるかもしれません。これは、実際の値ですlock_wait_timeoutデフォルトでは31536000秒、または365日です。

MySQLでは、ALTER TABLEなどのDDL文は、排他的な必要とメタデータロックテーブルの上に。目的は、同時に2つの同時セッションからではないALTER TABLEを行うことを確認することです。

SELECT、INSERT、UPDATE、DELETE保留も "共有" のメタデータロックなどのDML文。共有ロックは、同時に複数のセッションに保持されているが、排他的ロックは、それらがテーブルのロックの任意の型を保持するだけであることを必要とするので、排他ロックをブロックすることができます。

ドキュメントの状態:

このロックアプローチは一つのセッション内のトランザクションで使用されているテーブルは、トランザクションが終了するまで他のセッションによってDDLステートメントに使用することができないことを含意を有しています。

彼らは別のセッションがテーブルのビューを妥協するDROP TABLEまたはALTER TABLEを行っていることを心配することなく、テーブルの彼らの反復可能読み取りビューを保存することができますので、メタデータのロックを保持しているDML文の目的です。MySQLはバージョン管理メタデータを持っていないので、このロックは(必要である彼らは徐々にその方に働いています)。

簡単なSELECTを実行し、コミットしませんトランザクションがロックを変更する必要DROP TABLEまたはALTER TABLEをブロックしますこれは手段。

オンラインDDLの導入により、いくつかのニュアンスがあります。

オンラインDDLパフォーマンスと同時実行は、 ALTER TABLEが共有メタデータのロックを取得することからスタートするので、コミットされていないトランザクションはそれをブロックしないことをより詳細に説明します。ALTER TABLE変化の性質は、それを必要とする場合でも、次の段階は、排他的なメタデータロックに共有メタデータのロックをアップグレードすることができます。他のトランザクションがまだ独自のメタデータのロックを保持しているため、この時点では、ロックの取得がブロックされています。

オンラインDDLは、ALTER TABLE操作のすべての種類には適用されません。いくつかは、まだ排他ロックが必要です。あなたがやっているように、例えば、データタイプを変更すると、排他ロックが必要です。参照してくださいオンラインDDLの概要を詳細については。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=175446&siteId=1