Bagaimana cara menemukan transaksi mana yang menyebabkan status "Menunggu kunci metadata tabel"?

96

Saya mencoba untuk melakukan beberapa DDL di atas meja dan SHOW PROCESSLISTmenghasilkan pesan "Menunggu kunci metadata tabel".

Bagaimana cara mengetahui transaksi mana yang belum ditutup?

Saya menggunakan MySQL v5.5.24.

Drew
sumber

Jawaban:

149
SHOW ENGINE INNODB STATUS \G

Cari Bagian -

TRANSACTIONS

Kita dapat menggunakan Tabel INFORMATION_SCHEMA .

Kueri Berguna

Untuk memeriksa tentang semua transaksi kunci menunggu:

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

Daftar transaksi pemblokiran:

SELECT * 
FROM INNODB_LOCKS 
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);

ATAU

SELECT INNODB_LOCKS.* 
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
  ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);

Daftar kunci di meja tertentu:

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

Daftar transaksi yang menunggu kunci:

SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';

Referensi - Pemecahan Masalah MySQL: Apa yang Harus Dilakukan Saat Kueri Tidak Berfungsi , Bab 6 - Halaman 96.

Joddy
sumber
17
Perlu diketahui bahwa semua tabel yang direferensikan ada di INFORMATION_SCHEMAdatabase.
Michael Mior
9
Apakah tabel InnoDB ini benar-benar menyimpan informasi tentang kunci metatdata? Posting blog ini menyarankan sebaliknya: mysql.wisborg.dk/2014/01/13/…
Gareth
1
@ Gareth: bekerja sampai mysql -mysql-5-7-3-. Terima kasih atas pembaruannya.
Joddy
11
semua ini memiliki set kosong ... namun masih ada kunci yang ditampilkan pada daftar proses ...
K2xL
1
Lihat komentar di bawah ini stackoverflow.com/a/36175882/362574
Joddy
50

Jika Anda tidak dapat menemukan proses mengunci meja (karena sudah mati), mungkin ada utas yang masih dibersihkan seperti ini

bagian TRANSAKSI

show engine innodb status;

pada akhirnya

---TRANSACTION 1135701157, ACTIVE 6768 sec
MySQL thread id 5208136, OS thread handle 0x7f2982e91700, query id 882213399 xxxIPxxx 82.235.36.49 my_user cleaning up

seperti yang disebutkan dalam komentar di Hapus transaksi buntu?

Anda dapat mencoba mematikan utas transaksi secara langsung, di sini dengan

 KILL 5208136;

bekerja untuk saya.

thibault ketterer
sumber
10

mysql 5.7 memperlihatkan informasi kunci metadata melalui performance_schema.metadata_lockstabel.

Dokumentasi di sini

Hln
sumber
4

Saya mengalami masalah serupa dengan Datagrip dan tidak ada solusi yang berhasil.

Setelah saya memulai ulang Klien Datagrip, itu tidak lagi menjadi masalah dan saya dapat membatalkan tabel lagi.

jmcgrath207
sumber
3
restart / reboot - solusi yang 100% berfungsi untuk masalah komputer apa pun. Namun, di Prod, reboot tidak selalu memungkinkan
asgs
2
Saya memiliki masalah yang sama dan menutup DataGrip tiba-tiba menjatuhkan semua kunci. Itu sekumpulan waktu yang terbuang ..
ScottBurfieldMills