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

PolarDB:非同期メタデータロックレプリケーション

最終更新日:Mar 29, 2026

プライマリノードで DDL 操作が実行されると、メタデータロック (MDL) が保持されます。読み取り専用ノードは、redo ログの解析を再開する前に、そのロック情報が同期されるのを待つ必要があります。これにより、DDL 操作が停止します。非同期 MDL レプリケーションは、MDL 同期を redo ログの解析から分離します。これにより、読み取り専用ノードはロック情報を待機している間も redo ログの適用を継続でき、DDL がクラスターのパフォーマンスに与える影響を軽減します。

サポート対象バージョン

バージョン最小リビジョン
PolarDB for MySQL 5.6すべてのリビジョンバージョン
PolarDB for MySQL 5.7すべてのリビジョンバージョン
PolarDB for MySQL 8.08.0.1.1.10 以降

クラスターのバージョンを確認するには、「エンジンバージョンの照会」をご参照ください。

仕組み

非同期 MDL レプリケーションがない場合、読み取り専用ノードでは MDL 同期と redo ログの解析が結合されています。

プライマリノード読み取り専用ノード
DDL を実行 — MDL を取得MDL を同期するための信号を受信
DDL が MDL を保持MDL 同期の完了を待機
待機中に redo ログの解析を停止
DDL が完了 — MDL を解放MDL 同期が完了 — redo ログの解析を再開

非同期 MDL レプリケーションを使用すると、読み取り専用ノードはこれら 2 つの操作を分離します。専用のワーカースレッドが並行して MDL 同期を処理する間、バックグラウンドで redo ログの解析と適用を継続します。

MDL 同期のモニタリング

この機能は、サポートされているクラスターではデフォルトで有効になっています。構成は不要です。

2 つの INFORMATION_SCHEMA ビューを使用すると、読み取り専用ノードの MDL 同期状態を検査できます。

どちらのクエリにも、以下の最小リビジョンバージョンが必要です。ご利用のクラスターがこれらの要件を満たしていない場合は、「クラスターバージョンのアップグレード」をご参照ください。
MySQL 8.0.1:リビジョン 8.0.1.1.24 以降
MySQL 5.7:リビジョン 5.7.1.0.20 以降
MySQL 5.6:リビジョン 5.6.1.0.33 以降。特定のノードでクエリを実行するには、「概要」の「ヒント」セクションをご参照ください。

MDL スロット状態のクエリ

読み取り専用ノードで次のステートメントを実行して、すべてのアクティブな MDL 同期スロットを表示します。

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOG_MDL_SLOT;

出力例:

+---------+------------+-------------------+----------+-------------------+
| slot_id | slot_state | slot_name         | slot_lsn | thread_id         |
+---------+------------+-------------------+----------+-------------------+
|       0 | SLOT_NONE  | no targeted table |        0 | no running thread |
|       1 | SLOT_NONE  | no targeted table |        0 | no running thread |
|       2 | SLOT_NONE  | no targeted table |        0 | no running thread |
|       3 | SLOT_NONE  | no targeted table |        0 | no running thread |
|       4 | SLOT_NONE  | no targeted table |        0 | no running thread |
+---------+------------+-------------------+----------+-------------------+

各行は 1 つの MDL 同期スロットを表します。slot_name 列はターゲットテーブルを識別し、slot_state は現在の同期フェーズを示します。

slot_state意味
SLOT_NONE初期化状態。アクティブな MDL リクエストはありません。
SLOT_RESERVED読み取り専用ノードが MDL リクエストを受信し、スケジューラからのワーカースレッドを待機しています。
SLOT_ACQUIRINGワーカースレッドが割り当てられ、読み取り専用ノードが MDL リクエストを送信しています。MDL が別の接続によって保持されている場合、ロックが解放されるまでスロットはこの状態のままになります。
SLOT_LOCKEDMDL が取得され、読み取り専用ノードによって保持されています。
SLOT_RELEASING読み取り専用ノードが MDL 解放リクエストを受信し、スケジューラからのワーカースレッドを待機しています。

ロック待ちの診断:スロットが SLOT_ACQUIRING 状態でスタックしている場合、読み取り専用ノードが別の接続によって保持されている MDL を待機している可能性が高いことを示します。以下のワーカースレッドのクエリを使用して確認し、プライマリノード上のいずれかの接続が slot_name に表示されているテーブルのロックを保持しているかどうかを確認します。

ワーカースレッド状態のクエリ

読み取り専用ノードで次のステートメントを実行して、MDL 同期リクエストを処理しているワーカースレッドを表示します。

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOG_MDL_THREAD;

出力例:

+-----------+-----------+------------------+-------------------+----------+
| thread_id | thr_state | slot_state       | slot_name         | slot_lsn |
+-----------+-----------+------------------+-------------------+----------+
|         0 | free      | not in acquiring | no targeted table |        0 |
|         1 | free      | not in acquiring | no targeted table |        0 |
|         2 | free      | not in acquiring | no targeted table |        0 |
|         3 | free      | not in acquiring | no targeted table |        0 |
+-----------+-----------+------------------+-------------------+----------+

INNODB_LOG_MDL_SLOTSLOT_ACQUIRING 状態のスロットを示し、INNODB_LOG_MDL_THREAD 内の対応するワーカースレッドの thr_statefree でない場合、読み取り専用ノードが高い確率で MDL を待機しています。プライマリノード上のいずれかの接続が slot_name に表示されているテーブルのロックを保持しているかどうかを確認してください。

お問い合わせ

DDL 操作についてご質問がある場合は、お問い合わせください。

お問い合わせ

DDL 操作についてご質問がある場合は、テクニカルサポートにお問い合わせください。