Server MySQL telah hilang ketika mengimpor file sql besar

259

Saya mencoba mengimpor file sql besar melalui phpMyAdmin ... Tetapi tetap menunjukkan kesalahan

'Server MySQL telah pergi'

Apa yang harus dilakukan?

FrancisMV123
sumber
3
Apa nilai Anda untuk max_allowed_packet dan wait_timeout?
daemonofchaos
1
Anda dapat mencoba menggandakan max_allowed_packet. Agak kasar, tetapi jika berhasil, Anda dapat menemukan nilai waras.
Nanne
1
Terima kasih atas tawa Cole Johnson. Itu luar biasa! LOL! :)
mbrinson
Saya sering melihatnya, secara kebetulan. Tetapi saya tidak dapat mereproduksi kesalahan yang sama lagi. Dan, karenanya menyadari bahwa itu mungkin dinamis. Terkadang, jika klien mengirim terlalu banyak SQL ke server (mis. Dari satu loop), ini bisa terjadi. Menemukan alasan sebenarnya untuk kesalahan ini penting. Periksa log kueri Anda untuk mengulangi pola SQL juga untuk mengetahui petunjuknya.
Bimal Poudel
kadang-kadang Anda mendapatkan ini ketika ruang disk Anda rendah
pramodtech

Jawaban:

376

Seperti yang dinyatakan di sini :

Dua alasan paling umum (dan perbaikan) untuk server MySQL telah hilang (kesalahan 2006) adalah:

Server kehabisan waktu dan menutup koneksi. Bagaimana cara memperbaiki:

  1. periksa variabel wait_timeout di file konfigurasi my.cnf mysqld Anda cukup besar. Pada Debian:, sudo nano /etc/mysql/my.cnfsetel wait_timeout = 600detik (Anda dapat mengubah / mengurangi nilai ini saat galat 2006 hilang), lalu sudo /etc/init.d/mysql restart. Saya tidak memeriksa, tetapi nilai default untuk wait_timeout mungkin sekitar 28800 detik (8 jam).

  2. Server menjatuhkan paket yang salah atau terlalu besar. Jika mysqld mendapatkan paket yang terlalu besar atau salah, itu mengasumsikan ada sesuatu yang salah dengan klien dan menutup koneksi. Anda dapat meningkatkan batas ukuran paket maksimal dengan meningkatkan nilai max_allowed_packet dalam file my.cnf. Pada Debian:, sudo nano /etc/mysql/my.cnfatur max_allowed_packet = 64M(Anda dapat mengubah / mengurangi nilai ini saat galat 2006 hilang), lalu sudo /etc/init.d/mysql restart.

Edit:

Perhatikan bahwa file opsi MySQL tidak memiliki perintah mereka sudah tersedia sebagai komentar (seperti di php.ini misalnya). Jadi Anda harus mengetikkan perubahan / Tweak di my.cnfatau my.inidan menempatkan mereka dalam mysql/datadirektori atau di salah satu jalan lain, di bawah kelompok yang tepat pilihan seperti [client], [myslqd], dll Sebagai contoh:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

Kemudian restart server. Untuk mendapatkan nilainya, ketikkan klien mysql:

> select @@wait_timeout;
> select @@max_allowed_packet;
GBD
sumber
72
Dalam kasus saya itu adalah variabel max_allowed_packet . Itu diatur ke default 1 MB (Anda dapat melihat ini dengan menjalankan SHOW VARIABLESquery MySQL) dan file yang saya impor memiliki beberapa catatan yang sangat besar. Saya membuka file my.ini (saya menjalankan Windows) dan mengatur nilainya menjadi ini max_allowed_packet = 64M:, me-restart MySQL dan menjalankan kembali impor.
Brent Matzelle
Saya mengunggah file besar ke database dengan masalah web. Ini membantu, terima kasih ... :-)
inf3rno
@BrentMatzelle Itu tentu saja mengatasi masalah "Mysql telah pergi". Terima kasih!
asprin
2
Saya tidak dapat menemukan wait_timeoutgaris
Oki Erie Rinaldi
5
dalam hal windows (dengan Xampp) itu adalah file my.ini dan innodb_lock_wait_timeout
Ananda
98

Bagi saya solusi ini tidak berhasil, jadi saya mengeksekusi

SET GLOBAL max_allowed_packet=1073741824;

di klien SQL saya.

Jika tidak dapat mengubah ini dengan layanan MYSql berjalan, Anda harus menghentikan layanan dan mengubah variabel dalam file "my.ini".

