MySQL sunucusu büyük dökümlerin içe aktarılmasını engelledi


14

Benim mac yerel mysql büyük bir sql dökümü (2GB) almaya çalışıyorum. Bunu geçmişte yapabildim (MAMP kullanıyordum), ama şimdi 7758 satırında bir ERROR 2006 (HY000) alıyorum: Dökümü ithal etmeye çalıştığımda MySQL sunucusu gitti. Veritabanı innodb tabloları içerir.

Bu ayarların yardımcı olup olmayacağını görmek için my-innodb-heavy-4G.cnf dosyasını my.cnf dosyasına kopyalamayı denedim, ancak şans yok.

Ne ayarlayacağınız hakkında bir fikriniz var mı?

Buradan "Mac OS X sürüm 10.6 (x86, 64 bit), DMG Arşivi" kullanıyorum: http://dev.mysql.com/downloads/mysql/

Yanıtlar:


15

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ı

  1. mysqldump çok daha büyük
  2. 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.


900M'ye max_allowed_packetyerleş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.
naxoc

Ben çok, çok uzun bir çizgi olan sql dökümü bir ekleme kaldırma sona erdi. Bu düzeltildi (ve hatta gerek yoktu).
naxoc

BTW, veri dökümü için varsayılan karakterin MacOSX İşletim Sisteminde ve MySQL'de desteklenebildiğinden emin olun.
RolandoMySQLDBA

@naxov - Sadece çöplükte şüphelendiğin tek çizgiyi merak ediyorum. İlgili herhangi bir METİN veya BLOB alanı var mı ???
RolandoMySQLDBA

Evet çok uzun bir metin alanı.
naxoc

2

Bu, zaman aşımına uğramadan ne kadar sürer? İlk adım , içe aktarma işleminiz için yeterince büyük olduklarından emin olmak için wait_timeoutve interactive_timeoutayarlarını kontrol etmek için bahse girer :

SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;

Varsayılan değer 8 saattir (28800), bu yüzden sorun olmayabilir. Bu sorunun diğer belirtilerini burada bulabilirsiniz . Öne çıkanlardan biri şudur:

Farklı bir ana bilgisayarda çalışan bir istemci uygulaması, o ana bilgisayardan MySQL sunucusuna bağlanmak için gerekli ayrıcalıklara sahip değildir.

Önce izinleri doğrulayın, ancak daha sonra olası sorunlar listesini gözden geçirin.


Her şey localhost'ta, bu yüzden ne demek istediğini anlamıyorum ya da sorun değil. Bunu mu demek istediniz: mysql
naxoc

2

Evet, genellikle wait_timeout ve max_allowed_packets ile oynamak hata mesajını da çözmeme izin verir.


Bu benim için işe yaramadı. Dökümü dosyasında sql düzenlemek ve soruna neden olan çok uzun bir çizgi kaldırmak zorunda kaldı.
naxoc

biri anlamadığı bazı parametrelerle
oynamamalıdır

2

Yapılması gereken "doğru" şey olmayabilir, ancak işe yarayabilir (tamamlayın, değil mi?):

Büyük dökümünüzü birden çok dosyaya bölmeyi ve sırayla birer birer çalıştırmayı deneyin. Benim yaklaşımım bunu yarıya indirmek ve test etmek olurdu. Ardından her bir yarıyı yarıya bölün, tekrar test edin vb.

Kutunuzdaki RAM miktarının bununla bir ilgisi olup olmadığını biraz merak ediyorum. MySQL, çalıştırıldığında tüm dökümü belleğe yüklüyor mu? Bilmiyorum ... ama sadece 2GB RAM'iniz varsa ve bunların bazıları işletim sisteminizi ve diğer uygulamalarınızı çalıştırıyorsa, bu sorun olabilir .


2

Diğer önerilerle başarılı olamayanlar, BigDump PHP aşamalı MySQL döküm ithalatçı komut dosyasına bir göz atmayı düşünebilir .

Bu, büyük veritabanı dökümlerini MySQL'e aktarmak için bir çözümdür. Yerel geliştirme ortamına büyük bir MySQL dökümü almak için başarılı bir şekilde kullandım (bu durumda MAMP kullanıyorum).

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.