Kesalahan MySQL 2006: server mysql telah hilang

238

Saya menjalankan server di kantor saya untuk memproses beberapa file dan melaporkan hasilnya ke server MySQL jarak jauh.

Pemrosesan file membutuhkan waktu dan prosesnya setengah jalan dengan kesalahan berikut:

2006, MySQL server has gone away

Saya pernah mendengar tentang pengaturan MySQL, wait_timeout , tetapi apakah saya perlu mengubahnya di server di kantor saya atau di server MySQL yang jauh?

floatleft
sumber
2
itu tergantung dari server penyihir yang memberikan kesalahan
bksi
2
kemungkinan duplikat ERROR 2006 (HY000): Server MySQL telah hilang
Simon East
11
Untuk orang yang datang ke sini dari Google: Jika mengubah max_allowed_packetukuran atau wait_timeoutjumlah tidak memperbaikinya, periksa penggunaan memori Anda. Saya mendapatkan kesalahan yang sama dan itu disebabkan oleh server saya kehabisan memori. Saya menambahkan file swap 1GB dan memperbaikinya.
Pikamander2
2
@ Pikamander2 terima kasih atas petunjuknya!
ihsan
4
Oh! Jadi itu semua bohong? Server Mysql sebenarnya tidak pergi ke mana pun? Masih ada di server saya? Whao! :))
Damilola Olowookere

Jawaban:

32

Mungkin lebih mudah untuk memeriksa apakah koneksi dan membangun kembali jika diperlukan.

Lihat PHP: mysqli_ping untuk info tentang itu.

Niet the Dark Absol
sumber
Poin bagusnya, jika Anda memiliki proses yang terputus-putus maka lebih baik untuk melepaskan koneksi Anda sehingga Anda tidak menggunakan semua koneksi. Membangun kembali koneksi umumnya murah. +1
Yzmir Ramirez
1
pada tahun 2018: mysqli_ping dihilangkan
fb
@ fb apa yang digunakan untuk melakukan itu dengan PDO?
beppe9000
359

Saya telah menemukan ini beberapa kali dan saya biasanya menemukan jawabannya adalah pengaturan standar yang sangat rendah max_allowed_packet.

Meningkatkannya di /etc/my.cnf(bawah [mysqld]) ke 8 atau 16M biasanya memperbaikinya. (Default di MySql 5.7 adalah 4194304, yaitu 4MB.)

[mysqld]
max_allowed_packet=16M

Catatan: Cukup buat garis jika tidak ada

Catatan: Ini dapat diatur pada server Anda saat sedang berjalan.

Gunakan set global max_allowed_packet=104857600. Ini mengaturnya ke 100MB.

George
sumber
28
Perhatikan bahwa ini dapat diatur pada server Anda saat sedang berjalan. Gunakan: "atur global max_allowed_packet = 104857600". CATATAN: Nilai saya set ke 100MB.
rickumali
26
Untuk pengguna xampp, my.cnf dapat ditemukan di: C: \ xampp \ mysql \ bin \
Valentin Despa
3
pada WAMP: C: \ wamp \ bin \ mysql \ mysql5.6.12 \ my.ini, atur max_allowed_packet = 500M di bawah [wampmysqld]
Elia Weiss
2
Memperbaiki masalah saya tooo :)
Altaf Hussain
2
Catatan Penting: Saya harus me-restart server mysql saya agar efek ini berlaku. yaitu mysql.server stop, mysql.server start(Oktober 2018, MySQL v5.7, MacOS)
Nitin Nain
41

Saya memiliki masalah yang sama tetapi max_allowed_packetmengubah my.ini/my.cnffile di bawah [mysqld]membuat trik.

tambahkan satu baris

max_allowed_packet = 500M

sekarang restart the MySQL servicesetelah Anda selesai.

