ERROR 2006 (HY000): Server MySQL telah hilang

309

Saya mendapatkan kesalahan ini ketika saya mencoba untuk sumber file SQL yang besar ( INSERTpermintaan besar ).

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

Tidak ada dalam tabel yang diperbarui. Saya sudah mencoba menghapus dan menghapus tabel / database, serta me-restart MySQL. Tak satu pun dari hal-hal ini menyelesaikan masalah.

Ini ukuran maksimum paket saya:

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

Ini ukuran file:

$ ls -s file.sql 
79512 file.sql

Ketika saya mencoba metode lain ...

$ ./mysql -u root -p my_db < file.sql
Enter password: 
ERROR 2006 (HY000) at line 1: MySQL server has gone away
bgcode
sumber
2
Seberapa besar file ini? Apakah mungkin melebihi pengaturan max_allowed_packet?
Marc B
1
Ok, bukan itu. Coba tarik setiap pertanyaan dari file dan jalankan sendiri di monitor. sesuatu di sana menyebabkan crash / terputus.
Marc B
Pertanyaan yang saya tarik secara acak dari file berfungsi dengan baik. Saya membuat SQL secara terprogram, dan benar-benar lolos dari semuanya. Jadi saya tidak yakin apa yang akan menyebabkan kesalahan jika ada.
bgcode
1
Saya juga punya masalah yang sama ...
maaz

Jawaban:

561
max_allowed_packet=64M

Menambahkan baris ini ke dalam my.cnf file memecahkan masalah saya.

Ini berguna ketika kolom memiliki nilai besar, yang menyebabkan masalah, Anda dapat menemukan penjelasannya di sini .

Pada Windows file ini terletak di: "C: \ ProgramData \ MySQL \ MySQL Server 5.6"

Di Linux (Ubuntu): / etc / mysql

Kurt Zhong
sumber
3
solusi ini memecahkan masalah yang dinyatakan untuk saya; tidak ada yang bisa dilakukan melalui konfigurasi / opsi hanya sisi klien, dan saya tidak mau turun solusi terprogram melalui PHP atau lainnya.
Richard Sitze
154
Anda juga dapat masuk ke database sebagai root (atau hak istimewa SUPER) dan lakukan set global max_allowed_packet=64*1024*1024;- tidak memerlukan restart MySQL juga
dirobohkan
3
Ini memperbaikinya untuk saya. my.cnf dapat ditemukan di folder / etc.
Sam Vloeberghs
8
Anda harus dapat meletakkan ini di baris perintah, yang akan menghindari pengeditan sementara file sistem: <code> mysql --max_allowed_packet = 1GM </code>
Jan Steinman
6
Bagi siapa pun yang mencari lokasi file my.cnf, Anda dapat memeriksa jawaban ini . Juga jangan lupa untuk me-restart mysql dengan mengetik: sudo service mysql restartagar perubahan pada file my.cnf mulai berlaku.
consuela
148

Anda dapat meningkatkan Paket Max Diizinkan

SET GLOBAL max_allowed_packet=1073741824;

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

Nanhe Kumar
sumber
3
Ini bekerja untuk saya, sedangkan jawaban yang diterima tidak. Saya menduga nilai jawaban yang lebih tinggi ini adalah akar dari solusi bagi saya.
John Bubriski
Saya menetapkan max_allowed_packet = 1024M di my.cnf
Csaba Toth
1
Itu server. Anda perlu melakukannya di klien, juga, seperti "mysql --max_allowed_packet = 1073741824".
Jan Steinman
Ini berhasil untuk saya. satu pertanyaan adalah "1073741824" dalam bytes
user2478236
66

Pembaruan global dan pengaturan my.cnf tidak berfungsi untuk saya karena beberapa alasan. Memberikan max_allowed_packetnilai secara langsung ke klien berfungsi di sini:

