Bagaimana saya bisa menunjukkan kunci mysql?


45

Apakah ada untuk menunjukkan semua kunci yang aktif dalam database mysql?


1
Anda dapat meminta tabel INNODB_LOCK_WAITS dan INNODB_LOCKS.

Jawaban:


40

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. Tetapi pastikan untuk memasukkan kata kunci lengkap sehingga pertanyaan yang dicetak tidak terpotong:

SHOW FULL PROCESSLIST;

Ini akan menampilkan 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 Lockeddan kueri 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.


21

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 TRANSAKSI.

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


20

Coba SHOW OPEN TABLES:

show open tables where In_Use > 0 ;

Saya pikir ini adalah cara terbaik untuk mengidentifikasi kunci yang digunakan dengan segera, terutama jika Anda memiliki banyak basis data dan ratusan koneksi.
nelaaro

7

Menggunakan perintah ini

SHOW PROCESSLIST

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


7

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

Lakukan ini misalnya 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_LOCKSkosong, yang masuk akal diberikan dokumentasi , karena hanya ada satu transaksi dan saat ini tidak ada yang menunggu kunci. Juga INNODB_LOCKSsudah tidak digunakan lagi.

SHOW ENGINE INNODB STATUStidak berguna: someTabletidak disebutkan sama sekali

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

Anda dapat menggunakan INFORMATION_SCHEMA.INNODB_TRX, performance_schema.events_statements_historydan performance_schema.threadsuntuk mengekstraksi kueri yang pernah dieksekusi transaksi aktif di masa lalu seperti yang dijabarkan dalam jawaban saya yang lain , tetapi saya belum menemukan cara untuk melihat bahwa someTableterkunci dalam skenario di atas.

Saran di jawaban lain sejauh ini tidak akan membantu setidaknya.

Penafian: Saya belum menginstal innotop dan saya tidak repot-repot. Mungkin itu bisa berhasil.


6

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.


4

Referensi diambil dari pos 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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.