MySQL sorgusu çalışmaya devam ederken istemci zaman aşımına uğradı mı?


9

MySQL çalışma tezgahında çalıştırılan salt okunur bir sorgunun, kullanıcının kullanıcı arayüzü perspektifinden zaman aşımına uğradığı ve bir kesinti elde edilene kadar sunucuda (ve görünüşte daha fazla kaynak tükettiği) çalışmaya devam ettiği bir sorunla karşılaştık.

Sorular

  • MySQL'de bu tür sorunlarla başa çıkmanın standart bir yolu var mı?
  • Kaçınılması gereken temel bir neden var mı?

Yanıtlar:


11

Zaman aşımları için hangi varsayılan değerlerin mevcut olduğuna bakmanız gerekir:

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)

Genellikle birkaç zaman aşımı değişkeni izlerim. MySQL'i MySQL Workbench, mysql istemcisi veya PHP uygulamasından bir DB Sunucusundaki MySQL ile iletişim kuran bir uygulama sunucusunda uzaktan kullanıyorsanız, bu çok önemlidir.

MySQL Belgelerinde aşağıdaki ayarlardan biri belirtilmektedir:

  • wait_timeout (Varsayılan 28800 [8 saat]): Sunucunun kapatmadan önce etkileşimli olmayan bir bağlantıda etkinlik beklediği saniye sayısı. Bu zaman aşımı, adlandırılmış yöneltmeler veya paylaşılan bellek kullanılarak yapılan bağlantılar için değil, yalnızca TCP / IP ve Unix soket dosya bağlantıları için geçerlidir. İş parçacığı başlangıcında, oturum wait_timeout değeri, istemcinin türüne (mysql_real_connect (CLIENT_INTERACTIVE bağlantı seçeneği tarafından tanımlandığı gibi) bağlı olarak, global wait_timeout değerinden veya global interactive_timeout değerinden başlatılır. Ayrıca interactive_timeout'a bakın.
  • interactive_timeout (Varsayılan 28800 [8 saat]): Sunucunun kapatmadan önce etkileşimli bir bağlantıda etkinlik beklediği saniye sayısı. Etkileşimli istemci, mysql_real_connect () işlevine CLIENT_INTERACTIVE seçeneğini kullanan bir istemci olarak tanımlanır. Ayrıca bkz. Wait_timeout.
  • net_read_timeout (Varsayılan 30): Okumayı iptal etmeden önce bir bağlantıdan daha fazla veri beklenecek saniye sayısı. Sunucu istemciden okurken net_read_timeout, ne zaman iptal edileceğini kontrol eden zaman aşımı değeridir. Sunucu istemciye yazarken, net_write_timeout ne zaman sonlandırılacağını kontrol eden zaman aşımı değeridir. Ayrıca bkz. Slave_net_timeout.
  • net_write_timeout (Varsayılan 60): Yazma işlemini iptal etmeden önce bir bloğun bir bağlantıya yazılması için beklenecek saniye sayısı. Ayrıca bkz. Net_read_timeout.

Lütfen bu zaman aşımlarının çok uzun süre çalışabilecek ve aşağıdakileri içerebilecek sorguları alacak kadar yüksek ayarlandığından emin olun:

  • kitle UPDATEs
  • kitle DELETEs
  • ENABLE KEYS Büyük bir MyISAM'da

Teması kaybettikten sonra çalışmaya devam eden sorgularla başa çıkmak için , uzun süren sorgunun işlem kimliğine karşı KILL çalıştırmanız gerekir . KILL komutuyla bile, disk yoğun adımların ortasında olan veya dahili muteksleri devam eden herhangi bir sorguyu beklemeniz gerekecektir.


KILL'i uzun süredir devam eden süreçlere karşı çalıştırmanın standart, sağlam bir yolu var mı, yoksa genellikle bash betiği / cron işi aracılığıyla mı yapılıyor?
asthasr

: Aslında DB Connections bir demet öldürmek için information_schema kullanarak bir komut dosyası başlatmak konusunda Mayıs 2011'de bir post cevap yazdım dba.stackexchange.com/a/2637/877
RolandoMySQLDBA

"Lütfen bu zaman aşımlarının çok uzun süre çalışabilecek sorguları barındıracak kadar yüksek ayarlandığından emin olun. ve ardından bir şeyler yapın ... sonra başka bir kaydı yeni bir değerle güncelleyin. Bu komut dosyasının yaklaşık 5 dakikadan fazla sürmesi gerektiğini yazınız. Başlangıçta biri SEÇ ve sonuna kadar GÜNCELLEME, satırları getir ve ... ortada yap. Wait_timeout'un bu durumla ne yapması gerektiğini açıklayabilir misiniz? Gerçekten benim için net değil ... wait_timeout'un ücretsiz kaynak oluşturması için güvenli bir değer nedir
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.