mysql -h <hostname> -u username -p --max_allowed_packet=1073741824 <databasename> < db.sql
Mario Peshev
sumber
4
Menurut situs web MySQL, jawaban yang ditandai dan ini harus digunakan.
Zenexer
2
Jangan lupa memuat ulang file konfigurasi atau me-restart server setelah mengubah pengaturan ini
Csaba Toth
2
Perlu diingat bahwa --max_allowed_packethanya memengaruhi klien. Pertimbangkan memodifikasi server mysql (mysqld) serta dengan mengedit max_allowed_packetdi /etc/my.cnfberkas dan restart server mysql Anda.
Fleuv
Perhatikan bahwa nilai ramah manusia "50M" atau "1G" bekerja pada cli dan di my.cnf. dev.mysql.com/doc/refman/8.0/en/using-system-variables.html
txyoji
36

Secara umum kesalahan:

Kesalahan: 2006 ( CR_SERVER_GONE_ERROR) - Server MySQL telah hilang

berarti klien tidak dapat mengirim pertanyaan ke server .


mysql impor

Dalam kasus spesifik Anda saat mengimpor file database melalui mysql , ini kemungkinan besar berarti bahwa beberapa permintaan dalam file SQL terlalu besar untuk diimpor dan mereka tidak dapat dieksekusi di server, oleh karena itu klien gagal pada kesalahan yang terjadi pertama kali.

Jadi, Anda memiliki kemungkinan berikut:

  • Tambahkan opsi paksaan ( -f) untuk mysqlmelanjutkan dan menjalankan sisa kueri.

    Ini berguna jika database memiliki beberapa permintaan besar terkait dengan cache yang tidak relevan.

  • Tingkatkan max_allowed_packetdanwait_timeout dalam konfigurasi server Anda (mis ~/.my.cnf.).

  • Buang database menggunakan --skip-extended-insertopsi untuk memecah pertanyaan besar. Kemudian impor lagi.

  • Coba terapkan --max-allowed-packetopsi untuk mysql.


Alasan umum

Secara umum kesalahan ini dapat berarti beberapa hal, seperti:

  • kueri ke server salah atau terlalu besar,

    Solusi: Tingkatkan max_allowed_packetvariabel .

    • Pastikan variabel berada di bawah [mysqld]bagian, bukan [mysql].

    • Jangan takut menggunakan angka besar untuk pengujian (seperti 1G).

    • Jangan lupa untuk me-restart server MySQL / MariaDB.

    • Periksa kembali nilai yang ditetapkan dengan benar:

      mysql -sve "SELECT @@max_allowed_packet" # or:
      mysql -sve "SHOW VARIABLES LIKE 'max_allowed_packet'"
  • Anda mendapat batas waktu dari koneksi TCP / IP di sisi klien.

    Solusi: Tingkatkan wait_timeoutvariabel .

  • Anda mencoba menjalankan kueri setelah koneksi ke server ditutup.

    Solusi: Kesalahan logika dalam aplikasi harus diperbaiki.

  • Pencarian nama host gagal (misalnya masalah server DNS), atau server sudah mulai dengan --skip-networkingopsi.

    Kemungkinan lain adalah bahwa firewall Anda memblokir port MySQL (misalnya, 3306 secara default).

  • Utas yang berjalan telah terbunuh, jadi coba lagi.

  • Anda telah menemukan bug di mana server mati saat menjalankan kueri.

  • Klien yang menjalankan host yang berbeda tidak memiliki hak istimewa yang diperlukan untuk terhubung.

  • Dan masih banyak lagi, jadi pelajari lebih lanjut di: B.5.2.9 Server MySQL telah hilang .


Debugging

Berikut adalah beberapa ide debug tingkat ahli:

  • Periksa log, mis

    sudo tail -f $(mysql -Nse "SELECT @@GLOBAL.log_error")
  • Uji koneksi Anda melalui mysql, telnetatau fungsi ping (mis. mysql_pingDalam PHP).

  • Gunakan tcpdumpuntuk mengendus komunikasi MySQL (tidak akan berfungsi untuk koneksi soket), misalnya:

    sudo tcpdump -i lo0 -s 1500 -nl -w- port mysql | strings
  • Di Linux, gunakan strace. Pada BSD / Mac gunakan dtrace/ dtruss, mis

    sudo dtruss -a -fn mysqld 2>&1

    Lihat: Memulai dengan DTracing MySQL

