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

PolarDB:読み取り専用ノードで実行時間の長いトランザクションがDDL操作をブロックしないようにする

最終更新日:May 31, 2024

PolarDBは、polar_slave_work_on_nonblock_mdl_modeパラメーターを提供します。 このパラメーターをONに設定すると、PolarDB読み取り専用ノードで実行時間の長いトランザクションがプライマリノードでのデータ定義言語 (DDL) 操作をブロックしないようにできます。 このトピックでは、このパラメーターをPolarDBに設定する方法について説明します。

制限事項

PolarDBクラスターは、次のいずれかの要件を満たす必要があります。

  • リビジョンバージョンが8.0.1.1.23以降のPolarDB for MySQL 8.0クラスター。

  • リビジョンバージョンが5.7.1.0.19以降のPolarDB for MySQL 5.7クラスター。

  • リビジョンバージョンが5.6.1.0.32以降のPolarDB for MySQL 5.6クラスター。

説明

クラスターのカーネルバージョンを表示する方法については、「エンジンバージョンの照会」をご参照ください。

polar_slave_work_on_nonblock_mdl_modeパラメーターは、PolarDB読み取り専用ノードのトランザクション分離レベルがread CommittedまたはRead Uncommittedの場合にのみ有効です。

polar_slave_work_on_nonblock_mdl_modeパラメーターは、PolarDB読み取り専用ノードにのみ適用されます。

背景情報

PolarDB読み取り専用ノードで実行時間の長いトランザクションは、アクセスされたデータテーブルのメタデータロック (MDL) を保持します。 この場合、PolarDBプライマリノードでのDDL操作ではMDLを同期できません。 その結果、タイムアウトエラーが発生し、「ERROR 8007 (HY000): DDL同期中にレプリカでMDLを取得できません」というエラーメッセージが返されます。

説明

replica_lock_wait_timeoutパラメーターは、MDL同期のタイムアウト期間を指定します。 デフォルトのタイムアウト時間は50秒です。

MDL同期がタイムアウトした場合、PolarDBプライマリノードでshow processlistステートメントを実行します。 Stateパラメーターに返された値がレプリカとの同期待ちの場合、PolarDB読み取り専用ノードでselect * from information_schema.innodb_log_mdl_slot where slot_state = "SLOT_ACQUIRING" ステートメントを実行して、待機状態のMDLをクエリできます。 システムが次の表に似た表を返す場合、PolarDB読み取り専用ノード上の実行時間の長いトランザクションがMDLを保持することを示します。

-------- ---------------- --------------------------------------------
| slot_id | slot_state | slot_name | slot_lsn | thread_id |
--------- ---------------- --------------------------------------------
| 0 | SLOT_ACQUIRING | test/t | 35025648 | スレッド0 |
--------- ---------------- -------------------------------------------- 

注意事項

polar_slave_work_on_nonblock_mdl_modeパラメーターは、実行時間の長いトランザクションによって発生するDDLブロッキングの問題のみを解決するために使用できます。 polar_slave_work_on_nonblock_mdl_modeパラメーターをONに設定すると、並列クエリでMDL同期のタイムアウト時間よりも時間がかかるため、MDL同期に失敗する可能性があります。

テーブルのロックまたはフラッシュに使用されるMDLは、テーブルを明示的にロック解除して取得する必要があります。 したがって、テーブルのロックまたはフラッシュによるMDLブロッキングの問題は、polar_slave_work_on_nonblock_mdl_modeパラメーターをONに設定しても解決できません。

手順

  1. にログインします。PolarDBコンソール.

  2. 左上隅で、クラスターがデプロイされているリージョンを選択します。

  3. クラスターを見つけて、そのIDをクリックします。

  4. 左側のナビゲーションウィンドウで、設定と管理 > パラメーター.

  5. を検索するFind theloose_polar_slave_work_on_nonblock_mdl_modeパラメーターをクリックし、パラメーターの変更.

    参数配置

  6. パラメーターを変更した後、[変更の送信] をクリックします。 [変更を保存] ダイアログボックスで、[OK] をクリックします。

    保存改动

polar_slave_work_on_nonblock_mdl_modeパラメーターをONに設定すると、読み取り専用ノードのトランザクションが異なるテーブル構造を返す場合があります。

  1. 読み取り専用ノードでtest.tテーブルを照会します。

    mysql> begin;
    mysql> select * from test.t;
    + ------
    | a |
    + ------
    | 1 |
    + ------
    1行セット (0.00秒) 
  2. プライマリノードのtest.tに対してDDL操作を実行します。

    mysql> alter table test.t add column b int;
    クエリOK、影響を受ける0行 (0.32秒)
    レコード: 0重複: 0警告: 0 
  3. 読み取り専用ノードでtest.tテーブルを再度照会します。

    mysql> select * from test.t;
    + ----- + ------
    | a | b |
    + ----- + ------
    | 1 | NULL |
    + ----- + ------
    1行セット (0.00秒) 

上記の例では、polar_slave_work_on_nonblock_mdl_modeパラメーターをONに設定した後、プライマリノードでDDL操作が実行される前後にトランザクションがコミットされると、読み取り専用ノードのトランザクションは異なる数の列を返します。 polar_slave_work_on_nonblock_mdl_modeパラメーターをOFFに設定すると、読み取り専用ノードのトランザクションがコミットされるかタイムアウトが発生するまで、プライマリノードでのDDL操作は許可されません。 この場合、「ERROR 8007 (HY000): DDL同期中にレプリカでMDLを取得できません」というエラーメッセージが返されます。