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

PolarDB:先制DDL

最終更新日:Sep 14, 2024

PolarDB for MySQLは、プリエンプティブDDL機能をサポートしています。 プリエンプティブDDLは、読み取り専用ノードでの大規模なクエリまたは長時間実行されるトランザクションによって引き起こされるDDL操作の失敗を解決するのに役立ちます。

症状

PolarDB for MySQLクラスターでDDL操作を実行すると、メタデータロック (MDL) 同期エラーが発生します。 エラーメッセージ:

ERROR HY000: Fail to get MDL on replica during DDL synchronize
ERROR HY000: Fail to get table lock on replica; you can 'set polar_support_mdl_sync_preemption = ON' and try restarting transaction

前提条件

PolarDB for MySQLクラスターは、次のいずれかのデータベースエンジンバージョンを実行します。

  • リビジョンバージョンが5.6.1.0.43以降のPolarDB for MySQL 5.6。

  • リビジョンバージョンが5.7.1.0.34以降のPolarDB for MySQL 5.7。

  • リビジョンバージョンが8.0.1.1.39以降のPolarDB for MySQL 8.0.1。

  • 改訂バージョンが8.0.2.2.14以降のPolarDB for MySQL 8.0.2クラスター

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

制限事項

プリエンプティブDDL機能は、読み取り専用ノードでのみサポートされます。

使用上の注意

  • プリエンプティブDDL機能を有効にすると、読み取り専用ノードの現在のテーブルへの接続が中断されたり、現在のテーブルで実行されていないSQL文がロールバックされたりする可能性があります。 慎重に進んでください。

  • プリエンプティブDDL機能は、loose_replica_lock_wait_timeoutパラメーターの値が、loose_polar_mdl_sync_preempt_after_wait_secondパラメーターの値の合計に5を加えた値より大きい場合にのみ有効になります。

  • MySQL for PolarDB 8.0.1またはMySQL for PolarDB 8.0.2でテーブルの名前を変更したときにプリエンプティブDDLが有効になるようにするには、renameステートメントの代わりにALTER table RENAMEステートメントを使用します。

背景情報

PolarDB for MySQLは共有ストレージアーキテクチャを使用します。 DDL操作を実行すると、システムはプライマリノードでMDL-Xロックを取得し、読み取り専用ノードにMDL-Xロックの取得を通知します。 読み取り専用ノードのテーブルにアクセスしている場合、MDL-Xロック同期スレッドはブロックされます。 読み取り専用ノードが指定されたタイムアウト期間内にMDL-Xロックを取得できない場合、クライアントは次のエラーコードとエラーメッセージを返します。error 8007 (HY000): DDL synchronize中にレプリカでMDLを取得できません。 この問題は、複数の読み取り専用ノードを含むPolarDB for MySQLクラスターで頻繁に発生します。 プリエンプティブDDL機能を使用して問題を解決できます。

使用法

loose_polar_support_mdl_sync_プリエンプションパラメーターをONに設定してプリエンプティブDDL機能を有効にし、loose_polar_mdl_sync_preempt_after_wait_secondパラメーターを設定してMDL同期を完了する必要があるタイムアウト期間を指定します。 詳細については、「クラスターとノードパラメーターの設定をご参照ください。 次の表にパラメーターを示します。

パラメーター

レベル

説明

loose_polar_support_mdl_sync_プリエンプション

セッション

プリエンプティブDDL機能を有効にするかどうかを指定します。 有効な値:

  • オン

  • OFF (デフォルト)

loose_polar_mdl_sync_preempt_after_wait_秒

グローバル

MDL同期を完了する必要があるタイムアウト期間。 指定されたタイムアウト期間が終了したときにMDLロックが同期されない場合、プリエンプションスレッドが開始されます。

有効な値: 1 ~ 31536000 単位は秒です。 デフォルト値: 10。

プリエンプティブDDL disabled

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

    mysql> use test;
    Database changed
    # Execute a large query for 100 seconds.
    mysql> select sleep(100) from t1;
  2. プライマリノードに列を追加します。

    mysql > alter table t1 add column c int;
    ERROR 8007 (HY000): Fail to get MDL on replica during DDL synchronize

    中にレプリカでMDLを取得できません

    上記の例では、プリエンプティブDDL機能を無効にすると、MDLの同期が失敗し、読み取り専用ノードでのトランザクションの実行時間が長いため、読み取り専用ノードで実行されるDDL操作がブロックされることを示しています。 これは、DDL動作の失敗をもたらします。

    image..png

プリエンプティブDDL enabled

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

    mysql> use test;
    Database changed
    # Execute a large query for 100 seconds.
    mysql> select sleep(100) from t1;
  2. プライマリノードに列を追加します。

    mysql> alter table t1 add column c int;
    Query OK, 0 rows affected (11.13 sec)
    Records: 0  Duplicates: 0  Warnings: 0

    上記の例は、プリエンプティブDDL機能が有効になっている場合、読み取り専用ノードでのトランザクションの実行時間が長いため、MDLロックの同期がブロックされることを示しています。 特定の期間の後、プリエンプションスレッドが開始され、DDL操作が成功します。

    image..png

お問い合わせ

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