MySQL Server büyük sql dosyasını içe aktarırken kayboldu


259

PhpMyAdmin aracılığıyla büyük bir sql dosyasını almaya çalıştım ... Ama hata göstermeye devam etti

'MySql sunucusu kayboldu'

Ne yapalım?


3
Max_allowed_packet ve wait_timeout için değerleriniz nelerdir?
daemonofchaos

1
ikiye katlamayı deneyebilirsiniz max_allowed_packet. Biraz kaba, ama eğer işe yararsa aklı başında bir değer bulabilirsiniz.
Nanne

1
Gülmek için teşekkürler Cole Johnson. Harikaydı! LOL! :)
mbrinson

Şans eseri sık sık görüyorum. Ancak aynı hatayı tekrar oluşturamıyorum. Ve böylece dinamik olabileceğini fark ettim. Bazen, istemci sunucuya çok fazla SQL gönderirse (örn. Bir döngüden), bu olabilir. Bu hatanın asıl nedenini bulmak önemlidir. İpuçlarını bulmak için sorgu günlüklerinizi yinelenen SQL kalıpları için de kontrol edin.
Bimal Poudel

bazen disk alanınız azaldığında bunu elde edersiniz
pramodtech

Yanıtlar:


376

Belirtildiği gibi burada :

MySQL sunucusunun en yaygın iki nedeni (ve düzeltmeleri) ortadan kalkmıştır (hata 2006):

Sunucu zaman aşımına uğradı ve bağlantıyı kapattı. Nasıl düzeltilir:

  1. mysqld'in my.cnf yapılandırma dosyasındaki wait_timeout değişkeninin yeterince büyük olup olmadığını kontrol edin. Debian'da: saniyeyi sudo nano /etc/mysql/my.cnfayarlayın wait_timeout = 600(2006 hatası gittiğinde bu değeri değiştirebilir / azaltabilirsiniz), sonra sudo /etc/init.d/mysql restart. Kontrol etmedim, ancak wait_timeout için varsayılan değer yaklaşık 28800 saniye (8 saat) olabilir.

  2. Sunucu yanlış veya çok büyük bir paket bıraktı. Mysqld çok büyük veya yanlış bir paket alırsa, istemcide bir şeylerin yanlış gittiğini varsayar ve bağlantıyı kapatır. My.cnf dosyasındaki max_allowed_packet değerini artırarak maksimum paket boyutu sınırını artırabilirsiniz. Debian'da: seçeneğini sudo nano /etc/mysql/my.cnfbelirleyin max_allowed_packet = 64M(2006 hatası giderken bu değeri düzenleyebilir / azaltabilirsiniz), ardından sudo /etc/init.d/mysql restart.

Düzenle:

MySQL seçenek dosyalarının komutlarının zaten yorum olarak mevcut olmadığına dikkat edin (örneğin php.ini dosyasında olduğu gibi). Eğer herhangi bir değişiklik / çimdik yazmalısınız Yani my.cnfya my.inive koyun mysql/datagibi seçeneklerin doğru grubu altında, dizin veya diğer yollardan herhangi birinde [client], [myslqd]vb Örneğin:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

Ardından sunucuyu yeniden başlatın. Değerlerini almak için mysql istemcisini yazın:

> select @@wait_timeout;
> select @@max_allowed_packet;

72
Benim durumumda max_allowed_packet değişkeni oldu. Varsayılan olarak 1 MB olarak ayarlandı (bunu SHOW VARIABLESMySQL sorgusunu çalıştırarak görebilirsiniz ) ve içe aktardığım dosyanın birkaç çok büyük kaydı vardı. (Windows çalışıyordum) my.ini dosyasını açtım ve değeri buna ayarladım: max_allowed_packet = 64MMySQL'i yeniden başlattım ve içe aktarmayı yeniden çalıştırdım.
Brent Matzelle

Webissues ile veritabanına büyük dosyalar yüklüyordum. Bu yardımcı oldu, teşekkürler ... :-)
inf3rno

@BrentMatzelle Bu kesinlikle "Mysql gitti" sorunu hallettim. Teşekkürler!
asprin

2
wait_timeoutÇizgi bulamıyorum
Oki Erie Rinaldi

5
pencerelerde (Xampp ile) my.ini dosyası ve innodb_lock_wait_timeout
Ananda

98

Benim için bu çözüm işe yaramadı, bu yüzden

SET GLOBAL max_allowed_packet=1073741824;

SQL istemcimde.

MYSql hizmeti çalışırken bunu değiştiremiyorsanız, hizmeti durdurmalı ve "my.ini" dosyasındaki değişkeni değiştirmelisiniz.

