pengembangan-web-mp.com

Bagaimana saya bisa menunjukkan kunci mysql?

Apakah ada cara untuk menampilkan semua kunci yang aktif dalam database mysql?

54
Rory

Lihat tautan Marko untuk tabel InnoDB dan peringatan.

Untuk MyISAM, tidak ada solusi mudah "ini adalah permintaan yang menyinggung". Anda harus selalu memulai dengan daftar proses. Tapi pastikan untuk memasukkan kata kunci lengkap sehingga pertanyaan yang dicetak tidak terpotong:

SHOW FULL PROCESSLIST;

Ini akan menunjukkan kepada Anda daftar semua proses saat ini, kueri dan status SQL mereka. Sekarang biasanya jika satu permintaan menyebabkan banyak orang lain untuk mengunci maka itu harus mudah diidentifikasi. Kueri yang terpengaruh akan memiliki status Locked dan permintaan yang menyinggung akan duduk dengan sendirinya, mungkin menunggu sesuatu yang intensif, seperti tabel sementara.

Jika tidak jelas maka Anda harus menggunakan kekuatan deduksi SQL Anda untuk menentukan bagian SQL yang menyinggung yang mungkin menjadi penyebab kesengsaraan Anda.

47
Dan Carley

Jika Anda menggunakan InnoDB dan perlu memeriksa menjalankan kueri, saya sarankan

show engine innodb status;

seperti yang disebutkan dalam tautan Marko. Ini akan memberi Anda permintaan penguncian, berapa banyak baris/tabel yang dikunci olehnya, dll. Lihat di bawah TRANSACTIONS.

Masalah dengan menggunakan SHOW PROCESSLIST adalah bahwa Anda tidak akan melihat kunci kecuali jika pertanyaan lain sedang antri.

26
Polymorphix

Coba SHOW OPEN TABLES :

show open tables where In_Use > 0 ;
24
M Sleman

Tidak ada jawaban yang dapat menunjukkan semua kunci yang saat ini dipegang.

Lakukan ini mis. di mysql di terminal.

start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there

Jelas transaksi di atas memegang kunci, karena transaksi masih aktif. Tetapi tidak ada permintaan yang sedang terjadi saat ini dan tidak ada yang menunggu kunci di mana pun (setidaknya).

INFORMATION_SCHEMA.INNODB_LOCKS kosong, yang masuk akal diberikan dokumentasi , karena hanya ada satu transaksi dan saat ini tidak ada yang menunggu kunci. Juga INNODB_LOCKS sudah tidak digunakan lagi.

SHOW ENGINE INNODB STATUS tidak berguna: someTable tidak disebutkan sama sekali

SHOW FULL PROCESSLIST kosong, karena pelakunya sebenarnya tidak menjalankan kueri sekarang.

Kamu bisa menggunakan INFORMATION_SCHEMA.INNODB_TRX, performance_schema.events_statements_history dan performance_schema.threads untuk mengekstrak kueri yang telah dieksekusi transaksi aktif di masa lalu seperti yang diuraikan di jawaban saya yang lain , tapi saya belum menemukan cara apa pun untuk melihat bahwa someTable terkunci di skenario di atas.

Saran dalam jawaban lain sejauh ini tidak akan membantu setidaknya.

Penafian: Saya belum menginstal innotop dan saya tidak repot-repot. Mungkin dapat berfungsi.

11
Peter V. Mørch

Menggunakan perintah ini

SHOW PROCESSLIST

akan menampilkan semua proses yang sedang berjalan, termasuk proses yang telah memperoleh kunci pada tabel.

7
Arie K

AFAIK masih belum ada cara asli di MYSQL, tapi saya menggunakan innotop . Ini gratis dan memiliki banyak fungsi lainnya.

Lihat juga tautan ini untuk informasi lebih lanjut tentang penggunaan alat innotop.

7
Marko Carter

Referensi diambil dari posting ini.

Anda dapat menggunakan skrip di bawah ini:

SELECT 
    pl.id
    ,pl.user
    ,pl.state
    ,it.trx_id 
    ,it.trx_mysql_thread_id 
    ,it.trx_query AS query
    ,it.trx_id AS blocking_trx_id
    ,it.trx_mysql_thread_id AS blocking_thread
    ,it.trx_query AS blocking_query
FROM information_schema.processlist AS pl 
INNER JOIN information_schema.innodb_trx AS it
    ON pl.id = it.trx_mysql_thread_id
INNER JOIN information_schema.innodb_lock_waits AS ilw
    ON it.trx_id = ilw.requesting_trx_id 
        AND it.trx_id = ilw.blocking_trx_id
5
Anvesh