Sebagai contoh:

max_allowed_packet=20M
salsinga
sumber
1
Ini bekerja untuk saya di MAMP (OS X) ketika jawaban yang lebih populer lainnya tidak. Tetapi apakah ini permanen?
atwixtor
2
@ atwixtor no, pengaturan variabel seperti ini berfungsi hingga server dimulai ulang. dan kemudian mereka diatur ulang ke nilai default.
d.raev
1
Itu berhasil, pada mesin uji XAMPP pada Windows saya harus memodifikasi php.inifile (seperti yang disarankan oleh @GBD dalam jawabannya) dan file konfigurasi MySQL my.iniuntuk membuatnya berfungsi.
Gruber
2
Saya sarankan menambahkan bahwa Anda dapat memeriksa ukuran saat ini denganSHOW variables LIKE 'max_allowed_packet'
Arth
Ini tidak permanen karena nilai akan diatur ulang ketika server restart (akhirnya), tetapi juga tidak hanya untuk sesi saat ini. Pengaturan max_allowed_packetdalam satu klien dan kemudian mengimpor .sqlfile besar di sesi lain akan berfungsi dengan baik.
VoteyDisciple
21

Jika Anda bekerja pada XAMPP maka Anda dapat memperbaiki Server MySQL telah pergi masalah dengan perubahan berikut ..

buka file my.ini Anda lokasi my.ini adalah (D: \ xampp \ mysql \ bin \ my.ini)

ubah nilai variabel berikut

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500
Mohan Gathala
sumber
samp untuk wamp, max_allowed_packet = 64M
Andrew
19

Jika Anda menjalankan dengan nilai default maka Anda memiliki banyak ruang untuk mengoptimalkan konfigurasi mysql Anda.

Langkah pertama yang saya rekomendasikan adalah meningkatkan max_allowed_packet menjadi 128 juta.

Kemudian unduh skrip MySQL Tuning Primer dan jalankan. Ini akan memberikan rekomendasi ke beberapa sisi konfigurasi Anda untuk kinerja yang lebih baik.

Lihat juga menyesuaikan nilai batas waktu Anda baik di MySQL dan PHP.

Seberapa besar (ukuran file) file yang Anda impor dan apakah Anda dapat mengimpor file menggunakan klien baris perintah mysql alih-alih PHPMyAdmin?

daemonofchaos
sumber
Terima kasih, saya sudah menetapkan max_allowed_packet ke 16M, kemudian menemukan pertanyaan ini dan menaikkannya ke 32 juta berpikir itu pasti akan cukup tetapi kemudian melihat jawaban Anda dan 128M pasti bekerja. Saya mengumpulkan bahwa seluruh pernyataan SQL di dalam file * .sql diperlakukan sebagai hanya satu paket?
Elijah Lynn
8

Jika Anda menggunakan MAMP pada OS X, Anda harus mengubah max_allowed_packetnilai dalam templat untuk MySQL.

  1. Anda dapat menemukannya di: File> Edit template> MySQL my.cnf

  2. Kemudian cari saja max_allowed_packet, ubah nilainya dan simpan.

askthebigo
sumber
6

Saya memecahkan masalah saya dengan file /etc/mysql/my.cnf singkat ini:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M
Dan.faudemer
sumber
1
mengonfirmasi ini juga berfungsi untuk MySQL v5.6.12 di WAMP: pada Windows, tambahkan baris "wait_timeout" dan "max_allowed_packet" di atas ke bagian [mysqld] pada: wamp \ bin \ mysql \ mysql_version \ my.ini
dean.huczok
Terima kasih @dan memecahkan masalah saya tahun lalu haha, saya tidak pernah menambahkan pengaturan tersebut di bawah bagian[mysqld]
shivgre
Ini berfungsi untuk MySQL v5.7. my-default.ini tidak dibuat secara default sehingga Anda harus membuatnya.
Rodolfo Velasco
5

Alasan lain ini bisa terjadi adalah kehabisan memori. Periksa / var / log / pesan dan pastikan bahwa my.cnf Anda tidak diatur untuk menyebabkan mysqld mengalokasikan lebih banyak memori daripada yang dimiliki mesin Anda.

Proses mysqld Anda sebenarnya dapat dibunuh oleh kernel dan kemudian dimulai kembali oleh proses "safe_mysqld" tanpa Anda menyadarinya.

Gunakan top dan perhatikan alokasi memori saat sedang berjalan untuk melihat apa ruang kepala Anda.

