Dari skrip saya mengirim permintaan seperti ini ribuan kali ke basis data lokal saya:
update some_table set some_column = some_value
Saya lupa menambahkan bagian di mana, jadi kolom yang sama ditetapkan ke nilai yang sama untuk semua baris dalam tabel dan ini dilakukan ribuan kali dan kolom diindeks, sehingga indeks yang sesuai mungkin diperbarui terlalu banyak kali .
Saya perhatikan ada sesuatu yang salah, karena terlalu lama, jadi saya membunuh naskahnya. Saya bahkan me-reboot komputer saya sejak itu, tetapi ada sesuatu yang macet di tabel, karena permintaan sederhana membutuhkan waktu yang sangat lama untuk dijalankan dan ketika saya mencoba menjatuhkan indeks yang relevan gagal dengan pesan ini:
Lock wait timeout exceeded; try restarting transaction
Ini adalah tabel innodb, jadi transaksi yang macet mungkin implisit. Bagaimana saya bisa memperbaiki tabel ini dan menghapus transaksi macet dari itu?
sumber
SHOW FULL PROCESSLIST
?Jawaban:
Saya memiliki masalah yang sama dan menyelesaikannya dengan memeriksa utas yang sedang berjalan. Untuk melihat utas yang sedang berjalan gunakan perintah berikut di antarmuka baris perintah mysql:
Itu juga dapat dikirim dari phpMyAdmin jika Anda tidak memiliki akses ke antarmuka baris perintah mysql.
Ini akan menampilkan daftar utas dengan id yang sesuai dan waktu eksekusi, sehingga Anda dapat MEMBUNUH utas yang terlalu banyak waktu untuk dieksekusi. Di phpMyAdmin Anda akan memiliki tombol untuk menghentikan utas dengan menggunakan KILL, jika Anda menggunakan antarmuka baris perintah gunakan saja perintah KILL diikuti oleh id utas, seperti dalam contoh berikut:
Ini akan memutuskan koneksi untuk utas yang sesuai.
sumber
Anda dapat memeriksa transaksi yang sedang berjalan dengan
Transaksi Anda harus menjadi yang pertama, karena ini adalah yang tertua dalam daftar. Sekarang ambil saja nilai dari
trx_mysql_thread_id
dan kirimkanKILL
perintah:Jika Anda tidak yakin transaksi mana yang menjadi milik Anda, ulangi permintaan pertama dengan sangat sering dan lihat transaksi mana yang tetap ada.
sumber
Periksa status InnoDB untuk kunci
Periksa tabel terbuka MySQL
Periksa transaksi InnoDB yang tertunda
Periksa ketergantungan kunci - apa yang menghalangi apa
Setelah menyelidiki hasil di atas, Anda seharusnya bisa melihat apa yang mengunci apa.
Penyebab utama masalah mungkin ada dalam kode Anda juga - silakan periksa fungsi terkait terutama untuk anotasi jika Anda menggunakan JPA seperti Hibernate.
Misalnya, seperti dijelaskan di sini , penyalahgunaan anotasi berikut dapat menyebabkan kunci dalam database:
sumber
SELECT * FROM information_schema.innodb_trx t JOIN information_schema.processlist p ON t.trx_mysql_thread_id = p.id
mengungkapkan penyebabnya: Utas penguncian berasal dari alamat IP saya ... Saya lupa menutup konsol debug yang saya tinggalkan di tengah transaksi ...Ini mulai terjadi pada saya ketika ukuran basis data saya bertambah dan saya melakukan banyak transaksi.
Sebenarnya mungkin ada beberapa cara untuk mengoptimalkan kueri atau DB Anda, tetapi cobalah 2 kueri ini untuk menyelesaikan masalah.
Jalankan ini:
Dan kemudian ini:
sumber
Ketika Anda membuat koneksi untuk transaksi, Anda mendapatkan kunci sebelum melakukan transaksi. Jika tidak dapat memperoleh kunci, maka Anda mencoba beberapa saat. Jika kunci masih tidak dapat diperoleh, maka waktu tunggu kunci yang terlampaui dilemparkan. Mengapa Anda tidak dapat memperoleh kunci adalah karena Anda tidak menutup koneksi. Jadi, ketika Anda mencoba untuk mendapatkan kunci kedua kalinya, Anda tidak akan dapat memperoleh kunci karena koneksi Anda sebelumnya masih tertutup dan memegang kunci.
Solusi: tutup koneksi atau
setAutoCommit(true)
(sesuai desain Anda) untuk melepaskan kunci.sumber
Restart MySQL, ini berfungsi dengan baik.
TAPI waspadalah bahwa jika permintaan seperti itu macet, ada masalah di suatu tempat:
LIKE %...%
,, dll.)Seperti yang dikatakan @syedrakib, ini bekerja tetapi ini bukan solusi jangka panjang untuk produksi.
Hati-hati: melakukan restart dapat memengaruhi data Anda dengan kondisi tidak konsisten.
Anda juga dapat memeriksa bagaimana MySQL menangani kueri Anda dengan kata kunci EXPLAIN dan melihat apakah ada sesuatu yang mungkin di sana untuk mempercepat kueri (indeks, tes kompleks, ...).
sumber
Proses goto di mysql.
Jadi bisa melihat ada tugas yang masih berfungsi.
Bunuh proses tertentu atau tunggu sampai proses selesai.
sumber
Saya mengalami masalah yang sama dengan pernyataan "pembaruan". Solusi saya adalah menjalankan melalui operasi yang tersedia di phpMyAdmin untuk tabel. Saya mengoptimalkan, memerah dan mendefragmentasi tabel (tidak dalam urutan itu). Tidak perlu menjatuhkan meja dan mengembalikannya dari cadangan untuk saya. :)
sumber
Saya memiliki masalah yang sama. Saya pikir itu masalah kebuntuan dengan SQL. Anda bisa langsung menutup proses SQL dari Task Manager. Jika itu tidak memperbaikinya, cukup restart komputer Anda. Anda tidak perlu menjatuhkan tabel dan memuat ulang data.
sumber
Saya punya masalah ini ketika mencoba untuk menghapus kelompok catatan tertentu (menggunakan MS Access 2007 dengan koneksi ODBC ke MySQL di server web). Biasanya saya akan menghapus catatan tertentu dari MySQL kemudian ganti dengan catatan yang diperbarui (kaskade menghapus beberapa catatan terkait, aliran ini menghapus semua catatan terkait untuk satu penghapusan catatan tunggal).
Saya mencoba menjalankan melalui operasi yang tersedia di phpMyAdmin untuk tabel (optimalkan, flush, dll), tetapi saya mendapatkan izin yang diperlukan untuk kesalahan RELOAD ketika saya mencoba untuk menyiram. Karena database saya ada di server web, saya tidak bisa memulai kembali database. Mengembalikan dari cadangan bukanlah opsi.
Saya mencoba menjalankan kueri penghapusan untuk grup rekaman ini di akses mySQL cPanel di web. Mendapat pesan kesalahan yang sama.
Solusi saya: Saya menggunakan Browser Kueri MySQL gratis dari Sun (yang saya instal di komputer saya) dan menjalankan query delete di sana. Itu langsung bekerja, Masalah terpecahkan. Saya kemudian dapat sekali lagi melakukan fungsi menggunakan skrip Access menggunakan ODBC Access ke koneksi MySQL.
sumber
Memperbaikinya.
Pastikan Anda tidak memasukkan data yang tidak cocok dengan kueri. Saya mengalami masalah ketika saya mencoba "data agen peramban pengguna"
VARCHAR(255)
dan mengalami masalah dengan kunci ini namun ketika saya mengubahnyaTEXT(255)
memperbaikinya.Jadi kemungkinan besar itu adalah ketidakcocokan tipe data.
sumber
Saya memecahkan masalah dengan menjatuhkan meja dan mengembalikannya dari cadangan.
sumber