it-swarm.asia

Waktu klien habis, sementara permintaan MySQL tetap berjalan?

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?
9
asthasr

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 jarak jauh dari MySQL Workbench, klien mysql, atau aplikasi PHP pada server aplikasi yang menghubungi MySQL pada Server DB.

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 yang akan 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 pertanyaan yang terus berjalan setelah Anda kehilangan kontak dengannya, Anda harus menjalankan [~ # ~] kill [~ # ~] terhadap ID proses dari permintaan yang sudah 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.

11
RolandoMySQLDBA