Sathish D
sumber
5
Orang lain menulis 16 juta, Anda menulis 500 juta, apa pentingnya pengaturan ini?
pal4life
1
@ pal4life Ini adalah ukuran maksimal dari pernyataan penyisipan yang diizinkan. Bagaimana jika pernyataan penyisipan Anda lebih dari 16M (Jika pernyataan itu terdiri dari kolom longblob atau lebih) Agar lebih aman, buatlah besar seperti 500M jika Anda memasukkan data dalam jumlah besar.
Sathish D
Ini bekerja untuk saya tetapi saya tidak tahu mengapa. Nilai default adalah 1M tetapi ketika saya mengubahnya ke 100M kesalahan hilang. Masalahnya dimulai ketika saya menetapkan wait_timeout = 30 dalam upaya untuk mengurangi jumlah utas menganggur di server saya.
Vincent
36

Saya menggunakan perintah berikut dalam baris perintah MySQL untuk mengembalikan database MySQL yang ukurannya lebih dari 7GB, dan berfungsi.

set global max_allowed_packet=268435456;
Geshan Ravindu
sumber
bertanya-tanya mengapa ini diturunkan? masuk akal untuk kesalahan terkait dengan ukuran paket ...
FlorinelChis
Ini menyelesaikan masalah saya, itu tidak terkait dengan pertanyaan secara langsung tetapi harus membantu orang yang memiliki masalah lain ini.
Migerusantte
Untuk memeriksa apakah berubah atau melihat nilai saat ini yang dapat digunakanshow variables like 'max_allowed_packet';
Marcin
16

Kesalahan: 2006 ( CR_SERVER_GONE_ERROR )

Pesan: Server MySQL telah hilang

Secara umum Anda dapat mencoba lagi menghubungkan dan kemudian melakukan kueri lagi untuk menyelesaikan masalah ini - coba 3-4 kali sebelum benar-benar menyerah.

Saya akan menganggap Anda menggunakan PDO. Jika demikian maka Anda akan menangkap Pengecualian PDO, menambah penghitung dan kemudian mencoba lagi jika penghitung berada di bawah ambang batas.

Jika Anda memiliki kueri yang menyebabkan batas waktu, Anda dapat mengatur variabel ini dengan menjalankan:

SET @@GLOBAL.wait_timeout=300;
SET @@LOCAL.wait_timeout=300;  -- OR current session only

Di mana 300 adalah jumlah detik yang Anda pikir waktu maksimum kueri bisa.

Informasi lebih lanjut tentang cara menangani masalah koneksi Mysql.

Sunting: Dua pengaturan lain yang mungkin ingin Anda gunakan adalah net_write_timeoutdan net_read_timeout.

Yzmir Ramirez
sumber
16

Dalam MAMP (versi non-pro) saya menambahkan

--max_allowed_packet=268435456

untuk ...\MAMP\bin\startMysql.sh

Kredit dan detail lainnya di sini

kamu
sumber
Terima kasih banyak untuk ini!
TechyDude
Bekerja! Terima kasih!
Simon Franzen
11

Kesalahan ini terjadi karena kedaluwarsa wait_timeout.

Buka saja server mysql, periksa wait_timeout-nya:

mysql> TAMPILKAN VARIABEL SEPERTI 'wait_timeout'

mysql> set global wait_timeout = 600 # 10 menit atau waktu tunggu maksimum yang Anda butuhkan

http://sggoyal.blogspot.in/2015/01/2006-mysql-server-has-gone-away.html

Saurabh Goyal
sumber
Saya tidak mengerti mengapa ada orang yang memilih jawaban ini ?! Sangat membantu saya.
Basil Musa
11

Ada beberapa penyebab kesalahan ini.

Terkait MySQL / MariaDB:

  • wait_timeout - Waktu dalam detik ketika server menunggu koneksi menjadi aktif sebelum menutupnya.
  • interactive_timeout - Waktu dalam detik ketika server menunggu koneksi interaktif.
  • max_allowed_packet- Ukuran maksimum dalam byte paket atau string yang dihasilkan / perantara. Ditetapkan sebesar BLOB terbesar, dalam kelipatan 1024.

Contoh my.cnf :

[mysqld]
# 8 hours
wait_timeout = 28800
# 8 hours
interactive_timeout = 28800
max_allowed_packet = 256M

