PolarDB は、DDL 文の実行ステータスとメタデータロック (MDL) ステータスを監視するための Polar パフォーマンススキーマ機能を提供します。 MySQL のパフォーマンススキーマ機能と比較して、Polar パフォーマンススキーマ機能はより軽量で、使用するメモリリソースが少なく、パフォーマンスのオーバーヘッドが低くなっています。 このトピックでは、この機能を使用して DDL 文の実行ステータスと MDL ステータスを表示する方法について説明します。
サポートされているバージョン
PolarDB for MySQL クラスタは、次のデータベースエンジンバージョンのいずれかを実行している必要があります。
PolarDB for MySQL 5.7 のクラスタ (リビジョンバージョン 5.7.1.0.35 以降)。
PolarDB for MySQL 8.0.1 のクラスタ (リビジョンバージョン 8.0.1.1.21 以降)。
PolarDB for MySQL 8.0.2 のクラスタ (リビジョンバージョン 8.0.2.2.8 以降)。
クラスタのデータベースエンジンバージョンを表示する方法については、「エンジンバージョンのクエリ」をご参照ください。
問題
DDL 文はクラスタのプライマリノードで実行されます。 したがって、プライマリノードで DDL 文の実行ステータスをクエリする必要があります。
プライマリエンドポイントを使用してクラスタに接続する場合、プライマリノードで DDL 文の実行ステータスを直接クエリできます。 プライマリエンドポイントをクエリする方法については、「エンドポイントとポート番号の表示」をご参照ください。
クラスタエンドポイントを使用してクラスタに接続する場合は、SQL 文でヒントを使用して、プライマリノードで DDL 文の実行ステータスをクエリできます。 詳細については、「読み取り/書き込み分割」をご参照ください。
パフォーマンススキーマ機能を有効にすると、Polar パフォーマンススキーマ機能は自動的に無効になります。
手順
このトピックで紹介されているメソッドは、InnoDB ストレージエンジンを使用するテーブルにのみ適用されます。
Polar パフォーマンススキーマ機能を有効にします。
Polar パフォーマンススキーマ機能を有効にするには、PolarDB コンソールで loose_polar_performance_schema パラメータを
ONに設定します。 このパラメータは、クラスタを再起動した後にのみ有効になります。 詳細については、「クラスタとノードパラメータの設定」をご参照ください。次の表に、Polar パフォーマンススキーマ機能のパラメータを示します。
パラメータ
説明
loose_polar_performance_schema
Polar パフォーマンススキーマ機能を有効にするかどうかを指定します。 有効な値:
ON
OFF
loose_polar_performance_schema_enable_row_locks
Polar パフォーマンススキーマが行レベルのロック監視データを収集および公開するかどうかを指定します。
OFF (デフォルト)
ON
説明このパラメータは、PolarDB for MySQL 8.0.1 および 8.0.2 でのみ使用できます。
performance_schema_max_thread_instances
Polar パフォーマンススキーマ機能によって追跡されるスレッドの最大数。 有効な値:-1 ~ 65536。 -1 の値は、MDL の数がビジネスの変化に適応するように自動的に調整されることを指定します。
説明このパラメータは微調整されています。 変更しないことをお勧めします。
performance_schema_max_metadata_locks
Polar パフォーマンススキーマ機能によって監視される MDL の最大数。 有効な値:-1 ~ 1048576。 -1 の値は、MDL の数がビジネスの変化に適応するように自動的に調整されることを指定します。
説明このパラメータは微調整されています。 変更しないことをお勧めします。
クラスタが起動した後、次の文を実行して、Polar パフォーマンススキーマ機能が有効になっているかどうかを確認できます。
SHOW VARIABLES LIKE 'polar_performance_schema';同様の結果が返されます。
+--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | polar_performance_schema | ON | +--------------------------+-------+ 1 row in set (0.00 sec)DDL 文の実行ステータスと MDL ステータスを表示します。
performance_schema.events_stages_currentテーブルから現在のイベントの実行ステータスを表示します。 サンプル文:SELECT THREAD_ID,EVENT_ID, EVENT_NAME, WORK_COMPLETED, WORK_ESTIMATED,(WORK_COMPLETED/WORK_ESTIMATED)*100 as PROGRESS FROM performance_schema.events_stages_current;サンプル結果:
+-----------+----------+------------------------------------------------------+----------------+----------------+----------+ | THREAD_ID | EVENT_ID | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED | PROGRESS | +-----------+----------+------------------------------------------------------+----------------+----------------+----------+ | 3057989 | 13 | stage/innodb/alter table (read PK and internal sort) | 56634 | 330135 | 17.1548 | +-----------+----------+------------------------------------------------------+----------------+----------------+----------+ 1 row in set (0.00 sec)performance_schema.threadsテーブルとinformation_schema.PROCESSLISTテーブルから現在のイベントの SQL 文を表示します。 サンプル文:SELECT esc.THREAD_ID, esc.EVENT_NAME, esc.WORK_COMPLETED, esc.WORK_ESTIMATED, pl.INFO FROM performance_schema.events_stages_current esc LEFT JOIN performance_schema.threads th ON esc.thread_id = th.thread_id LEFT JOIN information_schema.PROCESSLIST pl ON th.PROCESSLIST_ID = pl.ID;サンプル結果:
+-----------+------------------------------------------------------+----------------+----------------+-----------------------------------------------------------------------------------------+ | THREAD_ID | EVENT_NAME | WORK_COMPLETED | WORK_ESTIMATED | INFO | +-----------+------------------------------------------------------+----------------+----------------+-----------------------------------------------------------------------------------------+ | 3057989 | stage/innodb/alter table (read PK and internal sort) | 77034 | 330519 | ALTER TABLE test.test ALGORITHM=INPLACE, ADD testA VARCHAR(20) NOT NULL DEFAULT 'testA' | +-----------+------------------------------------------------------+----------------+----------------+-----------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)performance_schema.metadata_locksテーブルから、クラスタ内の MDL に関する情報を表示します。 サンプル文:SELECT * FROM performance_schema.metadata_locks;サンプル結果:
+-------------+--------------------+------------------+-------------+-----------------------+---------------------+---------------+-------------+------------------------+-----------------+----------------+ | OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | COLUMN_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_DURATION | LOCK_STATUS | SOURCE | OWNER_THREAD_ID | OWNER_EVENT_ID | +-------------+--------------------+------------------+-------------+-----------------------+---------------------+---------------+-------------+------------------------+-----------------+----------------+ | GLOBAL | NULL | NULL | NULL | 139949462878336 | INTENTION_EXCLUSIVE | STATEMENT | GRANTED | sql_base.cc:3103 | 3055785 | 1 | | TABLE | test | test | NULL | 139931318980224 | SHARED_WRITE | TRANSACTION | GRANTED | sql_parse.cc:6479 | 3055785 | 1 | | COMMIT | NULL | NULL | NULL | 139931318980480 | INTENTION_EXCLUSIVE | EXPLICIT | GRANTED | handler.cc:1669 | 3055785 | 1 | | TABLE | performance_schema | metadata_locks | NULL | 139934227366144 | SHARED_READ | TRANSACTION | GRANTED | sql_parse.cc:6479 | 3057612 | 1 | | GLOBAL | NULL | NULL | NULL | 139934216849664 | INTENTION_EXCLUSIVE | STATEMENT | GRANTED | sql_base.cc:5519 | 3057989 | 13 | | SCHEMA | test | NULL | NULL | 139934216849408 | INTENTION_EXCLUSIVE | TRANSACTION | GRANTED | sql_base.cc:5506 | 3057989 | 13 | | TABLE | test | test | NULL | 139934216848640 | SHARED_UPGRADABLE | TRANSACTION | GRANTED | sql_parse.cc:6479 | 3057989 | 13 | | BACKUP LOCK | NULL | NULL | NULL | 139934216849280 | INTENTION_EXCLUSIVE | TRANSACTION | GRANTED | sql_base.cc:5526 | 3057989 | 13 | | TABLESPACE | NULL | test/test | NULL | 139934216848384 | INTENTION_EXCLUSIVE | TRANSACTION | GRANTED | lock.cc:815 | 3057989 | 13 | | TABLE | test | #sql-17d9_2ea89a | NULL | 139934216848896 | EXCLUSIVE | STATEMENT | GRANTED | sql_table.cc:15054 | 3057989 | 13 | | GLOBAL | NULL | NULL | NULL | 139934216850176 | INTENTION_EXCLUSIVE | TRANSACTION | GRANTED | dictionary_impl.cc:416 | 3057989 | 13 | | TABLESPACE | NULL | test/test | NULL | 139934216849920 | EXCLUSIVE | TRANSACTION | GRANTED | dictionary_impl.cc:397 | 3057989 | 13 | +-------------+--------------------+------------------+-------------+-----------------------+---------------------+---------------+-------------+------------------------+-----------------+----------------+ 12 rows in set (0.00 sec)performance_schema.threadsテーブルから、OWNER_THREAD_IDの値に基づいて、MDL を保持しているスレッドに関する情報を表示します。SELECT * FROM performance_schema.threads WHERE THREAD_ID = "OWNER_THREAD_ID in performance_schema.metadata_locks table ";
ベストプラクティス
テーブルメタデータロックの待機中
ほとんどの場合、DDL 操作は MDL の取得に失敗したためにブロックされます。 この場合、DDL 操作は
テーブルメタデータロックの待機中状態になります。metadata_lockテーブルをクエリして、DDL 操作のブロックの理由をすばやく特定できます。サンプルコマンド:
SHOW PROCESSLIST文を実行して、ALTER TABLE t1 ADD COLUMN d VARCHAR(10), ALGORITHM = INPLACE文の実行ステータスをクエリします。 サンプル結果:/*force_node='pi-bp10k7631d6k3****'*/ SHOW PROCESSLIST; +-----------+-----------------+-----------------------+--------------------+----------------+---------+---------------------------------+-------------------------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----------+-----------------+-----------------------+--------------------+----------------+---------+---------------------------------+-------------------------------------------------------------+ | 98 | event_scheduler | localhost | NULL | Daemon | 1306586 | Waiting on empty queue | NULL | | 109 | replicator | 11.111.XX.XX:62549 | NULL | Polar Log Dump | 1 | Reading log from innodb | NULL | | 113 | replicator | 11.111.XX.XX:62560 | NULL | Polar Log Ack | 1 | Receiving from client | NULL | | 133 | replicator | 10.13.64.70:42712 | NULL | Polar Log Dump | 1 | Reading log from innodb | NULL | | 138 | replicator | 10.13.64.70:42723 | NULL | Polar Log Ack | 0 | Receiving from client | NULL | | 369 | aurora | 10.111.211.209:33334 | NULL | Sleep | 0 | | NULL | | 370 | aurora | 10.111.211.209:33336 | NULL | RDS Push LSN | 1306413 | starting | NULL | | 372 | aurora | 10.111.204.224:37010 | NULL | Sleep | 0 | | NULL | | 373 | aurora | 10.111.204.224:37019 | NULL | RDS Push LSN | 1306413 | starting | NULL | | 3064011 | root | 127.0.0.1:59703 | NULL | Sleep | 716 | | NULL | | 3064013 | root | 127.0.0.1:59710 | NULL | Sleep | 25 | | NULL | | 3064015 | root | 127.0.0.1:59713 | NULL | Sleep | 55 | | NULL | | 3064018 | root | 127.0.0.1:59716 | NULL | Sleep | 1 | | NULL | | 3067041 | zyg_root | 172.17.XX.XX:48594 | test | Query | 22 | Waiting for table metadata lock | alter table t1 add column d varchar(10),algorithm = inplace | | 3067443 | zyg_root | 172.17.XX.XX:48602 | test | Sleep | 27 | | NULL | | 3069716 | aurora | 100.104.XX.XX:33017 | information_schema | Sleep | 30 | | NULL | | 3069859 | aurora | 100.104.XX.XX:41872 | information_schema | Sleep | 30 | | NULL | | 3069925 | aurora | 10.111.204.224:20916 | NULL | Sleep | 2 | | NULL | | 3069932 | aurora | 10.111.211.209:51263 | NULL | Sleep | 2 | | NULL | | 270526156 | zyg_root | 172.17.28.253:46272 | test | Query | 0 | starting | /*force_node='pi-bp10k7631d6k3****'*/ show processlist | +-----------+-----------------+-----------------------+--------------------+----------------+---------+---------------------------------+-------------------------------------------------------------+ 20 rows in set (0.00 sec)結果は、DDL 操作が
テーブルメタデータロックの待機中状態であることを示しています。performance_schema.metadata_locksテーブルをクエリして、DDL 操作の MDL ステータスを表示します。 サンプル結果:/*force_node='pi-bp10k7631d6k3****'*/ SELECT * FROM performance_schema.metadata_locks; +-------------+--------------------+------------------+-------------+-----------------------+---------------------+---------------+-------------+--------------------+-----------------+----------------+ | OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | COLUMN_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_DURATION | LOCK_STATUS | SOURCE | OWNER_THREAD_ID | OWNER_EVENT_ID | +-------------+--------------------+------------------+-------------+-----------------------+---------------------+---------------+-------------+--------------------+-----------------+----------------+ | TABLE | performance_schema | metadata_locks | NULL | 139742994307712 | SHARED_READ | TRANSACTION | GRANTED | sql_parse.cc:7688 | 3810041 | 1 | | TABLE | test | t1 | NULL | 139742992122240 | SHARED_READ | TRANSACTION | GRANTED | sql_parse.cc:7688 | 3810574 | 1 | | GLOBAL | NULL | NULL | NULL | 139742992172544 | INTENTION_EXCLUSIVE | STATEMENT | GRANTED | sql_base.cc:5637 | 3810086 | 3 | | SCHEMA | test | NULL | NULL | 139742993150592 | INTENTION_EXCLUSIVE | TRANSACTION | GRANTED | sql_base.cc:5624 | 3810086 | 3 | | TABLE | test | t1 | NULL | 139742993150848 | SHARED_UPGRADABLE | TRANSACTION | GRANTED | sql_parse.cc:7688 | 3810086 | 3 | | BACKUP LOCK | NULL | NULL | NULL | 139742993844096 | INTENTION_EXCLUSIVE | TRANSACTION | GRANTED | sql_base.cc:5644 | 3810086 | 3 | | TABLESPACE | NULL | test/t1 | NULL | 139742991805696 | INTENTION_EXCLUSIVE | TRANSACTION | GRANTED | lock.cc:815 | 3810086 | 3 | | TABLE | test | #sql-1b34_2ecca1 | NULL | 139742992091136 | EXCLUSIVE | STATEMENT | GRANTED | sql_table.cc:15532 | 3810086 | 3 | | TABLE | test | t1 | NULL | 140266021234688 | EXCLUSIVE | TRANSACTION | PENDING | mdl.cc:4124 | 3810086 | 3 | +-------------+--------------------+------------------+-------------+-----------------------+---------------------+---------------+-------------+--------------------+-----------------+----------------+ 9 rows in set (0.00 sec)結果は、
3810574スレッドがSHARED_READロックをtest/t1テーブルに保持していることを示しています。 その結果、3810086スレッドはEXCLUSIVEロックを取得できません。performance_schema.threadsテーブルをクエリして、スレッドの詳細を表示します。 サンプル結果:/*force_node='pi-bp10k7631d6k3****'*/ SELECT * FROM performance_schema.threads WHERE THREAD_ID IN (3810086,3810574)\G *************************** 1. row *************************** THREAD_ID: 3810086 NAME: thread/sql/one_connection TYPE: FOREGROUND PROCESSLIST_ID: 3067041 PROCESSLIST_USER: zyg_root PROCESSLIST_HOST: 172.17.28.253 PROCESSLIST_DB: test PROCESSLIST_COMMAND: Query PROCESSLIST_TIME: 41 PROCESSLIST_STATE: Waiting for table metadata lock PROCESSLIST_INFO: alter table t1 add column d varchar(10),algorithm = inplace PARENT_THREAD_ID: NULL ROLE: NULL INSTRUMENTED: YES HISTORY: YES CONNECTION_TYPE: TCP/IP THREAD_OS_ID: 64852 RESOURCE_GROUP: NULL *************************** 2. row *************************** THREAD_ID: 3810574 NAME: thread/sql/one_connection TYPE: FOREGROUND PROCESSLIST_ID: 3067443 PROCESSLIST_USER: zyg_root PROCESSLIST_HOST: 172.17.28.253 PROCESSLIST_DB: test PROCESSLIST_COMMAND: Sleep PROCESSLIST_TIME: 46 PROCESSLIST_STATE: NULL PROCESSLIST_INFO: NULL PARENT_THREAD_ID: NULL ROLE: NULL INSTRUMENTED: YES HISTORY: YES CONNECTION_TYPE: TCP/IP THREAD_OS_ID: 65845 RESOURCE_GROUP: NULL 2 rows in set (0.01 sec)結果は、ブロックされた DDL 操作が
3810086スレッドで実行され、低速クエリが3810574スレッドで実行されていることを示しています。3810574スレッドがロックを保持しています。 その結果、alter table t1 add column d varchar(10),algorithm = inplace文は MDL の取得に失敗し、ブロックされます。 文がコミットされるまで待機するか、KILL processlist_id文を使用して文を終了します。 次に、ビジネス要件に基づいてALTER TABLE t1 ADD COLUMN d VARCHAR(10), ALGORITHM = INPLACE文を再実行します。レプリカとの同期を待機しています
PolarDB はクラスタアーキテクチャを使用します。 プライマリノードで DDL 操作を実行する場合、すべての読み取り専用ノードが対応する MDL を解放するまで待機する必要があります。
SHOW PROCESSLIST文の出力で DDL 操作がレプリカとの同期を待機しています状態の場合、読み取り専用ノードが対応する MDL を保持しています。 前述の情報に基づいて、MDL を保持している読み取り専用ノードのスレッドをすばやく特定できます。サンプルコマンド:
クラスタのプライマリノードで
SHOW PROCESSLIST文を実行して、ALTER TABLE t1 ADD COLUMN d VARCHAR(10), ALGORITHM = INPLACE文の実行ステータスをクエリします。 サンプル結果:/*force_node='pi-bp10k7631d6k3****'*/ SHOW PROCESSLIST; +-----------+-----------------+-----------------------+--------------------+----------------+---------+--------------------------------+-------------------------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +-----------+-----------------+-----------------------+--------------------+----------------+---------+--------------------------------+-------------------------------------------------------------+ | 98 | event_scheduler | localhost | NULL | Daemon | 1307512 | Waiting on empty queue | NULL | (snip) | 270530026 | zyg_root | 172.17.28.253:46390 | test | Query | 0 | starting | /*force_node='pi-bp10k7631d6k3****'*/ show processlist | +-----------+-----------------+-----------------------+--------------------+----------------+---------+--------------------------------+-------------------------------------------------------------+ 21 rows in set (0.00 sec)結果は、DDL 操作が
レプリカとの同期を待機しています状態であることを示しています。ヒントを使用して、
performance_schema.metadata_locksテーブルから特定の読み取り専用ノードの MDL のステータスをクエリします。 サンプル結果:/*force_node='pi-bp186ko4o21wl****'*/ SELECT * FROM performance_schema.metadata_locks; +-------------+--------------------+----------------+-------------+-----------------------+---------------------+---------------+-------------+--------------------+-----------------+----------------+ | OBJECT_TYPE | OBJECT_SCHEMA | OBJECT_NAME | COLUMN_NAME | OBJECT_INSTANCE_BEGIN | LOCK_TYPE | LOCK_DURATION | LOCK_STATUS | SOURCE | OWNER_THREAD_ID | OWNER_EVENT_ID | +-------------+--------------------+----------------+-------------+-----------------------+---------------------+---------------+-------------+--------------------+-----------------+----------------+ (snip) | TABLE | performance_schema | metadata_locks | NULL | 139394296038784 | SHARED_READ | TRANSACTION | GRANTED | sql_parse.cc:7688 | 3518506 | 1 | +-------------+--------------------+----------------+-------------+-----------------------+---------------------+---------------+-------------+--------------------+-----------------+----------------+ 8 rows in set (0.00 sec)結果は、読み取り専用ノードの
3513381、3519277、3519279、3519278、および3519276スレッドがSHARED_READロックをtest/t1テーブルに保持していることを示しています。performance_schema.threadsテーブルからスレッドの詳細情報をクエリします。 サンプル結果:/*force_node='pi-bp186ko4o21wl****'*/SELECT * FROM performance_schema.threads WHERE THREAD_ID IN (3519278,3513381,3519279,3519276,3519277)\G (snip) RESOURCE_GROUP: NULL 5 rows in set (0.00 sec)読み取り専用ノードのクエリ操作はロックを長時間保持し、解放しません。 パラレルクエリ機能が有効になっているため、複数の
parallel_workerスレッドが同時に MDL を保持しています。 文がコミットされるまで待機するか、KILL processlist_id文を使用してプロセスを終了します。 次に、ビジネス要件に基づいてALTER TABLE t1 ADD COLUMN d VARCHAR(10), ALGORITHM = INPLACE文を再実行します。
Contact us
If you have any questions about DDL operations, contact us.