Paket Komunikasi Membaca Kesalahan MySQL

42

Dalam log kesalahan MySQL, saya melihat beberapa peringatan ini seperti ini:

120611 16:12:30 [Warning] Aborted connection 2619503 to db: 'db_name' user: 'user_name' host: 'webapp_hostname' (Got an error reading communication packets)

Belum melihat adanya kehilangan data, jadi saya bertanya-tanya apa arti peringatan ini, atau apa yang menyebabkannya, dan jika bagaimana seseorang mengatasi masalah yang menyebabkannya. Ini ada di RHEL 6.1 dan MySQL Enterprise 5.5.

KM.
sumber

Jawaban:

50

Salah satu pembunuh diam-diam dari Koneksi MySQL adalah Paket MySQL.

Pertama, mari kita cari tahu apa itu Paket MySQL.

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

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.

Mengetahui hal ini tentang Paket MySQL memungkinkan Pengembang / DBA untuk mengukurnya untuk mengakomodasi beberapa BLOB dalam satu paket bahkan jika mereka terlalu besar. Jelas, paket yang terlalu kecil akan menyebabkan masalah untuk koneksi terbuka dalam hal ini.

Menurut Dokumentasi MySQL

  • Anda juga bisa mendapatkan kesalahan ini jika Anda mengirim permintaan ke server yang tidak benar 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.

REKOMENDASI

Coba naikkan max_allowed_packet ke angka yang jauh lebih besar, karena standarnya adalah 1M. Saya akan menyarankan sekitar 10 kali bidang TEKS atau BLOB terbesar yang Anda miliki di dataset Anda saat ini.

Untuk mengatur max_allowed_packet ke 256M, Anda dapat menambahkannya ke /etc/my.cnf atau my.ini

[mysqld]
max_allowed_packet=256M

untuk menutupi restart mysqld di masa mendatang. Untuk menginstal nilai sekarang di server, jalankan ini:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Cobalah !!!

RolandoMySQLDBA
sumber
Penjelasan yang sangat bagus.
Vasilis Lourdas
4

Sebagian besar secara default max_connections akan menjadi 100. Cobalah meningkatkan parameter konfigurasi

max_connections = 400, setelah pengaturan di my.cnf reboot server, atau atur secara dinamis:

    set @@global.max_connections = 400;

Coba saja rekomendasi di atas untuk menghindari pesan peringatan ini, dan juga memastikan jaringan Anda tidak memiliki paket drop.

Gopinath
sumber
2

Saya mengalami masalah ini baru-baru ini setelah pindah dari MySQL Enterprise 5.1.x ke 5.7.x , tanpa ada perubahan kode yang signifikan pada aplikasi, ' catatan ' mulai muncul.

Dalam kasus saya, akar penyebab munculnya ' note ' adalah program yang keluar dengan koneksi masih terbuka. Keadaan untuk koneksi tidak ditutup sedikit lebih terlibat dan tidak terkait dengan MySQL tetapi ACE, utas dan TSS.

Voltaire
sumber
0

Baris my.ini ini memecahkan masalah saya:

log_error_verbosity=1

Referensi tautan ini

JeWoPeR
sumber
16
Saya tidak berpikir Anda telah memecahkan masalah yang mendasarinya tetapi hanya menghentikannya dicatat.
user19292
1
Saya memiliki pesan yang sama yang dilaporkan sebagai "Catatan". Menggunakan log_error_verbosity = 2 sebenarnya memecahkan "masalah" (tapi "Peringatan" harus diatasi, jangan diabaikan)
xtian