buat cadangan my.cnf sebelum mengubahnya.

TekOps
sumber
Inilah yang menyebabkan masalah saya. Saya menambahkan file swap 1GB dan itu benar-benar memperbaikinya.
Pikamander2
5

Saya mengalami kesalahan ini dan yang terkait lainnya, ketika saya mengimpor file SQL 16 GB. Bagi saya, mengedit my.ini dan mengatur yang berikut (berdasarkan beberapa posting berbeda) di bagian [mysqld]:

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

Jika Anda menjalankan Windows, buka panel kontrol, layanan, dan lihat detail untuk MySQL dan Anda akan melihat di mana my.ini berada. Kemudian setelah Anda mengedit dan menyimpan my.ini, restart layanan mysql (atau nyalakan kembali komputer).

Jika Anda menggunakan HeidiSQL, Anda juga dapat mengatur beberapa atau semua menggunakan itu.

BenV136
sumber
2

Saya memperbarui "max_allowed_packet" ke 1024M, tetapi masih tidak berfungsi. Ternyata skrip penerapan saya sedang berjalan:

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

Pastikan untuk secara eksplisit menentukan angka yang lebih besar dari baris perintah jika Anda melakukannya dengan cara ini.

coderama
sumber
2

Jika data Anda termasuk BLOB data:

Perhatikan bahwa impor data dari baris perintah tampaknya tersedak pada data BLOB, mengakibatkan kesalahan 'MySQL server telah hilang'.

Untuk menghindari ini, buat ulang mysqldump tetapi dengan --hex-blob bender:

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

yang akan menulis file data dengan nilai hex daripada biner di antara teks lainnya.

PhpMyAdmin juga memiliki opsi "Dump binary kolom dalam notasi heksadesimal (misalnya," abc "menjadi 0x616263)" yang berfungsi dengan baik.

Perhatikan bahwa ada bug lama (per Desember 2015) yang berarti GEOMkolom tidak dikonversi: Cadangkan tabel dengan kolom GEOMETRI menggunakan mysqldump? jadi menggunakan program seperti PhpMyAdmin tampaknya menjadi satu-satunya solusi (opsi yang disebutkan di atas tidak benar mengkonversi kolom GEOM).

fooquency
sumber
1

Jika butuh waktu lama untuk gagal, maka perbesar wait_timeout variabelnya.

Jika gagal segera, perbesar max_allowed_packetvariabel; itu masih tidak berfungsi, pastikan perintah itu SQL yang valid. Milik saya memiliki kutipan yang tidak terhapus yang mengacaukan semuanya.

Juga, jika memungkinkan, pertimbangkan membatasi jumlah menyisipkan perintah SQL tunggal untuk, katakanlah, 1000. Anda dapat membuat skrip yang membuat beberapa pernyataan dari satu dengan memunculkan kembali bagian INSERT ... setiap n sisipan.

e18r
sumber
1

saya mendapat kesalahan yang sama .. untuk menyelesaikan ini buka saja file my.ini..di sini pada baris no 36 ubah nilai ukuran paket maksimum yang diijinkan yaitu. max_allowed_packet = 20M

parag jain
sumber
1

Pastikan proses mysqld tidak restart karena manajer layanan seperti systemd.

Saya punya masalah ini dalam gelandangan dengan centos 7. Konfigurasi tweak tidak membantu. Ternyata itu adalah systemd yang membunuh layanan mysqld setiap kali ketika mengambil terlalu banyak memori.

tvorog
sumber
0

Saya memiliki kesalahan yang sama hari ini ketika menduplikasi database (server MySQL telah hilang ...), tetapi ketika saya mencoba untuk me-restart mysql.server me-restart saya mendapat kesalahan

ERROR! The server quit without updating PID ...

Inilah cara saya menyelesaikannya: Saya membuka Aplikasi / Utilitas / dan menjalankan Activity Monitor

 quit mysqld

kemudian bisa menyelesaikan masalah kesalahan dengan

mysql.server restart
Kingsley Ijomah
sumber
0

Saya melakukan beberapa perhitungan besar yang melibatkan koneksi mysql agar tetap lama dan dengan data yang banyak. saya menghadapi "masalah pergi Mysql" ini. Jadi saya mencoba t mengoptimalkan query tetapi itu tidak membantu saya maka saya meningkatkan batas variabel mysql yang ditetapkan ke nilai yang lebih rendah secara default.

wait_timeout max_allowed_packet

