Server MySQL telah hilang menghambat impor dump besar

14

Saya mencoba untuk mengimpor dump sql besar (2GB) ke mysql lokal saya di mac saya. Saya sudah bisa melakukan ini di masa lalu (saya menggunakan MAMP), tetapi sekarang saya mendapatkan ERROR 2006 (HY000) di baris 7758: Server MySQL telah hilang setiap kali saya mencoba mengimpor dump. Basis data berisi tabel innodb.

Saya mencoba menyalin file my-innodb-heavy-4G.cnf ke my.cnf saya untuk melihat apakah pengaturan itu akan membantu, tetapi tidak berhasil.

Ada ide tentang apa yang harus diubah?

Saya menggunakan "Mac OS X ver. 10.6 (x86, 64-bit), DMG Archive" dari sini: http://dev.mysql.com/downloads/mysql/

naxoc
sumber

Jawaban:

15

Salah satu pembunuh diam-diam dari Koneksi MySQL adalah Paket MySQL. Bahkan utas I / O Replikasi MySQL dapat menjadi korban dari ini.

Menurut Dokumentasi MySQL

  • Anda juga bisa mendapatkan kesalahan ini jika Anda mengirim permintaan ke server yang salah atau terlalu besar. Jika mysqld menerima paket yang terlalu besar atau rusak, diasumsikan ada sesuatu yang salah dengan klien dan menutup koneksi. Jika Anda membutuhkan kueri besar (misalnya, jika Anda bekerja dengan kolom BLOB besar), Anda dapat meningkatkan batas kueri dengan mengatur variabel max_allowed_packet server, yang memiliki nilai default 1MB. Anda juga mungkin perlu menambah ukuran paket maksimum di sisi klien. Informasi lebih lanjut tentang pengaturan ukuran paket diberikan dalam Bagian C.5.2.10, "Paket terlalu besar".

  • Pernyataan INSERT atau REPLACE yang menyisipkan banyak baris juga dapat menyebabkan kesalahan semacam ini. Salah satu dari pernyataan ini mengirimkan satu permintaan ke server terlepas dari jumlah baris yang akan dimasukkan; dengan demikian, Anda sering dapat menghindari kesalahan dengan mengurangi jumlah baris yang dikirim per INSERT atau REPLACE.

Paling tidak, Anda harus memastikan ukuran paket untuk mesin yang Anda gunakan dan mesin yang Anda muat sama.

Mungkin ada dua (2) pendekatan yang dapat Anda ambil:

PENDEKATAN # 1: Lakukan mysqldump menggunakan --skip-extended-insert

Ini akan memastikan Paket MySQL tidak dibanjiri dengan banyak BLOB, bidang TEKS. Dengan cara itu SQL INSERT dilakukan satu per satu. Kelemahan utama adalah

  1. mysqldump jauh lebih besar
  2. memuat ulang dump seperti itu membutuhkan waktu lebih lama.

PENDEKATAN # 2: Tingkatkan max_allowed_packet

Ini mungkin pendekatan yang disukai karena menerapkan ini hanya me-restart mysql. Memahami apa itu Paket MySQL dapat menjelaskan hal ini.

Menurut halaman 99 dari "Memahami MySQL Internal" (ISBN 0-596-00957-7) , berikut adalah paragraf 1-3 yang menjelaskannya:

Kode komunikasi jaringan MySQL ditulis dengan asumsi bahwa permintaan selalu cukup pendek, dan karena itu dapat dikirim ke dan diproses oleh server dalam satu potongan, yang disebut paket dalam terminologi MySQL. Server mengalokasikan memori untuk buffer sementara untuk menyimpan paket, dan meminta cukup untuk sepenuhnya cocok. Arsitektur ini memerlukan tindakan pencegahan untuk menghindari server kehabisan memori --- batas pada ukuran paket, yang dicapai opsi ini.

Kode yang terkait dengan opsi ini ditemukan di sql / net_serv.cc . Lihatlah my_net_read () , lalu ikuti panggilan ke my_real_read () dan perhatikan net_realloc () .

Variabel ini juga membatasi panjang hasil dari banyak fungsi string. Lihat sql / field.cc dan sql / intem_strfunc.cc untuk detailnya.

