Mengubah max_allowed_packet dan masih menerima kesalahan 'Paket Terlalu Besar'

8

Saya menggunakan mysqldump untuk membuat file flat untuk keperluan cadangan. Saya telah menggunakan file ini untuk membuat ulang database di server alternatif. Saya menjalankan proses impor melalui ssh pada baris perintah dan saya menerima banyak Packet too Largekesalahan.

Saya memulai kembali mysql dengan max_allowed_packet yang jauh lebih besar (mis. 1000M) dan masih menerima kesalahan. Saya bahkan mencoba mengatur max_allowed_packet dalam file impor, masih menerima kesalahan.

Apakah ada cara untuk memastikan max_allowed_packet diatur dan / atau menggunakan mysqldump yang akan membuat file yang tidak menyebabkan masalah ini?

Sebagai referensi:

file mysqldump yang tidak terkompresi adalah ~ 2GB

tipe basis data adalah INNODB

Patrick
sumber

Jawaban:

5

Yang pertama saya pikirkan adalah apa yang sebenarnya dikendalikan oleh max_allowed_packet . Inilah yang saya temukan:

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.

Mengingat definisi max_allowed_packet, saya kemudian menemukan sesuatu yang lain dari ServerFault: innodb_log_file_size dan innodb_log_buffer_size digabungkan harus lebih besar dari sepuluh kali objek gumpalan terbesar Anda jika Anda memiliki banyak yang besar

Dengan mengingat kedua hal ini, saya akan meningkatkan innodb_log_file_size di /etc/my.cnf ke ukuran maksimum yang diizinkan, 2047M. Ini tentu saja membutuhkan yang berikut ini

service mysql stop
rm -f /var/lib/mysql/ib_logfile*
service mysql start

Ini akan mengakomodasi gumpalan besar yang mungkin Anda miliki dalam data Anda.

RolandoMySQLDBA
sumber
Penasaran dari mana 10x itu berasal - apakah itu hanya aturan praktis atau ada kode di MySQL yang mengatakan mengalokasikan 10 buffer tetap sehingga Anda perlu 10 untuk memastikan bahwa 1 di antaranya cukup besar?
Gayus
Apakah buku ini resmi?
Pacerier
2

MySQL max_allowed_packetmasih harus berada dalam batas-batas shell yang memulainya - apakah ini ulimit -amenunjukkan bahwa data seg sizeitu tidak terbatas?

Gayus
sumber
2

Untuk beberapa alasan, max_allowed_packetapakah diabaikan oleh mysqldump- oleh desain ? Pelengkap sebenarnya adalah net_buffer_length. Jadi alih-alih coba

mysqldump --net_buffer_length=100k -u root -p databasename > dump.sql
Leopd
sumber
Itu sangat mencerahkan !!! Karena laporan bug membahas insert yang diperluas sehubungan dengan masalah ini, mungkin melakukan --skip-extended-insert dapat mengkompensasi beberapa tetapi pasti akan menghasilkan mysqldump yang lebih besar. +1 untuk Anda yang menemukan berlian ini dalam kekasaran bahwa Oracle akan mati !!!
RolandoMySQLDBA
--skip-extended-insert benar-benar berfungsi, tetapi pada basis data saya memperlambat pemulihan sebesar 100x sehingga tidak dapat digunakan.
Leopd
Maaf, belasungkawa saya. Mungkin mysqldump membuat file CSV dan mencoba memuatnya kembali menggunakan LOAD DATA INFILE dan meningkatkan bulk_insert_buffer_size menjadi 1G atau 2G. Hei, kamu tidak pernah tahu !!!
RolandoMySQLDBA