MySQL Connections'ın sessiz katillerinden biri MySQL Paketidir. MySQL Replication'ın G / Ç İş Parçacığı bile bundan kurtulabilir.
MySQL Belgelerine Göre
Sunucuya yanlış veya çok büyük bir sorgu gönderirseniz bu hataları da alabilirsiniz. Mysqld çok büyük veya bozuk bir paket alırsa, istemcide bir şeyler ters gittiğini varsayar ve bağlantıyı kapatır. Büyük sorgulara ihtiyacınız varsa (örneğin, büyük BLOB sütunlarıyla ç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 artırmanız gerekebilir. Paket boyutunu ayarlama hakkında daha fazla bilgi Bölüm C.5.2.10, “Paket çok büyük” bölümünde verilmiştir .
Çok sayıda satır ekleyen bir INSERT veya REPLACE deyimi 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 hatadan kaçınabilirsiniz.
En azından, hem mysqldump't 'makine hem de yüklediğiniz makine için paket boyutlarının aynı olduğundan emin olmalısınız.
Uygulayabileceğiniz iki (2) yaklaşım olabilir:
YAKLAŞIM 1: - atlama-genişletilmiş-ekleme kullanarak mysqldump gerçekleştirin
Bu, MySQL Paketinin birden çok BLOB, TEXT alanı ile sulanmasını önler. Bu şekilde SQL INSERT'leri teker teker gerçekleştirilir. En büyük dezavantajları
- mysqldump çok daha büyük
- böyle bir çöplüğü yeniden yüklemek çok daha uzun sürer.
YAKLAŞIM # 2: Maks. İzin verilen_paketi artırın
Bu tercih edilen bir yaklaşım olabilir, çünkü bunu uygulamak sadece bir mysql yeniden başlatmasıdır. MySQL Paketinin ne olduğunu anlamak bunu netleştirebilir.
Göre "anlama MySQL Internals" (ISBN 0-596-00957-7) sayfa 99 , burada paragraflar vardır 1-3 açıklayan:
MySQL ağ iletişim kodu, sorguların her zaman makul derecede kısa olduğu ve bu nedenle MySQL terminolojisinde paket olarak adlandırılan bir yığın halinde sunucuya gönderilebileceği ve işlenebileceği varsayımı altında yazılmıştır . Sunucu, paketi saklamak için belleği geçici bir arabellek için ayırır ve tamamen sığdırmak için yeterli bilgi ister. Bu mimari, sunucunun belleğinin bitmemesini önlemek için bir önlem gerektirir - bu seçeneğin gerçekleştirdiği paket boyutunda bir kapak.
Bu seçenekle ilgili ilgi kodu
sql / net_serv.cc'de 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 ayrıca birçok dize işlevinin sonucunun uzunluğunu da sınırlar. Ayrıntılar için sql / field.cc ve
sql / intem_strfunc.cc adresine bakın.
Bu açıklama göz önüne alındığında, toplu INSERT'ler yapmak bir MySQL Paketini oldukça hızlı bir şekilde yükleyecek / boşaltacaktır. Bu özellikle, max_allowed_packet kendisine gelen veri yükü için çok küçük olduğunda geçerlidir.
SONUÇ
Çoğu MySQL kurulumunda, bunu genellikle 256M veya 512M olarak ayarlıyorum. Veri yükleri "MySQL gitti" hataları verdiğinde daha büyük değerlerle karşılaşmalısınız.
max_allowed_packet
yerleşmeye çalıştım ve kullanıyordum--skip-extended-insert
(ve haklısın - bu huuuge db-dumps için yapar), ama yine de başarısız oluyor. Dökümde muhtemelen etrafta çalışabileceğim belirli bir satırdan şüpheleniyorum. Ama yine de garip - dökümü CentOS sunucumda iyi bir şekilde alınabilir.