Terkait server:

  • Server Anda memiliki memori penuh - periksa info tentang RAM dengan free -h

Kerangka terkait:

  • Periksa pengaturan kerangka kerja Anda. Django misalnya digunakan CONN_MAX_AGE(lihat dokumen )

Cara men-debug-nya:

  • Periksa nilai variabel MySQL / MariaDB.
    • dengan sql: SHOW VARIABLES LIKE '%time%';
    • garis komando: mysqladmin variables
  • Aktifkan verbosity untuk kesalahan:
    • MariaDB: log_warnings = 4
    • MySQL: log_error_verbosity = 3
  • Periksa dokumen untuk info lebih lanjut tentang kesalahan
jozo
sumber
9

Pada windows orang-orang yang menggunakan xampp harus menggunakan jalur ini xampp / mysql / bin / my.ini dan mengubah max_allowed_packet (di bagian [mysqld]) ke ukuran pilihan Anda. misalnya

max_allowed_packet=8M

Lagi di php.ini (xampp / php / php.ini) ubah upload_max_filesize ukuran pilihan. misalnya

upload_max_filesize=8M

Beri aku sakit kepala selama beberapa waktu sampai saya menemukan ini. Semoga ini bisa membantu.

Kenneth mwangi
sumber
ini harus menjadi jawaban yang dipilih
bysanchy
Saya tidak dapat menemukan upload_max_filesizevariabel. Itu selalu tidak dikenali dalam mysql saya
Aminah Nuraini
9

Saya mendapatkan kesalahan yang sama di server DigitalOcean Ubuntu saya.

Saya mencoba mengubah pengaturan max_allowed_packet dan wait_timeout tetapi tidak satupun dari mereka memperbaikinya.

Ternyata server saya kehabisan RAM. Saya menambahkan file swap 1GB dan itu memperbaiki masalah saya.

Periksa memori Anda dengan free -huntuk melihat apakah itu yang menyebabkannya.

Pikamander2
sumber
1
Terima kasih banyak! Saya memiliki masalah yang sama pada DigitalOcean saya dan solusi ini berhasil! Saya menjalankan banyak contoh skrip saya tetapi setelah beberapa utas tiba-tiba berhenti dan membunuh semua koneksi yang ada. Sekarang semuanya baik-baik saja.
Stalinko
7

Itu masalah RAM bagi saya.

Saya mengalami masalah yang sama bahkan pada server dengan 12 core CPU dan 32 GB RAM. Saya meneliti lebih lanjut dan mencoba membebaskan RAM. Ini adalah perintah yang saya gunakan di Ubuntu 14.04 untuk membebaskan RAM:

sync && echo 3 | sudo tee /proc/sys/vm/drop_caches

Dan, itu memperbaiki segalanya. Saya telah mengaturnya di bawah cron untuk dijalankan setiap jam.

crontab -e

0 * * * * bash /root/ram.sh;

Dan, Anda dapat menggunakan perintah ini untuk memeriksa berapa banyak RAM gratis yang tersedia:

free -h

Dan, Anda akan mendapatkan sesuatu seperti ini:

             total       used       free     shared    buffers     cached
Mem:           31G        12G        18G        59M       1.9G       973M
-/+ buffers/cache:       9.9G        21G
Swap:         8.0G       368M       7.6G
Rehmat
sumber
5

Dalam kasus saya itu adalah nilai open_files_limitvariabel yang rendah , yang memblokir akses mysqld ke file data.

Saya memeriksanya dengan:

mysql> SHOW VARIABLES LIKE 'open%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 1185  |
+------------------+-------+
1 row in set (0.00 sec)

Setelah saya mengubah variabel menjadi nilai besar, server kami hidup kembali:

[mysqld]
open_files_limit = 100000
Fedir RYKHTIK
sumber
5

Jika Anda menggunakan WAMPSERVER 64Bit, silakan cari beberapa kemunculan max_allowed_packet karena WAMP menggunakan nilai yang ditetapkan di [wampmysqld64] dan bukan nilai yang ditetapkan di [mysqldump], yang bagi saya masalahnya, saya sedang memperbarui yang salah. Setel ini menjadi sesuatu seperti max_allowed_packet = 64M.

