MySQL Hata İletişim Paketlerini Okuma


42

MySQL hata günlüklerinde şu gibi birkaç uyarı görüyorum:

120611 16:12:30 [Warning] Aborted connection 2619503 to db: 'db_name' user: 'user_name' host: 'webapp_hostname' (Got an error reading communication packets)

Herhangi bir veri kaybını fark etmedim, bu yüzden bu uyarının ne anlama geldiğini veya bunun nedenini ve bunun neden olan soruna nasıl hitap edebileceğini merak ediyorum. Bu RHEL 6.1 ve MySQL Enterprise 5.5'te.

Yanıtlar:


50

MySQL Connections'ın sessiz katillerinden biri MySQL Paketi.

İlk önce, bir MySQL Paketinin ne olduğunu bulalım.

"MySQL Internals'ı Anlamak" (99-0596-00957-7) sayfasının 99. sayfasına göre , MySQL Paketlerini açıklayan 1-3. Paragraflar:

MySQL ağ iletişim kodu, sorguların her zaman makul derecede kısa olduğu varsayımıyla yazılmıştır ve bu nedenle sunucu tarafından MySQL terminolojisinde bir paket adı verilen tek bir yığın halinde gönderilip işlenebilir . Sunucu, belleği depolamak için geçici bir arabellek için bellek ayırır ve tamamen sığdırmak için yeterli ister. Bu mimari, sunucunun hafızasının tükenmesini önlemek için bir önlem gerektirir - bu seçeneğin gerçekleştirdiği paketin boyutuna bir sınır.

Bu seçenekle ilgili ilgi kodu sql / net_serv.cc içinde bulunur . Bir göz atın my_net_read () , ardından çağrısına izleyin my_real_read () ve özellikle dikkat ) (net_realloc .

Bu değişken aynı zamanda birçok string functon sonucunun uzunluğunu da sınırlar. Ayrıntılar için sql / field.cc ve sql / intem_strfunc.cc dosyasına bakın.

Bunu MySQL Paketleri hakkında bilmek, bir Geliştirici / DBA'nın iğrenç derecede büyük olsalar bile, bir paketin içindeki birden fazla BLOB'yu barındıracak şekilde boyutlandırmasını sağlar. Kuşkusuz, çok küçük bir paket bu bağlamda açık bağlantılar için sorunlara neden olacaktır.

MySQL Belgesine Göre

  • Sunucuya hatalı veya çok büyük bir sorgu gönderirseniz, bu hataları da alabilirsiniz. MySQL çok büyük veya sıra dışı bir paket alırsa, istemcide bir sorun olduğunu varsayar ve bağlantıyı kapatır. Büyük sorgulara ihtiyacınız varsa (örneğin, büyük BLOB sütunları ile çalışıyorsanız), sunucunun varsayılan değeri 1 MB olan max_allowed_packet değişkenini ayarlayarak sorgu sınırını artırabilirsiniz. İstemci ucundaki maksimum paket boyutunu da arttırmanız gerekebilir. Paket boyutunu ayarlama hakkında daha fazla bilgi “Paket çok büyük” Bölüm C.5.2.10'da verilmiştir .

  • Çok sayıda satır ekleyen bir INSERT veya REPLACE ifadesi de bu tür hatalara neden olabilir. Bu ifadelerden biri, eklenecek satır sayısına bakılmaksızın sunucuya tek bir istek gönderir; bu nedenle, INSERT veya REPLACE başına gönderilen satır sayısını azaltarak hatayı önleyebilirsiniz.

ÖNERİ

Varsayılan 1M olduğundan max_allowed_packet'i daha büyük bir sayıya yükseltmeyi deneyin . Mevcut veri kümenizdeki en büyük TEXT veya BLOB alanının yaklaşık 10 katı öneriyorum.

Max_allowed_packet'i 256M olarak ayarlamak için, /etc/my.cnf veya my.ini dosyasına ekleyebilirsiniz.

[mysqld]
max_allowed_packet=256M

MySQL'in gelecekteki yeniden başlatmaları için. Değeri şimdi sunucuya yüklemek için lütfen şunu çalıştırın:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Bir şans ver !!!


Çok iyi açıklama.
Vasilis Lourdas

4

Çoğunlukla varsayılan olarak max_connections 100 olacaktır. Config parametresini arttırmayı deneyin

max_connections = 400, my.cnf ayarını yaptıktan sonra sunucuyu yeniden başlatın veya dinamik olarak ayarlayın:

    set @@global.max_connections = 400;

Bu uyarı iletilerinden kaçınmak için yukarıdaki tavsiyeyi denemeniz ve ağınızın paket düşüşü olmamasını sağlamanız yeterlidir.


2

Geçenlerde MySQL Enterprise taşıdıktan sonra bu sorunu yaşamıştır 5.1.x'ten için 5.7.x uygulamaya önemli kod değişikliği olmadan, ' notu görünmeye başladı'.

Benim durumumda beliren ' notun ' kök nedeni bağlantıların hala açık olduğu programın çıkmasıydı. Kapatılmayan bağlantıların durumu biraz daha fazla ilgiliydi ve MySQL ile değil ACE, thread ve TSS ile ilgili idi.


0

Bu my.ini hattı benim sorunumu çözdü:

log_error_verbosity=1

Bu bağlantıya referans verin


16
Altta yatan sorunu çözdüğünüzü sanmıyorum ama basitçe günlüğe kaydetmeyi durdurdunuz.
user19292

1
Aynı mesajı "Not" olarak da bildirmiştim. Log_error_verbosity = 2 kullanmak aslında "sorunu" çözer (ancak bir "Uyarı" dikkate alınmamalı, dikkate
alınmamalıdır
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.