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.
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.
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.
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.
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
Jawaban:
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:
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
Locked
dan 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.
sumber
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 PROCESSLIST
adalah bahwa Anda tidak akan melihat kunci kecuali pertanyaan lain sedang antri.sumber
Coba
SHOW OPEN TABLES
:sumber
Menggunakan perintah ini
akan menampilkan semua proses yang sedang berjalan, termasuk proses yang telah mendapatkan kunci pada tabel.
sumber
Tidak ada jawaban yang dapat menunjukkan semua kunci yang saat ini dipegang.
Lakukan ini misalnya di mysql di terminal.
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. JugaINNODB_LOCKS
sudah tidak digunakan lagi.SHOW ENGINE INNODB STATUS
tidak berguna:someTable
tidak disebutkan sama sekaliSHOW FULL PROCESSLIST
kosong, karena pelakunya sebenarnya tidak menjalankan kueri sekarang.Anda dapat menggunakan
INFORMATION_SCHEMA.INNODB_TRX
,performance_schema.events_statements_history
danperformance_schema.threads
untuk 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 bahwasomeTable
terkunci 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.
sumber
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.
sumber
Referensi diambil dari pos ini.
Anda dapat menggunakan skrip di bawah ini:
sumber