Apa yang sebenarnya diatur oleh pengaturan "max_allowed_packet" MySQL?

8

Kami telah membersihkan masalah basis data selama empat jam terakhir, terima kasih atas kerusakan mysqldumpyang tidak cukup keliru. Kami mendapatkan kesalahan ini:

mysqldump: Error 2020: Got packet bigger than "max_allowed_packet" bytes when dumping table "search_dataset" at row: 68014

Apa yang dilakukan pengaturan itu? Ini jelas bukan ukuran paket IP, karena saya telah menetapkannya menjadi 32 juta sekarang. Kenapa itu ada?

Plutor
sumber

Jawaban:

7

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.

Ini mungkin penjelasan paling lengkap dari max_allowed_packet yang pernah saya lihat. Saya mengetik 3 paragraf itu langsung dari buku.

RolandoMySQLDBA
sumber
Terima kasih telah memposting itu. Tampaknya mengisyaratkan bahwa "paket" berarti "paket IP."
Randolf Richardson
Jawaban yang bagus Saya kira ini sedekat jawaban yang sebenarnya. (Saya masih cukup yakin ini tidak merujuk pada paket IP. Tidak menyebutkan IP di mana pun, dan saya percaya 65535 byte biasanya merupakan batas dunia nyata untuk paket IP yang bahkan terfragmentasi.)
Plutor
1

Dokumentasi menjelaskan secara rinci di sini:

"Ukuran maksimum satu paket atau string yang dihasilkan / perantara ..."

Dokumentasi juga berlanjut ke alamat BLOB dan bagaimana pengaturan ini terkait dengan mereka.

Randolf Richardson
sumber
Itu tidak benar-benar menjawab pertanyaan saya. Apa paket dalam konteks ini? Apakah ini sebenarnya paket IP? Apakah tidak ada cara yang lebih baik daripada batas byte sederhana untuk menangkap data yang cacat?
Plutor
Kecuali mereka mendefinisikan "paket" sebagai sesuatu yang lain (yang tampaknya tidak mereka lakukan dalam dokumentasi), masuk akal untuk mengharapkan bahwa "paket" mengacu pada paket IP.
Randolf Richardson
Saya menemukan definisi dalam buku yang saya miliki. Saya menambahkan kutipan dari buku itu sebagai jawaban saya.
RolandoMySQLDBA