Örneğin:

max_allowed_packet=20M

1
Bu benim için diğer popüler cevaplar olmadığında MAMP (OS X) üzerinde çalıştı. Ama kalıcı mı?
atwixtor

2
@ atwixtor no, sunucu yeniden başlatılana kadar bu gibi değişkenleri ayarlama. ve sonra varsayılan değere sıfırlanırlar.
d.raev

1
Bu hile yaptı, Windows üzerinde bir test XAMPP makinesinde çalışmasını sağlamak için php.ini(cevapta @GBD tarafından önerildiği gibi) hem dosyayı hem de MySQL yapılandırma dosyasını my.inideğiştirmek zorunda kaldım.
Gruber

2
Mevcut boyutuSHOW variables LIKE 'max_allowed_packet'
Arth

Bu, sunucu yeniden başlatıldığında (sonunda) değerin sıfırlanacağı için kalıcı değildir , aynı zamanda yalnızca geçerli oturum için de değildir. max_allowed_packetBir istemciyi ayarlamak ve daha sonra büyük .sqldosyayı başka bir oturumda içe aktarmak iyi çalışır.
VoteyDis Policy

21

XAMPP üzerinde çalışıyorsanız, MySQL Server'ın aşağıdaki değişiklikler ile ilgili sorunu ortadan kaldırabilirsiniz.

my.ini dosyanızı açın my.ini konumunuz (D: \ xampp \ mysql \ bin \ my.ini)

aşağıdaki değişken değerlerini değiştir

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

wamp için örnek, max_allowed_packet = 64M
Andrew

19

Varsayılan değerlerle çalışıyorsanız, mysql yapılandırmanızı optimize etmek için çok fazla alanınız vardır.

Önerdiğim ilk adım max_allowed_packet'i 128M'ye yükseltmektir.

Ardından MySQL Ayarlama Primer komut dosyasını indirin ve çalıştırın. Daha iyi performans için yapılandırmanızın çeşitli yönlerine önerilerde bulunur.

Ayrıca MySQL ve PHP'de zaman aşımı değerlerinizi ayarlamaya bakın.

İçe aktardığınız dosya ne kadar büyük (dosya boyutu) ve PHPMyAdmin yerine mysql komut satırı istemcisini kullanarak dosyayı içe aktarabiliyor musunuz?


Teşekkürler, zaten 16M'ye ayarlanmış max_allowed_packet vardı, sonra bu soruyu buldum ve 32M'ye yükselttik, kesinlikle yeterli olacağını düşündüm, ancak cevabınızı gördüm ve 128M kesinlikle işe yaradı. * .Sql dosya içindeki tüm SQL deyimi sadece bir paket olarak ele alınır?
Elijah Lynn

8

OS X'te MAMP kullanıyorsanız, max_allowed_packetMySQL şablonundaki değeri değiştirmeniz gerekecektir .

  1. Bunu şurada bulabilirsiniz: Dosya> Şablonu düzenle> MySQL my.cnf

  2. Sonra sadece arayın max_allowed_packet, değeri değiştirin ve kaydedin.


6

Bu kısa /etc/mysql/my.cnf dosyası ile sorunumu çözdüm:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

1
bunun ayrıca WAMP üzerinde MySQL v5.6.12 için çalıştığını doğruladı: Windows'ta, yukarıdaki "wait_timeout" ve "max_allowed_packet" satırlarını aşağıdaki [mysqld] bölümüne ekleyin: wamp \ bin \ mysql \ mysql_version \ my.ini
dean.huczok

Teşekkürler @dan benim eski sorunumu çözdü haha, bu ayarları asla bölümün altına ekledim[mysqld]
shivgre

Bu MySQL v5.7 için çalışır. my-default.ini varsayılan olarak oluşturulmaz, bu yüzden oluşturmanız gerekir.
Rodolfo Velasco

5

Bunun olmasının bir başka nedeni de hafızanın bitmesidir. / Var / log / messages öğesini kontrol edin ve my.cnf dosyanızın mysqld'in makinenizden daha fazla bellek ayırmasına neden olacak şekilde ayarlanmadığından emin olun.

MySQL işlemi aslında çekirdek tarafından öldürülebilir ve sonra farkında olmadan "safe_mysqld" işlemi tarafından yeniden başlatılabilir.

Başınızı kullanın ve başınızın ne olduğunu görmek için çalışırken bellek ayırmayı izleyin.

değiştirmeden önce my.cnf dosyasını yedekleyin.


Benim sorunuma neden olan buydu. 1GB takas dosyası ekledim ve tamamen düzeltildi.
Pikamander2

