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 !!!