すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:DDL ロック待機タイムアウトの制御

最終更新日:May 13, 2026

ApsaraDB RDS for MySQL は、DDL ロック待機タイムアウトの制御機能をサポートしています。この機能により、ヒントを使用して DDL スレッドが MDL ロックを待機する時間を制御でき、長時間のロック待機によるセッションブロッキングや接続の滞留を防ぐことができます。

概要

機能紹介: MySQL では、 lock_wait_timeout パラメータが MDL ロックのタイムアウトを制御します。特定の DDL 操作の待機時間を正確に制御するには、実行前にこのパラメータを変更する必要があります。ApsaraDB RDS for MySQL では、個々の DDL ステートメントの MDL ロック待機時間をより簡単に制御する方法を提供しています。 /*+ WAIT(n) */ および /*+ NO_WAIT() */ ヒントを使用して、ステートメント内で直接タイムアウトを指定できます。

メリット: ヒントの使用は、新しい構文を導入するよりも優れた互換性を提供します。ヒントはコメントとしてバイナリログに書き込まれます。この機能をサポートしていない下流インスタンスやサブスクリプションサービスは、ヒントを自動的に無視し、通常のコメントとして扱います。これにより、SQL 解析エラーやレプリケーションの中断を防ぐことができます。

適用条件

この機能は、次のバージョン要件を満たすインスタンスでのみ利用できます。インスタンスがこれらの要件を満たしていない場合は、マイナーエンジンバージョンの更新またはメジャーデータベースバージョンのアップグレードを実施できます。

  • MySQL 8.4

  • マイナーエンジンバージョンが 20250531 以降の MySQL 8.0

この機能を使用する際には、次の制限事項があります。

  • CREATEDROPALTERRENAMETRUNCATE、および OPTIMIZE 操作のみがサポートされています。

  • プライマリノードからのレプリケーション中、セカンダリノードまたは読み取り専用インスタンスでは、ヒントは有効になりません。

  • /*+ WAIT(n) */ ヒントでは、 n は待機時間を秒単位で指定し、範囲 [0, 31536000] 内である必要があります。

構文

CREATEDROPALTERRENAMETRUNCATE、および OPTIMIZE 操作では、キーワードの直後に /*+ WAIT(n) */ または /*+ NO_WAIT() */ ヒントを追加して、MDL ロック待機時間を制御します。例:

-- テーブル t1 を作成し、MDL タイムアウトを 10 秒に設定します。
CREATE /*+ WAIT(10) */ TABLE t1(a INT);

-- テーブル t1 にカラムを追加し、MDL ロックを待機しません。
ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;

-- テーブル t1 を削除し、MDL タイムアウトを 1 秒に設定します。
DROP /*+ WAIT(1) */ TABLE t1;

テスト手順

  1. セッションを開き、テーブル t1 を作成し、テーブルに対して MDL S ロックを取得します。

    CREATE TABLE t1(a INT);
    LOCK TABLE t1 READ;
  2. 2 番目のセッションで、 /*+ WAIT(n) */ および /*+ NO_WAIT() */ ヒントを使用してテーブルの変更と削除を試み、結果を確認します。

    ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;
    DROP /*+ WAIT(1) */ TABLE t1;

テスト結果

/*+ WAIT(n) */ および /*+ NO_WAIT() */ ヒントを使用すると、指定されたタイムアウト内にロックが取得されない場合、DDL 操作は速やかに、かつ予測どおりに失敗します。

mysql> ALTER /*+ NO_WAIT() */ TABLE t1 ADD COLUMN b INT;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> DROP /*+ WAIT(1) */ TABLE t1;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction