sql >> データベース >  >> RDS >> Mysql

小さなテーブルで時間がかかるMySQLALTERTABLE

    ALTER TABLEはメタデータロックを待機しており、実際には何も変更を開始していないと思います。

    メタデータロックとは何ですか?

    テーブルに対してSELECT/INSERT / UPDATE / DELETEなどのクエリを実行する場合は、メタデータロックを取得する必要があります。これらのクエリは互いにブロックしません。そのタイプのクエリはいくつでもメタデータロックを持つことができます。

    ただし、CREATE / ALTER / DROP / TRUNCATE /RENAMEやイベントCREATETRIGGERまたはLOCKTABLESなどのDDLステートメントは、排他的を取得する必要があります。 メタデータロック。いずれかのトランザクションがまだメタデータロックを保持している場合、DDLステートメントは待機します。

    これを示すことができます。 2つのターミナルウィンドウを開き、各ウィンドウでmysqlクライアントを開きます。

    • ウィンドウ1:CREATE TABLE foo ( id int primary key );
    • ウィンドウ1:START TRANSACTION;
    • ウィンドウ1:SELECT * FROM foo; -テーブルにデータがないことは問題ではありません

    • ウィンドウ2:DROP TABLE foo; -待機していることに注意してください

    • ウィンドウ1:SHOW PROCESSLIST;

      +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
      | Id  | User | Host      | db   | Command | Time | State                           | Info             | Rows_sent | Rows_examined |
      +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
      | 679 | root | localhost | test | Query   |    0 | starting                        | show processlist |         0 |             0 |
      | 680 | root | localhost | test | Query   |    4 | Waiting for table metadata lock | drop table foo   |         0 |             0 |
      +-----+------+-----------+------+---------+------+---------------------------------+------------------+-----------+---------------+
      

    テーブルメタデータロックを待機しているドロップテーブルを確認できます。ただ待っています。どれくらい待ちますか?ウィンドウ1のトランザクションが完了するまで。最終的には、lock_wait_timeoutの後にタイムアウトになります 秒(デフォルトでは、これは1年に設定されています 。

    • ウィンドウ1:COMMIT;

    • ウィンドウ2:待機が停止し、すぐにテーブルが削除されることに注意してください。

    それで、あなたは何ができますか? ALTERTABLEをブロックする長時間実行トランザクションがないことを確認してください。以前にテーブルに対してクイックSELECTを実行したトランザクションでさえ、トランザクションがコミットするまでメタデータロックを保持します。




    1. Oracle PL / SQLのユニットテストフレームワーク?

    2. NOTIN句を使用して1000を超える値を追加する方法

    3. PHPを使用して文字列内の単一引用符(アポストロフィ)をエスケープする方法

    4. Mysqlのクロスデータベーストリガー