Pelajari selengkapnya cara men-debug server atau klien MySQL di: 26.5 Debugging dan Porting MySQL .

Untuk referensi, periksa kode sumber dalam sql-common/client.cfile yang bertanggung jawab untuk melemparkan CR_SERVER_GONE_ERRORkesalahan untuk perintah klien.

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;
}
kenorb
sumber
--quick tidak bekerja untuk saya tetapi --skip-extended-insert berhasil!
chiliNUT
20

Untuk jaga-jaga, untuk memeriksa variabel yang dapat Anda gunakan

$> mysqladmin variables -u user -p 

Ini akan menampilkan variabel saat ini, dalam hal ini max_allowed_packet, dan seperti seseorang mengatakan dalam jawaban lain Anda dapat mengaturnya sementara dengan

mysql> SET GLOBAL max_allowed_packet=1072731894

Dalam kasus saya file cnf tidak diperhitungkan dan saya tidak tahu mengapa, jadi kode SET GLOBAL sangat membantu.

lesolorzanov
sumber
Luar biasa untuk dapat melihat semua pengaturan konfigurasi dalam sekali jalan. Terima kasih!
DrB
20

Saya memecahkan kesalahan ERROR 2006 (HY000) at line 97: MySQL server has gone awaydan berhasil memigrasi file> 5GB sql dengan melakukan dua langkah ini secara berurutan:

  1. Dibuat /etc/my.cnf seperti yang direkomendasikan orang lain, dengan konten berikut:

    [mysql]
    connect_timeout = 43200
    max_allowed_packet = 2048M
    net_buffer_length = 512M
    debug-info = TRUE
  2. Menambahkan bendera --force --wait --reconnectke perintah (yaitu mysql -u root -p -h localhost my_db < file.sql --verbose --force --wait --reconnect).

Catatan Penting: Itu perlu untuk melakukan kedua langkah, karena jika saya tidak repot-repot melakukan perubahan pada file /etc/my.cnf serta menambahkan flag-flag itu, beberapa tabel hilang setelah impor.

Sistem yang digunakan: OSX El Capitan 10.11.5; mysql Ver 14.14 Distrib 5.5.51 untuk osx10.8 (i386)

Luke Schoen
sumber
2
Saya mendapatkan kesalahan bahkan setelah mengikuti semua instruksi.
Santosh Hegde
Bagi mereka yang menjalankan masalah ini di host bersama dan tidak dapat mengubah file konfigurasi solusi ini bekerja dengan sangat baik.
Felipe Costa
@ SantoshHegde Mungkin sudah terlambat tetapi setelah Anda mengubah my.cnf, Anda harus memulai kembali layanan mysql Anda.
Jason Liu
11

Saya memiliki masalah yang sama tetapi mengubah max_allowed_packet di file my.ini / my.cnf di bawah [mysqld] membuat trik.

tambahkan satu baris

max_allowed_packet=500M

sekarang restart layanan MySQL setelah Anda selesai.

Sathish D
sumber
@ babonk ya tapi jawaban ini lebih berguna karena ia mengatakan di bagian apa yang harus dilewati
Jason Wheeler
11

Anda juga dapat masuk ke database sebagai root (atau hak istimewa SUPER) dan lakukan

set global max_allowed_packet=64*1024*1024;

tidak memerlukan restart MySQL juga. Perhatikan bahwa Anda harus memperbaiki my.cnffile Anda sebagaimana diuraikan dalam solusi lain:

[mysqld]
max_allowed_packet=64M

Dan konfirmasikan perubahan setelah me-restart MySQL:

show variables like 'max_allowed_packet';

Anda dapat menggunakan baris perintah juga, tetapi itu mungkin memerlukan pembaruan skrip start / stop yang mungkin tidak selamat dari pembaruan dan tambalan sistem.

Seperti yang diminta, saya menambahkan jawaban saya sendiri di sini. Senang melihatnya bekerja!

diratakan
sumber
9

Solusinya adalah meningkatkan nilai yang diberikan wait_timeoutdan connect_timeoutparameter dalam file opsi Anda, di bawah [mysqld]tag.

Saya harus memulihkan cadangan mysql 400MB dan ini berhasil untuk saya (nilai yang saya gunakan di bawah agak berlebihan, tetapi Anda mengerti maksudnya):

[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

Blokir

RGA
sumber
1
Bagus. Ini membantu saya mendapatkan kesalahan lain yang bisa saya pecahkan :)
jrosell
6

Beberapa hal bisa terjadi di sini;

  • Anda INSERTberjalan lama, dan klien terputus. Ketika terhubung kembali itu tidak memilih database, maka kesalahan. Satu opsi di sini adalah menjalankan file batch Anda dari baris perintah, dan pilih database dalam argumen, seperti itu;

$ mysql db_name <source.sql

  • Lain adalah menjalankan perintah Anda melalui phpatau bahasa lain. Setelah setiap pernyataan yang berjalan lama, Anda dapat menutup dan membuka kembali koneksi, memastikan bahwa Anda terhubung pada awal setiap permintaan.
Chris Henry
sumber
Hal lain yang layak disebutkan adalah bahwa saya mendapatkan kesalahan segera setelah sourceperintah
bgcode
Jika Anda mendapatkan kesalahan segera setelah perintah sumber, maka kemungkinan MySQL tidak menyukai sesuatu tentang kueri. Sudahkah Anda memeriksa log umum?
Chris Henry
Saya harus mencari cara untuk memeriksa log umum .. Saya di MAMP dan saya tidak yakin itu menulis secara default.
bgcode
Saya memilih untuk menyelesaikannya dengan query PHP dan mengirisnya.
bgcode
5

Jika Anda menggunakan Mac dan menginstal mysql melalui minuman seperti saya, berikut ini berfungsi.

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

Sumber: Untuk pemasangan mysql homebrew, di mana my.cnf?

  1. tambahkan max_allowed_packet=1073741824ke/usr/local/etc/my.cnf

  2. mysql.server restart

Rahul
sumber
2

Saya mengalami kesalahan ini ketika saya menggunakan Mysql Cluster, saya tidak tahu pertanyaan ini dari penggunaan cluster atau tidak. Karena kesalahannya persis sama, maka berikan solusi saya di sini. Mendapatkan kesalahan ini karena node data tiba-tiba macet. Tetapi ketika node crash, Anda masih bisa mendapatkan hasil yang benar menggunakan cmd:

ndb_mgm -e 'ALL REPORT MEMORYUSAGE'

Dan mysqld juga berfungsi dengan benar. Jadi pada awalnya, saya tidak bisa mengerti apa yang salah. Dan sekitar 5 menit kemudian, hasil ndb_mgm tidak menunjukkan node data berfungsi. Lalu saya menyadari masalahnya. Jadi, cobalah untuk me-restart semua node data, maka server mysql kembali dan semuanya OK.

Tapi satu hal yang aneh bagi saya, setelah saya kehilangan server mysql untuk beberapa pertanyaan, ketika saya menggunakan cmd suka show tables, saya masih bisa mendapatkan info pengembalian seperti 33 rows in set (5.57 sec), tetapi tidak ada info tabel yang ditampilkan.

zhihong
sumber
1

Untuk amazon RDS (ini kasus saya), Anda dapat mengubah nilai max_allowed_packetparameter ke nilai numerik dalam byte yang masuk akal untuk data terbesar dalam setiap insert yang mungkin Anda miliki (misalnya: jika Anda memiliki beberapa nilai gumpalan 50mb di insert Anda, atur max_allowed_packetke 64M = 67108864), dalam yang baru atau yang sudah ada parameter-group. Kemudian terapkan grup-parameter itu ke instance MySQL Anda (mungkin perlu me-reboot instance itu).