5

16 GB SQL dosyasına aktardığımda bu hatayı ve diğer ilgili hataları yaşadım. Benim için, [mysqld] bölümünde my.ini dosyasını düzenleme ve aşağıdakileri ayarlama (birkaç farklı gönderiye göre):

max_allowed_packet      = 110M
innodb_buffer_pool_size=511M
innodb_log_file_size=500M
innodb_log_buffer_size = 800M
net_read_timeout        = 600
net_write_timeout       = 600

Windows altında çalışıyorsanız, kontrol paneline, hizmetlere gidin ve MySQL ayrıntılarına bakın ve my.ini'nin nerede olduğunu göreceksiniz. Ardından, my.ini dosyasını düzenleyip kaydettikten sonra, mysql hizmetini yeniden başlatın (veya bilgisayarı yeniden başlatın).

HeidiSQL kullanıyorsanız, bunu kullanarak bunların bir kısmını veya tümünü de ayarlayabilirsiniz.


2

"Max_allowed_packet" i 1024M olarak güncelledim, ancak hala çalışmıyor. Benim dağıtım betiğimin çalıştığı ortaya çıktı:

mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql

Bu şekilde kullanıyorsanız, komut satırından açıkça daha büyük bir sayı belirttiğinizden emin olun.


2

Verileriniz veri içeriyorsa BLOB:

Komut satırından veri içe aktarmanın BLOB verilerinde boğulma gibi göründüğüne ve 'MySQL sunucusu gitti' hatasına neden olduğuna dikkat edin.

Bundan kaçınmak için, mysqldump öğesini ancak --hex-blobbayrağıyla yeniden oluşturun :

http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_hex-blob

veri dosyasını diğer metinler arasında ikili yerine onaltılık değerlerle yazar.

PhpMyAdmin ayrıca "Onaltılık gösterimde ikili sütunları dökümü (örneğin," abc "0x616263 olur)" seçeneğine sahiptir.

Uzun süredir devam eden bir hata olduğunu unutmayın (Aralık 2015 itibariyle), GEOMsütunların dönüştürülmediği anlamına gelir : mysqldump kullanarak GEOMETRY sütunu içeren bir tablo yedeklensin mi? bu nedenle PhpMyAdmin gibi bir program kullanmak tek geçici çözüm gibi görünüyor (yukarıda belirtilen seçenek GEOM sütunlarını doğru bir şekilde dönüştürüyor).


1

Başarısız olmak uzun zaman alıyorsa, wait_timeoutdeğişkeni büyütün .

Hemen başarısız olursa, max_allowed_packetdeğişkeni büyütün ; hala çalışmıyorsa, komutun geçerli SQL olduğundan emin olun. Benim herşeyi berbat eden alıntılardan kaçmıştı.

Ayrıca, mümkünse, tek bir SQL komutunun ekleme sayısını 1000 ile sınırlamayı düşünün. INSERT ... bölümünü her n insert'i yeniden ekleyerek tek bir komuttan birden fazla ifade oluşturan bir komut dosyası oluşturabilirsiniz.


1

i benzer bir hata var .. Bu sadece açık my.ini dosyasını çözmek için ... hiçbir satırda 36 izin verilen maksimum paket boyutu yani değerini değiştirin. max_allowed_packet = 20 milyon


1

Mysqld işleminin systemd gibi hizmet yöneticileri nedeniyle yeniden başlatılmadığından emin olun.

Centos 7 ile bu sorun vardı. Konfigürasyon tweaks yardımcı olmadı. Çok fazla bellek aldığında mysqld servisini öldüren sistemd olduğu ortaya çıktı.


0

Veritabanı çoğaltırken benzer bir hata yaşadım (MySQL sunucusu gitti ...), ama mysql.server yeniden başlatmayı yeniden başlatmayı denediğimde hata aldım

ERROR! The server quit without updating PID ...

Bunu şu şekilde çözdüm: Applications / Utilities'i açtım / Activity Monitor'u çalıştırdım

 quit mysqld

sonra hata sorununu çözebildim

mysql.server restart

0

Uzun süre kalmak ve ağır veri ile mysql bağlantısı içeren bazı büyük hesaplamalar yapıyorum. Bu "Mysql git buradan sorunu" ile karşı karşıya idi. Bu yüzden t sorguları optimize çalıştı ama bana yardımcı olmadı sonra varsayılan olarak daha düşük bir değere ayarlanmış mysql değişkenler sınırını artırdı.

wait_timeout max_allowed_packet

Size uygun olanı sınırlamak için Herhangi Bir Sayı * 1024 (Bayt) olmalıdır. ' mysql -u kullanıcı adı - p ' komutunu kullanarak terminale giriş yapabilir ve bu değişken limitlerini kontrol edebilir ve değiştirebilirsiniz.


0

GoDaddy paylaşılan barındırma için

GoDaddy paylaşılan barındırma hesaplarında, PHP.ini vb dosyalarını değiştirmek zordur. Ancak, başka bir yol var ve benim için mükemmel çalıştı. (Ben başarıyla 3100 satır ve 145 cols içeren bir 3.8 Mb .sql metin dosyası yükledim. PhpMyAdmin IMPORT komutunu kullanarak, korkunç MySQL sunucusu hata gitti ve başka bilgi yok alıyordu .)

Matt Butcher'ın doğru cevabı verdiğini buldum. Matt gibi, ısırık boyutunda MySQL veritabanlarını dışa aktarmaktan, büyük ithalatı daha küçük olanlara dönüştüren komut dosyaları yazmaya kadar her türlü hileyi denedim. Ama işte işe yarayan:

(1) CPANEL ---> DOSYALAR (grup) ---> YEDEKLEME

(2a) "Kısmi Yedeklemeler" başlığı
altında ... (2b) "MySQL Veritabanı Yedeklemesi İndir"
(2c) altında Veritabanınızı seçin ve bir yedek indirin (bu adım isteğe bağlı, ancak akıllıca)

(3a) Doğrudan 2b'nin sağında, "MySQL Veritabanı Yedeklemesini Geri Yükle" başlığı altında
(3b) Yerel sürücünüzden .SQL içe aktarma dosyasını seçin
(3c) Gerçek mutluluk sizindir (kısa bir süre içinde ....) Mine aldı 5 saniye

Tek bir tablo almak için bu yöntemi kullanabildim. Veritabanımdaki hiçbir şey etkilenmedi - ancak yukarıdaki adım (2) 'ye karşı koruma amaçlanmıştır.

Notlar:
a. Bir .SQL içe aktarma dosyasının nasıl oluşturulacağından emin değilseniz, bir tabloyu dışa aktarmak ve bu dosya yapısını değiştirmek için phpMyAdmin kullanın.

KAYNAK: Matt Butcher 2010 Makalesi


Tamam, bu yüzden ani bir düşüş var, ama neden hakkında bir yorum yok. Bu bilgi birisi için işe yaramadı mı? Eğer öyleyse, lütfen paylaşın - benim için çalıştı, bu yüzden bu cevabı ekledim. Yukarıdaki diğer cevaplar benim için işe yaramadı, ama bu çözüm işe yaradı. Peki neden iniş vekili? GoDaddy üzerindeyseniz ve bu sizin için işe yaramazsa, yardımcı olabilmem için bilmek istiyorum. Eğer hosting GoDaddy kullanmıyorsanız bu geçerli değildir sırf Ancak, bunu neden cevap downvote olur sana ?
cssyphus

0

Eğer artış max_allowed_packetyardımcı olmazsa.

.sqlSequel Pro üzerinden veritabanımıza bir dosya aktarırken sizinle aynı hatayı alıyordum .

Hata hala yukarı kadar devam etti max_allowed_packet, 512Mbu yüzden bunun yerine komut satırında alma çalıştırdı:

mysql --verbose -u root -p DatabaseName < MySQL.sql

Aşağıdaki hatayı verdi:

ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled

Birkaç yararlı StackOverflow soruları buldum:

Benim durumumda, .sqldosyam biraz bozuk veya başka bir şeydi. Aldığımız MySQL dökümü, bir araya getirilmesi ve daha sonra sıkıştırılması gereken iki zip dosyasında geliyor. Ben unzipping başlangıçta bazı garip karakterler ve kodlamalar ile dosya bırakarak kesildi düşünüyorum. Taze bir MySQL dökümü almak ve unzipping benim için çalıştı.

Başkalarının max_allowed_packetdeğişkenin artmasının yardımcı olmadığını bulması durumunda bunu buraya eklemek istedim .



0

İle aynı sorunu yaşadım

$image_base64 = base64_encode(file_get_contents($_FILES['file']['tmp_name']) );
$image = 'data:image/jpeg;base64,'.$image_base64;
$query = "insert into images(image) values('".$image."')";
mysqli_query($con,$query);

Phpmyadmin \ xampp \ mysql \ bin \ my.ini dosyasında sadece

[mysqldump]
max_allowed_packet=110M

Bu sadece mysqldump -u root -p dbname içindir. Yukarıdaki kod ile değiştirerek sorunumu çözdüm

max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M
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.