อะไรคือค่าที่สมเหตุสมผลสำหรับ max_allowed_packet สำหรับ Drupal 7 ที่มีปริมาณการใช้ปานกลาง?


12

ฉันจำเป็นต้องรู้หมายเลขสวนบอลสำหรับตัวแปรนี้สำหรับเว็บไซต์ drupal 7 ของฉัน ฉันเพิ่งได้รับ "drupal" PDOException: SQLSTATE [08S01]: ข้อผิดพลาดในการเชื่อมโยงการสื่อสาร: 1153 "ข้อผิดพลาดฉันเป็นมือใหม่ที่จะ mysql และใช้โฮสติ้งที่ใช้ร่วมกันฉันอาจต้องขอให้ผู้ดูแลระบบทำเพื่อฉัน

ขอบคุณล่วงหน้า.


1
คำตอบของฉันแสดงให้เห็นถึงประสบการณ์ของฉันกับสิ่งนี้ แต่คุณอาจได้รับคำตอบที่ดีกว่าที่ dba.stackexchange.com จากผู้ที่ดูแล MySQL เพื่อการดำรงชีวิต
mpdonadio

คำตอบ:


12

ฉันเห็นคำตอบที่น่าสนใจสำหรับคำถามเกี่ยวกับ BLOB ที่ใหญ่ที่สุดที่คุณอาจมี นี่คือคำสั่งที่ผมเห็นใน ServerFault: innodb_log_file_size และ innodb_log_buffer_size รวมต้องมีขนาดใหญ่กว่าครั้งที่สิบวัตถุหยดที่ใหญ่ที่สุดของคุณถ้าคุณมีจำนวนมากของคนที่มีขนาดใหญ่

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

เป็นเรื่องตลกที่ฉันตอบคำถามอื่นซึ่งฉันแนะนำให้ปรับขนาดแพ็กเก็ต max_allowed เพื่อหวังว่าจะแก้ปัญหาได้

ข้อแม้

ตามหนังสือ

TheBookImage

นี่คือสิ่งที่หน้า 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

แพ็คเก็ตที่อนุญาตสูงสุดจะไม่ส่งผลกระทบต่อขนาดของคำสั่งแทรกหรือไม่
Buttle Butkus

@ButtleButkus แน่นอน นี่คือสาเหตุที่ MySQL Packets ที่ใหญ่กว่าทำงานได้ดีสำหรับ INSERT โปรดทราบว่า 1G เป็นขนาดสูงสุดสำหรับ max_allowed_packet โปรดทราบด้วยว่าการตั้งค่า max_allowed_packet เป็น 256M ไม่ได้จัดสรร 256M ล่วงหน้า ตามที่dev.mysql.com/doc/refman/5.6/en/… , mysqld จะจัดสรรสิ่งใดก็ตามที่ net_buffer_length เท่ากับขนาดของแพ็คเก็ต MySQL เริ่มต้น แพ็คเก็ตจะค่อยๆเติบโตขึ้นตามขนาดที่กำหนดโดย max_allowed_packet ดังนั้นจึงเป็นการตกลงที่จะตั้งค่า max_allowed_packet ขนาดใหญ่ INSERT จะรักคุณ
RolandoMySQLDBA

ฉันไม่เคยตั้งอะไรไว้ใกล้กับขนาดนั้นแม้ว่าเราจะมีเครื่องที่มี RAM คู่ 32G แอปพลิเคชันสำลักมันและฉันเพิ่มเป็น 32M จากค่าเริ่มต้น (1M?) และใช้งานได้ บางทีฉันจะเพิ่มมันอีกถ้าไม่เจ็บ แต่แอปพลิเคชันควรตรวจสอบ max_allowed_packet และแยกส่วนที่แทรกออกเป็นชิ้น ๆ เพื่อหลีกเลี่ยงการชนขีด จำกัด นั้นหรือไม่ ข้อเสียของวิธีการนั้นคืออะไร? บางทีฉันควรโพสต์คำถามนั้นในเว็บไซต์ dba stack
Buttle Butkus

คุณช่วยอธิบายเพิ่มเติมหน่อยได้ไหมว่าทำไมเราควรคูณ 11? โพสต์ที่เชื่อมโยงเป็นเรื่องเกี่ยวกับบัฟเฟอร์ของ Innodb - เกี่ยวข้องกับขนาดแพ็คเก็ตอย่างไร
SystemParadox

4

นำมาจากหน้าความต้องการเซิร์ฟเวอร์ฐานข้อมูลของ Drupal :

อาจจำเป็นต้องตั้งค่าตัวแปรระบบ max_allowed_packet เป็นอย่างน้อย 16M แผนการโฮสติ้งราคาไม่แพงบางชุดจะตั้งค่านี้ต่ำเกินไป ในกรณีนี้คุณอาจต้องเลือกแผนการโฮสต์ที่ดีกว่า ค่า 1M อาจเพียงพอสำหรับ Drupal 5

ควรจะดีสำหรับไซต์บนโฮสติ้งที่ใช้ร่วมกัน


1
ว้าว!! ข้อกำหนดของเซิร์ฟเวอร์ Drupal บอกอย่างเป็นทางการว่า 16M !! ฉันไม่เคยรู้เลย จะเก็บไว้ในใจในครั้งต่อไป ขอบคุณมากที่แบ่งปันข้อมูลนี้ ฉันหวังว่าฉันจะทำเครื่องหมายคำตอบที่ดีที่สุด !!
shivams

2

max_allowed_packetมันอาจจะเป็นเพียงเล็กน้อยหากินชุด ฉันยังไม่ได้เจอวิธีการคำนวณค่านั้น โดยทั่วไปแล้วฉันพบมันเมื่อพยายามกู้คืน snapshot ของฐานข้อมูลที่มีแถวจาก{cache}ตาราง

เมื่อฉันมีปัญหานี้ฉันจะเลือกค่าระหว่าง 4M ถึง 8M ฉันเก็บค่าไว้เรื่อย ๆ จนกว่ามันจะหยุด อย่างไรก็ตามฉันไม่รู้ว่าโฮสต์ที่แชร์จะเปลี่ยนค่านี้ให้คุณหรือไม่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.