Untuk membatasi apa yang cocok untuk Anda, itu harus menjadi Nomor Any * 1024 (Bytes). Anda dapat masuk ke terminal menggunakan perintah ' mysql -u username - p ' dan dapat memeriksa dan mengubah batas variabel ini.

Ashish Dev swami
sumber
0

Untuk hosting bersama GoDaddy

Pada akun hosting bersama GoDaddy, sulit untuk mengubah file PHP.ini dll. Namun, ada cara lain dan itu berfungsi dengan baik untuk saya. (Saya baru saja berhasil mengunggah file teks .sql 3,8Mb, berisi 3100 baris dan 145 cols. Menggunakan perintah IMPORT di phpMyAdmin, saya mendapatkan server MySQL yang ditakuti telah hilang. kesalahan, dan tidak ada informasi lebih lanjut.)

Saya menemukan bahwa Matt Butcher memiliki jawaban yang tepat. Seperti Matt, saya telah mencoba segala macam trik, dari mengekspor basis data MySQL dalam ukuran kecil, hingga menulis skrip yang memecah impor besar menjadi lebih kecil. Tapi inilah yang berhasil:

(1) CPANEL ---> FILES (grup) ---> CADANGAN

(2a) Di bawah judul
"Cadangan Sebagian" ... (2b) Di bawah "Unduh Cadangan Database MySQL"
(2c) Pilih basis data Anda dan unduh cadangan (langkah ini opsional, tetapi bijak)

(3a) Langsung ke kanan 2b, di bawah judul "Kembalikan Cadangan Database MySQL"
(3b) Pilih file impor .SQL dari drive lokal Anda
(3c) Kebahagiaan sejati akan menjadi milik Anda (segera ....) Saya butuh waktu sekitar 5 detik

Saya dapat menggunakan metode ini untuk mengimpor satu tabel. Tidak ada hal lain dalam basis data saya yang terpengaruh - tetapi itulah yang harus dilindungi (langkah 2) di atas.

Catatan:
a. Jika Anda tidak yakin cara membuat file impor .SQL, gunakan phpMyAdmin untuk mengekspor tabel dan memodifikasi struktur file itu.

SUMBER: Artikel Matt Butcher 2010

cssyphus
sumber
Oke, jadi downvote langsung, tapi tidak ada komentar mengapa. Apakah info ini tidak berfungsi untuk seseorang? Jika demikian, silakan bagikan - itu berhasil untuk saya, itulah sebabnya saya menambahkan jawaban ini. Jawaban lain di atas tidak bekerja untuk saya, tetapi solusi ini berhasil. Jadi mengapa downvote? Jika Anda menggunakan GoDaddy dan ini tidak berfungsi untuk Anda, saya ingin tahu agar saya dapat membantu. Namun, jika Anda tidak menggunakan hosting yang dibagikan GoDaddy, mengapa Anda akan menurunkan jawaban ini hanya karena tidak berlaku untuk Anda ?
cssyphus
0

Jika peningkatan max_allowed_packettidak membantu.

Saya mendapatkan kesalahan yang sama seperti Anda ketika mengimpor .sqlfile ke database saya melalui Sequel Pro.

Kesalahan masih berlanjut setelah menaikkan max_allowed_packetke 512Mjadi saya menjalankan impor di baris perintah sebagai gantinya dengan:

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

Itu memberi kesalahan berikut:

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

Saya menemukan beberapa pertanyaan StackOverflow yang membantu:

Dalam kasus saya, .sqlfile saya sedikit korup atau semacamnya. Dump MySQL yang kita dapatkan datang dalam dua file zip yang harus digabung bersama dan kemudian dibuka ritsletingnya. Saya pikir unzipping awalnya terganggu, meninggalkan file dengan beberapa karakter aneh dan penyandian. Mendapatkan dump MySQL baru dan membuka ritsletingnya dengan benar bekerja untuk saya.

Hanya ingin menambahkan ini di sini kalau-kalau orang lain yang meningkatkan max_allowed_packet variabel tidak membantu.

Joshua Pinter
sumber
0

Saya punya masalah yang sama dengan

$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);

Dalam file \ xampp \ mysql \ bin \ my.ini dari phpmyadmin kita hanya dapatkan

[mysqldump]
max_allowed_packet=110M

yang hanya untuk mysqldump -u root -p dbname. Saya menyelesaikan masalah saya dengan mengganti kode di atas dengan

max_allowed_packet=110M
[mysqldump]
max_allowed_packet=110M
Amir Khan
sumber