ฉันเห็นคำตอบที่น่าสนใจสำหรับคำถามเกี่ยวกับ BLOB ที่ใหญ่ที่สุดที่คุณอาจมี นี่คือคำสั่งที่ผมเห็นใน ServerFault: innodb_log_file_size และ innodb_log_buffer_size รวมต้องมีขนาดใหญ่กว่าครั้งที่สิบวัตถุหยดที่ใหญ่ที่สุดของคุณถ้าคุณมีจำนวนมากของคนที่มีขนาดใหญ่
ขึ้นอยู่กับการโพสต์ ServerFault ว่าจากNils-Anders Nøttseterคุณควรสอบถามตารางและหาที่หยดเป็นที่ใหญ่ที่สุดคูณว่าหมายเลข 11 หรือมากขึ้นและการใช้งานที่ตอบเป็นmax_allowed_packetก้าวไปข้างหน้า
เป็นเรื่องตลกที่ฉันตอบคำถามอื่นซึ่งฉันแนะนำให้ปรับขนาดแพ็กเก็ต max_allowed เพื่อหวังว่าจะแก้ปัญหาได้
ข้อแม้
ตามหนังสือ

นี่คือสิ่งที่หน้า 99 ย่อหน้า 1-3 พูดเกี่ยวกับ MySQL Packets:
โค้ดการสื่อสารบนเครือข่าย MySQL นั้นเขียนขึ้นภายใต้สมมติฐานว่าคิวรีสั้น ๆ เสมอและสามารถส่งและประมวลผลโดยเซิร์ฟเวอร์ในหนึ่งก้อนซึ่งเรียกว่าแพ็กเก็ตในคำศัพท์ MySQL เซิร์ฟเวอร์จะจัดสรรหน่วยความจำสำหรับบัฟเฟอร์ชั่วคราวเพื่อเก็บแพ็คเก็ตและมันก็ร้องขอเพียงพอที่จะทำให้มันพอดี สถาปัตยกรรมนี้จำเป็นต้องมีข้อควรระวังเพื่อหลีกเลี่ยงเซิร์ฟเวอร์ที่มีหน่วยความจำไม่เพียงพอ - มีขนาดของแพ็คเก็ตซึ่งตัวเลือกนี้จะทำได้สำเร็จ
รหัสที่สนใจในความสัมพันธ์กับตัวเลือกนี้จะพบใน
SQL / net_serv.cc ลองดูที่my_net_read ()จากนั้นทำตามการเรียกร้องให้my_real_read ()และให้ความสนใจเป็นพิเศษกับ
net_realloc ()
ตัวแปรนี้ยังจำกัดความยาวของผลลัพธ์ของฟังก์ชั่นสตริงจำนวนมาก ดูSQL / field.ccและ
SQL / intem_strfunc.ccสำหรับรายละเอียด
การรู้สิ่งนี้เกี่ยวกับ MySQL Packets ทำให้ DBA มีขนาดเพิ่มขึ้นเพื่อรองรับ BLOBs จำนวนมากในหนึ่งเดียวของ MySQL Packet แม้ว่ามันจะมีขนาดใหญ่อย่างน่าสะพรึงกลัว
เกี่ยวกับสถานการณ์ของคุณคุณควรตรวจสอบว่า BLOB ที่ใหญ่ที่สุดในฐานข้อมูลของคุณคืออะไรคูณด้วย 11 และตั้งค่าmax_allowed_packetเป็นหมายเลขนั้น คุณควรจะสามารถตั้งค่าสำหรับเซิร์ฟเวอร์โดยไม่ต้องรีสตาร์ท mysql (โดยส่วนตัวฉันจะตั้ง 256M เพราะมันจะแก้ไขปัญหาอื่น ๆ ที่เกี่ยวข้องกับการโยกย้ายและการจำลองแบบซึ่งอยู่นอกเหนือขอบเขตของฟอรัมนี้) หากต้องการตั้งค่าเป็น 256M สำหรับฐานข้อมูลของคุณสำหรับการเชื่อมต่อขาเข้าทั้งหมดโปรดรันสิ่งนี้:
SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;
หลังจากนั้นเพิ่มการตั้งค่านี้ใน my.cnf ภายใต้[mysqld]
หัวข้อ:
[mysqld]
max_allowed_packet = 256M