Pangkalan data MySQL saya berfungsi sebagai bahagian belakang storan untuk tiga aplikasi web. Walau bagaimanapun, baru-baru ini saya mengalami ralat "Menunggu kunci metadata jadual" secara kekal. Ini berlaku hampir sepanjang masa dan saya tidak faham mengapa.
mysql> show processlist -> ; +------+-----------+-----------------+------------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +------+-----------+-----------------+------------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+ | 36 | root | localhost:33444 | bookmaker2 | Sleep | 139 | | NULL | | 37 | root | localhost:33445 | bookmaker2 | Sleep | 139 | | NULL | | 38 | root | localhost:33446 | bookmaker2 | Sleep | 139 | | NULL | | 39 | root | localhost:33447 | bookmaker2 | Sleep | 49 | | NULL | | 40 | root | localhost:33448 | bookmaker2 | Sleep | 139 | | NULL | | 1315 | bookmaker | localhost:34869 | bookmaker | Sleep | 58 | | NULL | | 1316 | root | localhost:34874 | bookmaker3 | Sleep | 56 | | NULL | | 1395 | bookmaker | localhost:34953 | bookmaker | Sleep | 58 | | NULL | | 1396 | root | localhost:34954 | bookmaker3 | Sleep | 46 | | NULL | | 1398 | root | localhost:34956 | bookmaker3 | Query | 28 | Waiting for table metadata lock | CREATE TABLE IF NOT EXISTS LogEntries ( lid INT NOT NULL AUTO_INCREMEN | | 1399 | root | localhost | NULL | Query | 0 | NULL | show processlist | +------+-----------+-----------------+------------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+
Sudah tentu anda boleh mematikan proses yang sepadan. Walau bagaimanapun, jika saya memulakan semula program yang cuba mencipta struktur jadual untuk pangkalan data "bookmaker3", proses yang baru dibuat adalah dalam Metallock semula.
Saya tidak boleh memadam pangkalan data:
mysql> drop database bookmaker3;
Ini juga akan mencipta kunci logam.
Bagaimana untuk menyelesaikan masalah ini?
Malangnya, penyelesaian yang diterima adalah salah. Itu betul sekali
Ini pasti (hampir pasti; lihat di bawah) perkara yang perlu dilakukan. Tetapi kemudian ia menunjukkan,
...dan 1398 bukan sambungan kepada kunci. bagaimana begitu? 1398 ialah sambungan yang menunggu untuk dikunci. Ini bermakna ia belum memperoleh kunci lagi, jadi membunuhnya tidak mempunyai kesan. Proses memegang kunci masih akan memegang kunci, dan benang seterusnya yang cuba melakukan sesuatu akan juga berhenti dan masukkan "tunggu kunci metadata" dalam susunan yang sesuai.
Anda tidak boleh menjamin bahawa proses "Menunggu Kunci Metadata" (WFML) tidak akan disekat juga, tetapi anda boleh yakin bahawa hanya mematikan proses WFML akan tidak melakukan apa-apa .
Sebab sebenar ialah proses lain adalah memegang kunci, dan yang lebih penting,
SHOW FULL PROCESSLIST
tidak akan memberitahu anda secara langsung proses yang mana .Satu perkara yang anda boleh pasti ialah tiada proses bertanda "Menunggu kunci metadata". Boleh dikatakan mereka ini adalah mangsa.
SHOW FULL PROCESSLIST
WILL memberitahu anda jika sesuatu proses sedang melakukan sesuatu, ya. Biasanya ia akan berfungsi. Di sini, proses memegang kunci tidak melakukan apa-apa, dan tersembunyi dalam benang lain yang juga tidak melakukan apa-apa dan dilaporkan sebagai "tidur".Jika
SHOW FULL PROCESSLIST
menunjukkan kepada anda proses yang menjalankan DML, atau dalam keadaan "menghantar data", maka itu hampir pasti puncanya. Proses lain sedang menunggu untuk ia melepaskan kunci (ia boleh menjadi kunci tersirat; proses itu tidak perlu mengeluarkan LOCK TABLE sama sekali, yang sebenarnya mengunci dengan cara yang berbeza). Tetapi proses boleh memegang kunci semasa tidak menjalankan sebarang operasi dan ditandakan dengan sewajarnya sebagai "tidur".Dalam kes OP, pelakunya hampir pasti proses 1396, yang dimulakan sebelum proses 1398, kini berada dalam keadaan
睡眠
, dan telah berlangsung selama 46 saat. Memandangkan 1396 nampaknya telah melakukan semua yang perlu dilakukan (ternyata ia sedang tidur sekarang, dan telah melakukannya selama 46 saat, setakat MySQL yang berkenaan), tiada benang yang masuk masuk ia boleh memegang kunci dan masih tahan Biarkan ia tidur sebelum (jika tidak 1396 juga akan berhenti).Disebabkan dasar penguncian "tanpa jalan buntu" MySQL, tiada proses boleh menahan kunci, melepaskan kunci, dan memulihkan kunci itu semula, oleh itu, menunggu kunci sentiasa disebabkan oleh proses yang masih memegang kunci dan tidak pernah memegangnya sebelum ini . Ini berguna (kami akan mengeksploitasi fakta ini di bawah) kerana ia menjamin bahawa kunci "baris gilir" diperintahkan.
Penting: Jika anda menyambung ke MySQL sebagai pengguna terhad,
SHOW FULL PROCESSLIST
akan tidak menunjukkan semua proses. Jadi kunci mungkin dipegang oleh proses yang anda tidak nampak.Jadi: Jika
SHOW FULL PROCESSLIST
menunjukkan segala-galanya kepada anda dan menunjukkan berjalanproses, maka proses itu mungkin bertanggungjawab dan anda perlu menunggu untuk menyelesaikan apa sahaja yang dilakukannya (atau anda boleh membunuhnya - atas risiko anda sendiri).Selebihnya jawapan ini berkaitan dengan situasi yang mengelirukan di mana proses sedang menunggu tanpa sebab yang jelas dan tiada siapa yang kelihatan melakukan apa-apa.
Lebih baik
显示进程列表
Perkara di atas boleh dilaraskan untuk hanya menunjukkan proses dalam TIDUR, dan ia akan menyusunnya mengikut urutan masa menurun, jadi lebih mudah untuk mencari proses yang digantung (yang, disebabkan oleh pesanan, biasanya
daripada sebarang masa menunggu.sejurus sebelum "menunggu kunci metadata" Tidur satu; dan ia sentiasa satu daripada lebih banyak tidur
Perkara penting
Simpan sebarang proses "menunggu kunci metadata" asingkan.
Penyelesaian cepat dan kotor, tidak sangat disyorkan, tetapi cepat
Bunuh semua proses dalam keadaan "tidur" pada pangkalan data yang sama yang lebih tua daripada yang tertua benang dalam keadaan "menunggu kunci metadata". Inilah yang Arnaud Amaury akan lakukan:
KILL
BUNUH, nilai semula keadaan dan mulakan semula proses dengan sewajarnya. Proses menunggu mungkin berjalan sekarang, atau mungkin telah berjalan sebentar dan kini sedang tidur. Mereka mungkin memegang kunci metadata baharu sekarang.Sembilan puluh sembilan kali daripada seratus, benang yang akan dibunuh ialah benang termuda yang sedang tidur dan lebih tua daripada benang lama menunggu kunci metadata: