HATA 2006 (HY000): MySQL sunucusu kullanımdan kaldırıldı


309

Ben büyük bir SQL dosyası (büyük bir INSERTsorgu) kaynak çalıştığınızda bu hatayı alıyorum .

mysql>  source file.sql
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    2
Current database: *** NONE ***

ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: *** NONE ***

Tablodaki hiçbir şey güncellenmiyor. MySQL'i yeniden başlatmanın yanı sıra tablo / veritabanını silmeyi ve silmeyi denedim. Bunların hiçbiri sorunu çözmüyor.

İşte benim maksimum paket boyutum:

+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+

İşte dosya boyutu:

$ ls -s file.sql 
79512 file.sql

Diğer yöntemi denediğimde ...

$ ./mysql -u root -p my_db < file.sql
Enter password: 
ERROR 2006 (HY000) at line 1: MySQL server has gone away

2
Bu ne kadar büyük bir dosya? Muhtemelen max_allowed_packet ayarını aşıyor mu?
Marc B

1
Tamam, o değil. Tek tek sorguları dosyadan çıkarmayı ve bunları monitörde çalıştırmayı deneyin. orada bir şey çökmeye / bağlantısının kesilmesine neden oluyor.
Marc B

Ben rastgele dosyadan çekin sorguları iyi çalışır. SQL programlı olarak oluşturulan ve her şey düzgün kaçtı. Bu yüzden, varsa hataya ne sebep olacağından emin değilim.
bgcode

1
Benim de aynı sorunum var ...
maaz

Yanıtlar:


561
max_allowed_packet=64M

Bu satırı my.cnfdosyaya eklemek sorunumu çözer.

Bu, sütunlara neden olan büyük değerlere sahip olduğunda yararlıdır, açıklamayı burada bulabilirsiniz .

Windows'da bu dosya şu konumda bulunur: "C: \ ProgramData \ MySQL \ MySQL Server 5.6"

Linux'ta (Ubuntu): / etc / mysql


3
bu çözüm benim için belirtilen sorunu çözdü; hiçbir şey sadece istemci tarafı yapılandırma / seçenekleri ile yapılabilir ve ben PHP veya başka bir programatik bir çözüm aşağı gitmek istekli değildi.
Richard Sitze

154
Ayrıca veritabanına root (veya SUPER ayrıcalığı) olarak giriş yapabilir ve aynı zamanda set global max_allowed_packet=64*1024*1024;MySQL yeniden başlatma gerektirmez
13'te

3
Bu benim için düzeltildi. my.cnf / etc klasöründe bulunabilir.
Sam Vloeberghs

8
Bunu, bir sistem dosyasını geçici olarak düzenlemekten kaçınacak olan komut satırına koyabilmeniz gerekir: <code> mysql --max_allowed_packet = 1GM </code>
Jan Steinman

6
My.cnf dosyasının yerini arayan herkes için bu yanıtı kontrol edebilirsiniz . Ayrıca sudo service mysql restart, my.cnf dosyasındaki değişikliklerin etkili olması için mysql yazarak yeniden başlatmayı unutmayın .
consuela

148

İzin Verilen Maksimum Paketi artırabilirsiniz

SET GLOBAL max_allowed_packet=1073741824;

http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet


3
Bu benim için çalıştı, kabul edilen cevap olmadı. Bu cevabın daha yüksek değerinin benim için çözümün kökü olduğunu tahmin ediyorum.
John Bubriski

My.cnf dosyasında max_allowed_packet = 1024M ayarladım
Csaba Toth

1
Sunucu bunu yapar. Bunu istemcide de yapmanız gerekir, örneğin "mysql --max_allowed_packet = 1073741824".
Jan Steinman

Bu benim için çalıştı. bir soru bayt içinde "1073741824"
user2478236

66

Genel güncelleştirme ve my.cnf ayarları bir nedenden dolayı benim için çalışmadı. Geçme max_allowed_packetmüşteriye doğrudan değerini burada çalıştı:

mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql

4
MySQL web sitesine göre, hem işaretli cevap hem de bu kullanılmalıdır.
Zenexer

2
Bu ayarları değiştirdikten sonra yapılandırma dosyalarını yeniden yüklemeyi veya sunucuyu yeniden başlatmayı unutmayın
Csaba Toth

2
--max_allowed_packetYalnızca istemciyi etkiler unutmayın . Dosyada düzenleme max_allowed_packetyaparak /etc/my.cnfve mysql sunucunuzu yeniden başlatarak da mysql sunucusunu (mysqld) değiştirmeyi düşünün .
Fleuv

"50M" veya "1G" nin insan dostu değerlerinin cli ve my.cnf dosyasında çalıştığını unutmayın. dev.mysql.com/doc/refman/8.0/en/using-system-variables.html
txyoji

36

Genel olarak hata:

Hata: 2006 ( CR_SERVER_GONE_ERROR) - MySQL sunucusu kullanımdan kaldırıldı

istemcinin sunucuya soru gönderemediği anlamına gelir .


mysql ithalat

Özel durumunuzda veritabanı dosyasını üzerinden alırken mysql, bu büyük olasılıkla SQL dosyasındaki sorguların bazılarının içe aktarılamayacak kadar büyük olduğu ve sunucuda yürütülemediği anlamına gelir, bu nedenle istemci ilk oluşan hatada başarısız olur.

Yani aşağıdaki olasılıklara sahipsiniz:

  • İçin kuvvet ekle seçeneği ( -f)mysqlDevam etmek ve sorguların geri kalanını yürütmek .

    Veritabanının önbellekle ilgili zaten önemli olmayan bazı büyük sorguları varsa yararlıdır.

  • Artırın max_allowed_packetvewait_timeout sunucu yapılandırmanızda (örn. ~/.my.cnf).

  • --skip-extended-insertBüyük sorguları yıkmak için seçeneği kullanarak veritabanını boşaltın. Sonra tekrar içe aktarın.

  • İçin --max-allowed-packetseçenek uygulamayı deneyin mysql.


Ortak nedenler

Genel olarak bu hata aşağıdakiler gibi birkaç anlama gelebilir:

  • sunucuya yapılan bir sorgu yanlış veya çok büyük,

    Çözüm: Değişkeni artırınmax_allowed_packet .

    • Değişkenin [mysqld]bölüm altında olduğundan emin olun [mysql].

    • Test için büyük sayılar kullanmaktan korkmayın (gibi 1G).

    • MySQL / MariaDB sunucusunu yeniden başlatmayı unutmayın.

    • Değerin doğru ayarlandığını iki kez kontrol edin:

      mysql -sve "SELECT @@max_allowed_packet" # or:
      mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
  • İstemci tarafındaki TCP / IP bağlantısından bir zaman aşımı var.

    Çözüm: Değişkeni artırınwait_timeout .

  • Sunucu bağlantısı kapatıldıktan sonra bir sorgu çalıştırmayı denediniz.

    Çözüm: Uygulamadaki bir mantık hatası düzeltilmelidir.

  • Ana bilgisayar adı aramaları başarısız oldu (örn. DNS sunucusu sorunu) veya sunucu ile başlatıldı --skip-networking seçenek .

    Başka bir olasılık da güvenlik duvarınızın MySQL portunu engellemesidir (örneğin varsayılan olarak 3306).

  • Çalışan iplik öldü, tekrar deneyin.

  • Sorguyu yürütürken sunucunun öldüğü bir hatayla karşılaştınız.

  • Farklı bir ana bilgisayarda çalışan bir istemcinin bağlanmak için gerekli ayrıcalıkları yoktur.

  • Ve daha pek çoğu, daha fazla bilgi için: B.5.2.9 MySQL sunucusu yok oldu .


Hata ayıklama

İşte uzman düzeyinde birkaç hata ayıklama fikri:

  • Günlükleri kontrol edin, örn.

    sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
  • Senin aracılığıyla bağlantıyı test mysql, telnetveya ping fonksiyonları (örn mysql_pingPHP'de).

  • tcpdumpMySQL iletişimini koklamak için kullanın (soket bağlantısı için çalışmaz), örneğin:

    sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
  • Linux'ta kullanın strace. BSD / Mac kullanımda dtrace/ dtruss, örneğin

    sudo dtruss -a -fn mysqld 2>&1

    Bkz: DTracing MySQL ile çalışmaya başlama

MySQL sunucusunda veya istemcide hata ayıklama hakkında daha fazla bilgi için: 26.5 MySQL Hata Ayıklama ve Taşıma .

Başvuru için, istemci komutunun hatalarını sql-common/client.catmaktan sorumlu dosyadaki kaynak kodunu kontrol edin CR_SERVER_GONE_ERROR.

MYSQL_TRACE(SEND_COMMAND, mysql, (command, header_length, arg_length, header, arg));
if (net_write_command(net,(uchar) command, header, header_length,
          arg, arg_length))
{
  set_mysql_error(mysql, CR_SERVER_GONE_ERROR, unknown_sqlstate);
  goto end;
}

--quick benim için çalışmadı ama --skip-expand-insert işe yaradı!
chiliNUT

20

Her ihtimale karşı, değişkenleri kontrol etmek için kullanabilirsiniz

$> mysqladmin variables -u user -p 

Bu, mevcut değişkenleri görüntüler, bu durumda max_allowed_packet ve başka bir cevapta birinin söylediği gibi, geçici olarak

mysql> SET GLOBAL max_allowed_packet=1072731894

Benim durumumda cnf dosyası dikkate alınmadı ve neden bilmiyorum, bu yüzden SET GLOBAL kodu gerçekten yardımcı oldu.


Tüm yapılandırma ayarlarını tek seferde görebilmek harika. Teşekkürler!
DrB

20

Hatayı ERROR 2006 (HY000) at line 97: MySQL server has gone awayçözdüm ve aşağıdaki iki adımı sırayla uygulayarak> 5GB sql dosyasını başarıyla taşıdım:

  1. Diğerlerinin önerdiği gibi /etc/my.cnf, aşağıdaki içeriklerle oluşturuldu:

    [mysql]
    connect_timeout = 43200
    max_allowed_packet = 2048M
    net_buffer_length = 512M
    debug-info = TRUE
  2. Bayrakları --force --wait --reconnectkomuta ekleme (yani mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect).

Önemli Not: Her iki adımı da uygulamak gerekiyordu, çünkü /etc/my.cnf dosyasında değişiklik yapma ve bu bayrakları eklemeyi zahmet etmediysem, içe aktarmadan sonra bazı tablolar eksikti.

Kullanılan sistem: OSX El Capitan 10.11.5; mysql Ver 14.14 osx10.8 (i386) için 5.5.51 dağıtın


2
Tüm talimatları uyguladıktan sonra bile hatayı alıyorum.
Santosh Hegde

Paylaşılan bir ana bilgisayarda bu sorunu çalıştıranlar için bir yapılandırma dosyasını değiştiremezsiniz bu çözüm çok iyi çalışır.
Felipe Costa

@SantoshHegde Çok geç olabilir, ancak değiştirdikten sonra my.cnfmysql hizmetinizi yeniden başlatmanız gerekir.
Jason Liu

11

Ben de aynı sorun vardı ama [mysqld] altında my.ini / my.cnf dosyasında max_allowed_packet değiştirmek hile yaptı.

satır ekle

max_allowed_packet=500M

işiniz bittiğinde MySQL hizmetini yeniden başlatın.


@babonk evet ama bu cevap daha kullanışlıdır çünkü hangi bölüme gitmesi gerektiğini söylüyor
Jason Wheeler

11

Ayrıca veritabanına root (veya SUPER ayrıcalığı) olarak giriş yapabilir ve

set global max_allowed_packet=64*1024*1024;

MySQL yeniden başlatmayı da gerektirmez. my.cnfDosyanızı diğer çözümlerde belirtildiği gibi düzeltmeniz gerektiğini unutmayın :

[mysqld]
max_allowed_packet=64M

Ve MySQL'i yeniden başlattıktan sonra değişikliği onaylayın:

show variables like 'max_allowed_packet';

Komut satırını da kullanabilirsiniz, ancak bu, sistem güncelleştirmelerinde ve düzeltme eklerinden sağ çıkamayan başlatma / durdurma komut dosyalarının güncelleştirilmesini gerektirebilir.

İstendiği gibi buraya kendi cevabımı ekliyorum. Çalıştığını görmek sevindim!


9

Çözüm, etiketinizde seçenekler dosyanızda verilen değerleri wait_timeoutve connect_timeoutparametreleri arttırmaktır [mysqld].

Ben 400MB mysql yedek kurtarmak zorunda kaldı ve bu benim için çalıştı (aşağıda kullandığım değerler biraz abartılı, ama nokta olsun):

[mysqld]
port=3306
explicit_defaults_for_timestamp = TRUE
connect_timeout = 1000000
net_write_timeout = 1000000
wait_timeout = 1000000
max_allowed_packet = 1024M
interactive_timeout = 1000000
net_buffer_length = 200M
net_read_timeout = 1000000
set GLOBAL delayed_insert_timeout=100000

blockquote


1
Harika. Bu benim :) çözebilir başka hata alıyorum bana yardımcı olur
jrosell

6

Burada birkaç şey olabilir;

  • Sizin INSERTuzun sürüyor ve istemcinizin bağlantısı kesiliyor. Yeniden bağlandığında bir veritabanı seçmez, dolayısıyla hata. Buradaki bir seçenek, toplu iş dosyanızı komut satırından çalıştırmak ve bağımsız değişkenlerdeki veritabanını seçmek;

$ mysql db_name <kaynak.sql

  • Bir diğeri, komutunuzu phpveya başka bir dilde çalıştırmaktır. Uzun süren her deyimden sonra, her bir sorgunun başında bağlandığınızdan emin olarak bağlantıyı kapatabilir ve yeniden açabilirsiniz.

Bahsetmeye değer başka bir şey, sourcekomuttan hemen sonra hatayı
almam

Kaynak komutundan hemen sonra hatayı alırsanız, muhtemelen MySQL sorgu hakkında bir şey sevmez. Genel günlüğü kontrol ettiniz mi?
Chris Henry

Genel günlük kontrol etmek nasıl anlamaya var .. MAMP Im ve varsayılan olarak yazdığından emin değilim.
bgcode

Ben sadece PHP sorgulama ve dilimleme ile çözmek için seçti.
bgcode

5

Mac kullanıyorsanız ve mysql'i benim gibi demlemek yoluyla yüklediyseniz, aşağıdakiler işe yaradı.

  1. cp $(brew --prefix mysql)/support-files/my-default.cnf /usr/local/etc/my.cnf

Kaynak: Homebrew mysql kurulumları için my.cnf nerede?

  1. eklemek max_allowed_packet=1073741824için/usr/local/etc/my.cnf

  2. mysql.server restart


2

Mysql kümesini kullandığımda bu hatayla karşılaştım, bu sorunun küme kullanımından olup olmadığını bilmiyorum. Hata tamamen aynı olduğundan, burada çözümümü ver. Veri düğümleri aniden çöktüğü için bu hatayı alıyorum. Ancak düğümler çöktüğünde, cmd'yi kullanarak yine de doğru sonucu alabilirsiniz:

ndb_mgm -e 'ALL REPORT MEMORYUSAGE'

Ve mysqld da düzgün çalışıyor.Bu yüzden ilk önce neyin yanlış olduğunu anlayamıyorum. Ve yaklaşık 5 dakika sonra, ndb_mgm sonucu hiçbir veri düğümü çalışmıyor. Sonra problemin farkındayım. Bu nedenle, tüm veri düğümlerini yeniden başlatmayı deneyin, ardından mysql sunucusu geri döndü ve her şey yolunda.

Ama bir şey benim için garip, bazı sorgular için mysql sunucusunu kaybettikten sonra, cmd gibi kullandığımda show tables, hala gibi dönüş bilgilerini alabilirim 33 rows in set (5.57 sec), ancak tablo bilgisi görüntülenmez.


1

Amazon RDS için (benim durumum), max_allowed_packetparametre değerini, sahip olabileceğiniz herhangi bir ekteki en büyük veriler için anlamlı olan bayt cinsinden herhangi bir sayısal değerle değiştirebilirsiniz (örneğin: ekinizde 50mb blob değerleriniz varsa, max_allowed_packet64M = 67108864), yeni veya mevcut parameter-group. Ardından bu parametre grubunu MySQL örneğinize uygulayın (örneğin yeniden başlatılması gerekebilir).


Amazon RDS ile çalışıyorsanız bu işe yarar. RDS'de, SebaGra'nın belirttiği gibi global değerleri ayarlayamazsınız, DB'nizin özel parametre grubunu giderseniz ve değiştirirseniz, max_allowed_packet parameteronu bulun ve uygun boyuta ayarlayın (veya gerçekten büyük lekeleriniz varsa, maksimum değeri 1073741824 olarak ayarlayın) ) İşe yaramalı.
G_Style