Dengan penjelasan ini, membuat INSERT massal akan memuat / membongkar Paket MySQL dengan lebih cepat. Ini terutama benar ketika max_allowed_packet terlalu kecil untuk memuat data yang diberikan padanya.

KESIMPULAN

Pada sebagian besar pemasangan MySQL, saya biasanya mengatur ini ke 256M atau 512M. Anda harus mengalami dengan nilai yang lebih besar ketika data memuat kesalahan "MySQL telah hilang".

RolandoMySQLDBA
sumber
Saya mencoba mengatur max_allowed_packetke 900M dan saya menggunakan --skip-extended-insert(dan Anda benar - yang membuat huuuge db-dumps), tetapi masih gagal. Saya mencurigai garis tertentu di dump sekarang saya mungkin bisa bekerja di sekitar. Tapi itu masih aneh - dump bisa diimpor dengan baik di server CentOS saya.
naxoc
Saya akhirnya menghapus insert dari sql dump yang sangat, sangat panjang. Itu memperbaikinya (dan saluran tidak diperlukan).
naxoc
BTW pastikan karakter default untuk dump data dapat didukung di Sistem Operasi MacOSX dan di MySQL.
RolandoMySQLDBA
@naxov - Saya hanya ingin tahu tentang satu baris yang Anda curigai di dump. Adakah bidang TEKS atau Gumpalan yang terlibat ???
RolandoMySQLDBA
Ya bidang teks yang sangat panjang.
naxoc
2

Berapa lama ini berjalan sebelum waktu habis? Langkah pertama akan bertaruh untuk memeriksa wait_timeoutdan interactive_timeoutpengaturan untuk memastikan mereka cukup besar untuk impor Anda:

SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;

Standarnya adalah 8 jam (28.800), jadi itu mungkin bukan masalahnya. Indikasi lain dari masalah ini dapat ditemukan di sini . Salah satu yang menonjol adalah ini:

Aplikasi klien yang berjalan pada host yang berbeda tidak memiliki hak istimewa yang diperlukan untuk terhubung ke server MySQL dari host itu.

Verifikasi izin terlebih dahulu, tetapi kemudian pergi melalui daftar masalah potensial.

Derek Downey
sumber
Semuanya ada di localhost, jadi saya tidak mengerti apa yang Anda maksudkan atau itu bukan masalahnya. Apakah maksud Anda izin seperti dalam hak istimewa di mysql?
naxoc
2

Ya biasanya bermain dengan wait_timeout dan max_allowed_packets memungkinkan saya untuk mengatasi pesan kesalahan juga.

p4guru
sumber
Itu tidak berhasil untuk saya. Saya harus mengedit sql di file dump dan menghapus garis yang sangat panjang yang menyebabkan masalah.
naxoc
seseorang seharusnya tidak bermain dengan beberapa parameter yang tidak dia mengerti
Jeredepp
2

Ini mungkin bukan hal yang "benar" untuk dilakukan, tetapi mungkin berhasil (selesaikan, kan?):

Cobalah memecah dump besar Anda menjadi beberapa file dan menjalankannya satu per satu secara berurutan. Pendekatan saya adalah memecahnya menjadi dua dan menguji. Kemudian hancurkan masing-masing setengah, uji ulang, dan sebagainya.

Saya agak ingin tahu apakah jumlah RAM yang Anda miliki di komputer Anda mungkin ada hubungannya dengan ini. Apakah MySQL memuat seluruh dump ke memori ketika akan menjalankannya? Saya tidak tahu ... tetapi jika Anda hanya memiliki 2GB RAM dan beberapa sedang digunakan menjalankan OS Anda dan aplikasi lain, maka ini mungkin masalahnya.

Hari Davis Waterbury
sumber
2

Mereka yang belum berhasil dengan saran lain mungkin mempertimbangkan untuk melihat PHP BigDump yang terhuyung-huyung sebagai script importir dump MySQL .

Ini solusi untuk mengimpor dump database besar ke MySQL. Saya telah menggunakannya dengan sukses untuk mengimpor dump MySQL besar ke lingkungan pengembangan lokal saya (saya menggunakan MAMP dalam kasus ini).

Marcus Barnes
sumber