Semoga ini membantu pengguna Wampserver lain di luar sana.

Enomatix24
sumber
5

Ini umumnya menunjukkan masalah konektivitas server MySQL atau batas waktu. Secara umum dapat diselesaikan dengan mengubah wait_timeout dan max_allowed_packet di my.cnf atau yang serupa.

Saya akan menyarankan nilai-nilai ini:

wait_timeout = 28800

max_allowed_packet = 8M

Memo
sumber
4

Untuk Kotak Vagrant, pastikan Anda mengalokasikan cukup memori ke kotak

config.vm.provider "virtualbox" do |vb|
  vb.memory = "4096"
end
Shadoweb
sumber
1
Terima kasih untuk ini :)
SynackSA
4

Skenario yang tidak mungkin adalah Anda memiliki firewall antara klien dan server yang memaksa TCP reset ke koneksi.

Saya punya masalah itu, dan saya menemukan firewall F5 perusahaan kami dikonfigurasi untuk mengakhiri sesi tidak aktif yang menganggur selama lebih dari 5 menit.

Sekali lagi, ini adalah skenario yang tidak mungkin.

Ahmed
sumber
4

Itu selalu merupakan ide yang baik untuk memeriksa log dari server Mysql, untuk alasan mengapa itu hilang.

Itu akan memberitahumu.

Alex
sumber
4

Jika Anda menggunakan server xampp:

Pergi ke xampp -> mysql -> bin -> my.ini

Ubah parameter di bawah ini:

max_allowed_packet = 500M

innodb_log_file_size = 128M

Ini sangat membantu saya :)

Archana Kamath
sumber
3

batalkan komentar ligne di bawah ini di Anda my.ini/my.cnf, ini akan membagi file besar Anda menjadi bagian yang lebih kecil

# binary logging format - mixed recommended
# binlog_format=mixed

UNTUK

# binary logging format - mixed recommended
binlog_format=mixed
Nico
sumber
3

Saya menemukan solusi untuk "# 2006 - server MySQL telah hilang" kesalahan ini. Solusinya hanya Anda harus memeriksa dua file

  1. config.inc.php
  2. config.sample.inc.php

Path dari file-file ini di windows adalah

C:\wamp64\apps\phpmyadmin4.6.4

Dalam dua file ini nilai dari ini:

$cfg['Servers'][$i]['host']must be 'localhost' .

Dalam kasus saya itu adalah:

$cfg['Servers'][$i]['host'] = '127.0.0.1';

ubah ke:

"$cfg['Servers'][$i]['host']" = 'localhost';

Pastikan keduanya:

  1. config.inc.php
  2. file config.sample.inc.php harus berupa 'localhost'.

Dan set terakhir:

$cfg['Servers'][$i]['AllowNoPassword'] = true;

Kemudian restart Wampserver.


Untuk mengubah nama pengguna dan kata sandi phpmyadmin

Anda dapat secara langsung mengubah nama pengguna dan kata sandi phpmyadmin melalui file config.inc.php

Dua baris ini

$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '';

Di sini Anda dapat memberikan nama pengguna dan kata sandi baru. Setelah perubahan simpan file dan restart server WAMP.

um hidup
sumber
2

Saya mendapat pesan Error 2006 di berbagai perangkat lunak klien MySQL di desktop Ubuntu saya. Ternyata versi driver JDBC saya terlalu tua.

Bo Guo
sumber
2

Ini mungkin masalah ukuran file .sql Anda.

Jika Anda menggunakan xampp. Buka panel kontrol xampp -> Klik MySql config -> Buka my.ini.

Tambah ukuran paket.

max_allowed_packet = 2M -> 10M
Nikunj Dhimar
sumber
2

Ada cara yang lebih mudah jika Anda menggunakan XAMPP. Buka panel kontrol XAMPP, dan klik tombol config di bagian mysql.
masukkan deskripsi gambar di sini

Sekarang klik pada my.ini dan itu akan terbuka di editor. Perbarui paket max_allowed_packet ke ukuran yang Anda inginkan.

masukkan deskripsi gambar di sini

Kemudian restart layanan mysql. Klik berhenti pada layanan Mysql klik mulai lagi. Tunggu beberapa menit. masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Kemudian coba jalankan permintaan Mysql Anda lagi. Semoga ini berhasil.

Hriju
sumber
2

MAMP 5.3, Anda tidak akan menemukan my.cnf dan menambahkannya tidak berfungsi karena max_allowed_packet disimpan dalam variabel.

Salah satu solusinya adalah:

  1. Buka http: // localhost / phpmyadmin
  2. Buka tab SQL
  3. Jalankan SHOW VARIABEL dan periksa nilainya, jika kecil maka jalankan dengan nilai besar
  4. Jalankan kueri berikut ini, atur max_allowed_packet ke 7gb:

    atur global max_allowed_packet = 268435456;

Untuk beberapa, Anda mungkin perlu meningkatkan nilai-nilai berikut juga:

set global wait_timeout = 600;
set innodb_log_file_size =268435456;
Rupak Nepal
sumber
0

Untuk pengguna yang menggunakan XAMPP, ada 2 parameter max_allowed_packet di C: \ xampp \ mysql \ bin \ my.ini.

Subhash
sumber
0

Kesalahan ini pada dasarnya terjadi karena dua alasan.

  1. RAM Anda terlalu rendah.
  2. Koneksi basis data ditutup ketika Anda mencoba untuk terhubung.

Anda dapat mencoba kode ini di bawah ini.

# Simplification to execute an SQL string of getting a data from the database
def get(self, sql_string, sql_vars=(), debug_sql=0):
    try:            
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()
    except (AttributeError, MySQLdb.OperationalError):
        self.__init__()
        self.cursor.execute(sql_string, sql_vars)
        return self.cursor.fetchall()

Ini mengurangi kesalahan apa pun alasan di baliknya, terutama karena alasan kedua.

Jika itu disebabkan oleh RAM yang rendah, Anda harus meningkatkan efisiensi koneksi basis data dari kode, dari konfigurasi basis data, atau hanya menaikkan RAM.

Aminah Nuraini
sumber
0

Kalau-kalau ini membantu siapa pun:

Saya mendapatkan kesalahan ini ketika saya membuka dan menutup koneksi dalam suatu fungsi yang akan dipanggil dari beberapa bagian aplikasi. Kami memiliki terlalu banyak koneksi sehingga kami pikir mungkin ide yang baik untuk menggunakan kembali koneksi yang ada atau membuangnya dan membuat yang baru seperti:

  public static function getConnection($database, $host, $user, $password)
 {
 if (!self::$instance) {
  return self::newConnection($database, $host, $user, $password);
 } elseif ($database . $host . $user != self::$connectionDetails) {

self :: $ instance-> query ('KILL CONNECTION_ID ()'); self :: $ instance = null; return self :: newConnection ($ database, $ host, $ user, $ password); } return self :: $ instance; } Yah ternyata kita sudah agak terlalu teliti dengan pembunuhan dan karenanya proses melakukan hal-hal penting pada koneksi lama tidak pernah bisa menyelesaikan bisnis mereka. Jadi kami menghilangkan garis-garis ini

  self::$instance->query('KILL CONNECTION_ID()');
  self::$instance = null;

dan karena perangkat keras dan pengaturan mesin memungkinkan, kami menambah jumlah koneksi yang diizinkan pada server dengan menambahkan

max_connections = 500

ke file konfigurasi kami. Ini memperbaiki masalah kami untuk saat ini dan kami belajar sesuatu tentang membunuh koneksi mysql.

Maks
sumber
-5

Jika Anda tahu akan offline untuk sementara waktu, Anda dapat menutup koneksi, melakukan pemrosesan, menyambung kembali, dan menulis laporan.

Joshua Martell
sumber
2
Ini sebenarnya jawaban yang layak, karena MySQL menutup koneksi idle setelah delapan jam.
Bojan Hrnkas