Aynı veri kümesini veya tamamen rastgele yüklerken tutarlı bir hata mı aldınız? çünkü ben aynı sorunu var ama tamamen rastgele, sormak 5 kez başarısız olacak ve daha sonra 5 üzerinde çalışacaktır. Ayrıca, yerel makineme gitmek ve görsel stüdyodan koşmak yardımcı gibi görünüyor, ancak arada bir hatayla karşılaşacağım.
BilliD

0

Yeniden bağlanıyor ve bağlantı kimliği 2 alınıyorsa, sunucu neredeyse kesinlikle çöktü.

Sunucu yöneticisine başvurun ve sorunu teşhis etmelerini sağlayın. Kötü amaçlı olmayan hiçbir SQL sunucuyu çökmemelidir ve mysqldump çıktısı kesinlikle olmamalıdır.

Muhtemelen sunucu yöneticisinin, mimarinin adres alanı sınırlarından daha büyük veya sanal bellek kapasitesinden daha fazla arabellek boyutu atama gibi bazı büyük operasyonel hatalar yapmış olması muhtemeldir. MySQL hata günlüğü muhtemelen bazı ilgili bilgilere sahip olacaktır; yine de yetkin olmaları halinde bunu izleyeceklerdir.


0

Bu daha nadir görülen bir sorundur, ancak eğer birisi DB'sini başka bir sunucuya geçirmenin bir yolu olarak tüm / var / lib / mysql dizinini kopyaladıysa bunu gördüm. Çalışmamasının nedeni, veritabanının günlük dosyalarını çalıştırması ve kullanmasıdır. / Var / log / mysql dosyasında günlükler varsa bazen çalışmaz. Çözüm / var / log / mysql dosyalarını da kopyalamaktır.


0

DB içe aktarma hatası için çözüm arayan Drupal 8 kullanıcıları için:

Sql dökümü dosyasının sonunda "webprofiler" tablosuna veri ekleme komutları olabilir. Bu bazı hata ayıklama günlük dosyası sanırım ve tüm bu kaldırılabilir böylece sitenin çalışması için gerçekten önemli değildir. LOCK TABLES ve UNLOCK TABLES (ve aralarındaki her şey) dahil tüm bu ekleri sildim. Sql dosyasının en altında. Sorun burada açıklanmaktadır:

https://www.drupal.org/project/devel/issues/2723437

Ancak bu tabloyu kesmenin yanı sıra bunun için bir çözüm yok.

BTW Yukarıdaki yanıtlardan tüm çözümleri denedim ve başka hiçbir şey yardımcı olmadı.


0

Yukarıdaki çözümlerin hepsini denedim, hepsi başarısız oldu.

Ben -h 127.0.0.1varsayılan kullanmak yerine kullanarak sona erdi var/run/mysqld/mysqld.sock.


0

Bu hata iletisi, SCHEMA'yı, dökümde kullanılandan farklı bir COLLATION ile oluşturduğunuzda da oluşur. Damper içeriyorsa

CREATE TABLE `mytab` (
..
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

bunu SCHEMA harmanlamasına da yansıtmalısınız:

CREATE SCHEMA myschema COLLATE utf8_unicode_ci;

Şemada utf8mb4_general_ci kullanıyordum, komut dosyamın yeni bir V8 kurulumundan gelmesine neden oldum, şimdi eski 5.7'de bir DB yükleniyor çöktü ve beni neredeyse çıldırdı.

Yani, belki bu biraz frustating saat tasarrufu yardımcı olur ... :-)

(MacOS 10.3, MySQL 5.7)


-1

Bu cevapların hiçbiri sorunu çözmezse, tabloları kaldırarak ve bunları otomatik olarak bu şekilde tekrar oluşturarak çözdüm:

when creating the backup, first backup structure and be sure of add:
DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT
CREATE PROCEDURE / FUNCTION / EVENT
IF NOT EXISTS
AUTO_INCREMENT

o zaman db ile bu yedeklemeyi kullanın ve ihtiyacınız olan tabloları kaldıracak ve yeniden oluşturacaktır.

Sonra sadece veri yedekleme ve aynı şeyi yapmak, ve işe yarayacak.


-3

Mysql istemcisini şu şekilde kullanmaya ne dersiniz:

mysql -h <hostname> -u username -p <databasename> < file.sql

Sql dosyası si çok büyük ise bu alışkanlık ... soru hakkında ne olduğunu.
lesolorzanov
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.