SebaGra
sumber
Jika Anda bekerja dengan Amazon RDS ini berfungsi. Anda tidak dapat menetapkan nilai global dalam RDS seperti yang ditunjukkan SebaGra, jika Anda pergi dan memodifikasi grup parameter khusus DB Anda, cari max_allowed_packet parameterdan atur ke ukuran yang sesuai (atau jika Anda memiliki gumpalan besar, atur ke nilai maks 1073741824 ) itu harus bekerja.
G_Style
Apakah Anda mendapatkan kegagalan yang konsisten saat memuat dataset yang sama atau sepenuhnya acak? bertanya karena saya memiliki masalah yang sama tetapi sepenuhnya acak, akan gagal 5 kali dan kemudian bekerja pada tanggal 5. Juga, pindah ke mesin lokal saya dan menjalankan dari studio visual tampaknya membantu tetapi saya masih akan mengalami kesalahan sesekali.
BilliD
0

Jika menghubungkan kembali dan mendapatkan ID koneksi 2, server hampir pasti baru saja macet.

Hubungi admin server dan minta mereka untuk mendiagnosis masalahnya. Tidak ada SQL yang tidak berbahaya yang dapat menyebabkan crash server, dan output dari mysqldump tentu tidak seharusnya.

Mungkin itu terjadi bahwa admin server telah membuat beberapa kesalahan operasional besar seperti menetapkan ukuran buffer lebih besar dari batas ruang alamat arsitektur, atau lebih dari kapasitas memori virtual. Log kesalahan MySQL mungkin akan memiliki beberapa informasi yang relevan; mereka akan memantau ini jika mereka kompeten.

MarkR
sumber
0

Ini lebih merupakan masalah yang jarang terjadi tetapi saya telah melihat ini jika seseorang telah menyalin seluruh direktori / var / lib / mysql sebagai cara untuk memigrasi DB mereka ke server lain. Alasan tidak berfungsi adalah karena database sedang berjalan dan menggunakan file log. Kadang tidak berfungsi jika ada log di / var / log / mysql. Solusinya adalah menyalin file / var / log / mysql juga.

Areeb Soo Yasir
sumber
0

Untuk pengguna Drupal 8 mencari solusi untuk kegagalan impor DB:

Pada akhir file dump sql ada perintah dapat memasukkan data ke tabel "webprofiler". Itu saya kira beberapa file log debug dan tidak terlalu penting bagi situs untuk bekerja sehingga semua ini dapat dihapus. Saya menghapus semua sisipan tersebut termasuk LOCK TABLES dan UNLOCK TABLES (dan semuanya di antaranya). Ini di bagian paling bawah dari file sql. Masalahnya dijelaskan di sini:

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

Tetapi tidak ada solusi untuk itu selain memotong meja itu.

BTW saya mencoba semua solusi dari jawaban di atas dan tidak ada yang membantu.

MilanG
sumber
0

Saya sudah mencoba semua solusi di atas, semuanya gagal.

Saya berakhir dengan menggunakan -h 127.0.0.1alih-alih menggunakan default var/run/mysqld/mysqld.sock.

osexp2003
sumber
0

Pesan kesalahan ini juga terjadi ketika Anda membuat SCHEMA dengan COLLATION berbeda dari yang digunakan dalam dump. Jadi, jika dump berisi

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

Anda juga harus merefleksikannya dalam susunan SCHEMA:

CREATE SCHEMA myschema COLLATE utf8_unicode_ci;

Saya telah menggunakan utf8mb4_general_ci dalam skema, karena skrip saya berasal dari instalasi V8 baru, sekarang memuat DB pada 5.7 yang lama crash dan membuat saya hampir gila.

Jadi, mungkin ini membantu Anda menghemat waktu yang menyebalkan ... :-)

(MacOS 10.3, mysql 5.7)

4 sel otak
sumber
-1

jika tidak ada jawaban yang menyelesaikan masalah Anda, saya menyelesaikannya dengan menghapus tabel dan membuatnya lagi secara otomatis dengan cara ini:

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

kemudian gunakan saja cadangan ini dengan db Anda dan itu akan menghapus dan membuat ulang tabel yang Anda butuhkan.

Kemudian Anda hanya mencadangkan data, dan melakukan hal yang sama, dan itu akan berhasil.

El Abogato
sumber
-3

Bagaimana kalau menggunakan klien mysql seperti ini:

mysql -h <hostname> -u username -p <databasename> < file.sql
ErJab
sumber
Ini tidak akan berfungsi jika file sql terlalu besar ... itulah pertanyaannya.
lesolorzanov