Apabila menghadapi ralat "Kunci tamat masa menunggu melebihi" dalam log MySQL, ini menunjukkan transaksi menunggu untuk kunci pada item pangkalan data. Walaupun anda mungkin mengetahui pertanyaan mana yang cuba mengakses pangkalan data, menentukan pertanyaan yang memegang kunci pada saat yang tepat itu boleh menjadi mencabar.
Kehadiran perkataan "transaksi" dalam mesej ralat menunjukkan bahawa pertanyaan bermasalah melibatkan pengubahsuaian sekurang-kurangnya satu baris dalam satu atau lebih jadual InnoDB. Memandangkan anda mempunyai akses kepada pertanyaan yang menyebabkan ralat, anda boleh menentukan jadual yang sedang diakses, kerana ia berpotensi menjadi punca.
Untuk menyiasat lebih lanjut, jalankan perkara berikut arahan:
SHOW ENGINE INNODB STATUS\G
Ini akan memberikan maklumat tentang kunci dan mutex, termasuk:
Sebagai contoh, output berikut daripada klien menggambarkan isu tersebut.
Type: InnoDB Name: Status: ===================================== 110514 19:44:14 INNODB MONITOR OUTPUT ===================================== Per second averages calculated from the last 4 seconds ---------- SEMAPHORES ---------- Mutex spin waits 0, rounds 11487096053, OS waits 7756855 RW-shared spins 722142, OS waits 211221; RW-excl spins 787046, OS waits 39353 ------------------------ LATEST FOREIGN KEY ERROR ------------------------ 110507 21:41:35 Transaction: TRANSACTION 0 606162814, ACTIVE 0 sec, process no 29956, OS thread id 1223895360 updating or deleting, thread declared inside InnoDB 499 mysql tables in use 1, locked 1 14 lock struct(s), heap size 3024, 8 row lock(s), undo log entries 1 MySQL thread id 3686635, query id 124164167 10.64.89.145 viget updating DELETE FROM file WHERE file_id in ('6dbafa39-7f00-0001-51f2-412a450be5cc' ) ...
Dalam output ini, jadual "fail" muncul menjadi jadual yang terjejas, kerana pertanyaan DELETE cuba mengubah suai baris dalam jadual itu. Dengan menganalisis output, anda boleh menentukan jadual tertentu yang menyebabkan perbalahan kunci.
Untuk mengelak daripada menghadapi ralat ini pada masa hadapan, pertimbangkan untuk meningkatkan tamat masa menunggu kunci nilai untuk InnoDB dengan menetapkan parameter innodb_lock_wait_timeout. Nilai lalai ialah 50 saat.
Untuk meningkatkan tamat masa secara kekal, tambah baris berikut pada fail /etc/my.cnf anda:
[mysqld] innodb_lock_wait_timeout=120
Sebagai alternatif, anda boleh melaraskan tamat masa buat sementara waktu dalam sesi semasa:
SET innodb_lock_wait_timeout = 120;
Meningkatkan tamat masa akan memberikan transaksi menunggu lebih banyak masa untuk memperoleh kunci, mengurangkan kemungkinan ralat tamat masa.
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat 'Tamat masa menunggu kunci melebihi' MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!