DBAtlas · Veritabanı operasyon atlası

'Waiting for table metadata lock' teşhisi ve asıl bloklayanı bulma

MySQLPerformans

Komut

-- Bekleyen -> bloklayan eslesmesi; ALTER'in kendi SHARED_UPGRADABLE kaydini ele
SELECT object_schema, object_name, waiting_pid, LEFT(waiting_query, 60) AS waiting_query,
       waiting_lock_type, blocking_pid, blocking_lock_type, sql_kill_blocking_connection
FROM sys.schema_table_lock_waits
WHERE blocking_lock_type <> 'SHARED_UPGRADABLE';

-- Tablo uzerindeki tum MDL'ler, sahibinin yasi ve acik transaction'i
SELECT ml.OBJECT_SCHEMA, ml.OBJECT_NAME, ml.LOCK_TYPE, ml.LOCK_DURATION, ml.LOCK_STATUS,
       t.PROCESSLIST_ID AS conn_id, t.PROCESSLIST_COMMAND AS command, t.PROCESSLIST_TIME AS sec,
       LEFT(t.PROCESSLIST_INFO, 60) AS query, trx.trx_started
FROM performance_schema.metadata_locks ml
JOIN performance_schema.threads t ON t.THREAD_ID = ml.OWNER_THREAD_ID
LEFT JOIN information_schema.INNODB_TRX trx ON trx.trx_mysql_thread_id = t.PROCESSLIST_ID
WHERE ml.OBJECT_TYPE = 'TABLE' AND ml.OBJECT_SCHEMA NOT IN ('performance_schema', 'mysql')
ORDER BY ml.OBJECT_NAME, ml.LOCK_STATUS DESC;

Ne yapar?

ALTER / TRUNCATE / RENAME gibi bir DDL'in hangi oturumun tuttuğu metadata lock yüzünden beklediğini ve DDL'in arkasında kuyruğa giren sorguları gösterir. Bloklayan çoğu zaman tabloyu okuyup transaction'ı kapatmamış, Sleep durumundaki bir oturumdur.

Ne zaman kullanılır?

Bir ALTER başladıktan sonra o tabloya gelen tüm sorgular 'Waiting for table metadata lock' durumunda yığıldığında.

Dikkat

Bekleyen DDL, kendisinden sonra gelen SELECT'leri de bloklar; olay anında hızlı karar ver: ya bloklayan oturumu KILL et ya da ALTER'i iptal et (KILL QUERY). Bloklayanın PROCESSLIST_INFO'su NULL olabilir (idle); son sorgusunu görmek için performance_schema.events_statements_history veya sys.session.last_statement kullan. Önleme: DDL öncesi SET SESSION lock_wait_timeout = 5 ile ALTER'in kısa sürede vazgeçmesini sağla ve uygulamada uzun açık transaction bırakma.

DBAtlas'ta aç →

İlgili