Waktu klien habis, sementara permintaan MySQL tetap berjalan?

9

Kami mengalami masalah di mana kueri baca-saja, dijalankan melalui meja kerja MySQL, kehabisan waktu dari perspektif UI pengguna dan tetap berjalan di server (dan tampaknya menghabiskan lebih banyak sumber daya) hingga kami mengalami pemadaman.

Pertanyaan

  • Apakah ada cara standar untuk menangani masalah semacam ini di MySQL?
  • Apakah ada alasan mendasar yang perlu kita hindari?
asthasr
sumber

Jawaban:

11

Anda perlu melihat nilai default apa yang ada untuk timeout:

mysql> show variables like '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 60    |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 60    |
+----------------------------+-------+
10 rows in set (0.00 sec)

Biasanya, saya menonton beberapa variabel timeout. Ini sangat penting jika Anda menggunakan MySQL dari jauh dari MySQL Workbench, klien mysql, atau aplikasi PHP pada server aplikasi yang menghubungi MySQL pada DB Server.

Inilah yang dikatakan Dokumentasi MySQL salah satu pengaturan ini:

  • wait_timeout (Default 28800 [8 jam]): Jumlah detik server menunggu aktivitas pada koneksi non-aktif sebelum menutupnya. Batas waktu ini hanya berlaku untuk koneksi file TCP / IP dan Unix socket, tidak untuk koneksi yang dibuat menggunakan pipa bernama, atau memori bersama. Saat memulai utas, nilai sesi wait_timeout diinisialisasi dari nilai wait_timeout global atau dari nilai interactive_timeout global, tergantung pada jenis klien (sebagaimana ditentukan oleh opsi koneksi CLIENT_INTERACTIVE ke mysql_real_connect ()). Lihat juga interactive_timeout.
  • interactive_timeout (Default 28800 [8 jam]): Jumlah detik server menunggu aktivitas pada koneksi interaktif sebelum menutupnya. Klien interaktif didefinisikan sebagai klien yang menggunakan opsi CLIENT_INTERACTIVE untuk mysql_real_connect (). Lihat juga wait_timeout.
  • net_read_timeout (Default 30): Jumlah detik untuk menunggu lebih banyak data dari koneksi sebelum membatalkan pembacaan. Ketika server membaca dari klien, net_read_timeout adalah nilai batas waktu yang mengontrol kapan harus dibatalkan. Ketika server menulis ke klien, net_write_timeout adalah nilai batas waktu yang mengontrol kapan harus dibatalkan. Lihat juga slave_net_timeout.
  • net_write_timeout (Default 60): Jumlah detik untuk menunggu blok ditulis ke koneksi sebelum membatalkan penulisan. Lihat juga net_read_timeout.

Harap pastikan batas waktu ini disetel cukup tinggi untuk mengakomodasi permintaan yang mungkin berjalan untuk waktu yang sangat lama, yang mungkin termasuk:

  • Massa UPDATEs
  • Massa DELETEs
  • ENABLE KEYS pada MyISAM Besar

Untuk menangani kueri yang terus berjalan setelah Anda kehilangan kontak dengannya, Anda harus menjalankan KILL terhadap proses ID dari permintaan yang berjalan lama. Bahkan dengan perintah KILL, Anda harus menunggu permintaan apa pun yang ada di tengah langkah-langkah intensif disk atau memiliki mutex internal yang sedang berlangsung.

RolandoMySQLDBA
sumber
Apakah ada cara standar dan kuat untuk menjalankan KILL terhadap proses yang telah berjalan lama, atau apakah itu biasanya dilakukan melalui skrip bash / tugas cron?
asthasr
Saya benar-benar menulis posting pada bulan Mei 2011 tentang cara meluncurkan skrip menggunakan information_schema untuk membunuh sekelompok Koneksi DB: dba.stackexchange.com/a/2637/877
RolandoMySQLDBA
"Harap pastikan batas waktu ini disetel cukup tinggi untuk mengakomodasi permintaan yang mungkin berjalan untuk waktu yang sangat lama, yang mungkin termasuk: PEMBARUAN Massal ..." contoh: php + mysql saya harus memilih setiap catatan dari kolom tabel, jadi ambil baris dan kemudian lakukan sesuatu ... kemudian perbarui catatan lain dengan nilai baru. Tulisan yang dibutuhkan skrip ini sekitar 5+ menit. Satu PILIH di awal dan satu PEMBARUAN sampai akhir, ambil baris dan lakukan ... di tengah. Bisakah Anda jelaskan apa yang harus dilakukan wait_timeout dengan situasi ini? Sungguh tidak jelas bagi saya ... apa nilai yang aman untuk wait_timeout ke sumber daya gratis