MySQL त्रुटि संचार पैकेट पढ़ना


42

MySQL त्रुटि लॉग में, मैं इनकी तरह काफी कम चेतावनियाँ देखता हूँ:

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

प्रति से अधिक डेटा के नुकसान पर ध्यान नहीं दिया गया है, इसलिए मैं सोच रहा हूं कि इस चेतावनी का क्या मतलब है, या इसके कारण क्या हैं, और यदि कोई इनका कारण बनता है तो समस्या का समाधान कैसे हो सकता है। यह RHEL 6.1 और MySQL Enterprise 5.5 पर है।

जवाबों:


50

MySQL कनेक्शन के मूक हत्यारों में से एक MySQL पैकेट है।

सबसे पहले, आइए जानें कि MySQL पैकेट क्या है।

"अंडरस्टैंडिंग माईएसक्यूएल इंटरनल्स" के पृष्ठ 99 (आईएसबीएन 0-596-00957-7) के अनुसार , यहां पैराग्राफ 1-3 हैं जो MySQL पैकेट्स की व्याख्या कर रहे हैं:

MySQL नेटवर्क कम्युनिकेशन कोड इस धारणा के तहत लिखा गया था कि प्रश्न हमेशा बहुत कम होते हैं, और इसलिए इसे एक चंक में सर्वर द्वारा भेजा और संसाधित किया जा सकता है, जिसे MySQL शब्दावली में एक पैकेट कहा जाता है । पैकेट को संग्रहीत करने के लिए सर्वर अस्थायी बफर के लिए मेमोरी आवंटित करता है, और यह इसे पूरी तरह से फिट करने के लिए पर्याप्त अनुरोध करता है। इस आर्किटेक्चर को सर्वर के मेमोरी से बाहर चलने से बचने के लिए एहतियात की आवश्यकता होती है --- पैकेट के आकार पर एक कैप, जिसे यह विकल्प पूरा करता है।

इस विकल्प के संबंध में रुचि का कोड sql / net_serv.cc में पाया जाता है । My_net_read () पर एक नज़र डालें , फिर my_real_read () पर कॉल का अनुसरण करें और net_realloc () पर विशेष ध्यान दें

यह चर कई स्ट्रिंग फंक्शंस के परिणाम की लंबाई को भी सीमित करता है। विवरण के लिए sql / field.cc और sql / intem_strfunc.cc देखें।

MySQL पैकेट के बारे में यह जानकर कि एक डेवलपर / DBA उन्हें एक पैकेट के अंदर कई BLOB को समायोजित करने के लिए आकार दे सकता है, भले ही वे अप्रिय रूप से बड़े हों। निश्चित रूप से, बहुत छोटा पैकेट इस संबंध में खुले कनेक्शन के लिए समस्या पैदा करेगा।

MySQL प्रलेखन के अनुसार

  • यदि आप सर्वर पर कोई क्वेरी भेजते हैं, तो गलत या बहुत बड़ा होने पर आपको ये त्रुटियां हो सकती हैं। यदि mysqld एक पैकेट प्राप्त करता है जो बहुत बड़ा है या ऑर्डर से बाहर है, तो यह मानता है कि क्लाइंट के साथ कुछ गलत हो गया है और कनेक्शन बंद कर देता है। यदि आपको बड़े प्रश्नों की आवश्यकता है (उदाहरण के लिए, यदि आप बड़े BLOB स्तंभों के साथ काम कर रहे हैं), तो आप सर्वर के अधिकतम_allowed_packet चर को सेट करके क्वेरी सीमा बढ़ा सकते हैं, जिसका डिफ़ॉल्ट मान 1MB है। आपको क्लाइंट अंत पर अधिकतम पैकेट आकार बढ़ाने की भी आवश्यकता हो सकती है। पैकेट का आकार निर्धारित करने के बारे में अधिक जानकारी धारा C.5.2.10, "पैकेट बहुत बड़ी" में दी गई है।

  • एक INSERT या REPLACE स्टेटमेंट जो कई शानदार पंक्तियों को सम्मिलित करता है, इस प्रकार की त्रुटियों का कारण भी बन सकता है। या तो इन बयानों में से कोई भी एक सर्वर को भेजे जाने के बावजूद पंक्तियों की संख्या के बावजूद अनुरोध करता है; इस प्रकार, आप अक्सर INSERT या REPLACE पर भेजी गई पंक्तियों की संख्या को कम करके त्रुटि से बच सकते हैं।

सिफ़ारिश करना

डिफ़ॉल्ट 1M के बाद से max_allowed_packet को बहुत बड़ी संख्या में बढ़ाने का प्रयास करें । मैं आपके वर्तमान डेटासेट में आपके सबसे बड़े TEXT या BLOB फ़ील्ड के 10 गुना होने का सुझाव दूंगा।

अधिकतम 25 मीटर करने के लिए, आप इसे /etc/my.cnf या my.ini पर जोड़ सकते हैं

[mysqld]
max_allowed_packet=256M

mysqld के भविष्य के पुनरारंभ को कवर करने के लिए। सर्वर पर अब मान स्थापित करने के लिए, कृपया इसे चलाएं:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

कोशिश करो !!!


बहुत अच्छी व्याख्या।
वासिलिस लौर्डस

4

ज्यादातर डिफ़ॉल्ट रूप से max_connections 100 होगा। कॉन्फ़िगर पैरामीटर को बढ़ाने का प्रयास करें

max_connections = 400, my.cnf में सर्वर को रिबूट करने के बाद, या इसे गतिशील रूप से सेट करें:

    set @@global.max_connections = 400;

इस चेतावनी संदेशों से बचने के लिए बस उपरोक्त अनुशंसा का प्रयास करें, और यह भी सुनिश्चित करें कि आपके नेटवर्क में कोई पैकेट ड्रॉप न हो।


2

MySQL Enterprise 5.1.x से 5.7.x पर जाने के बाद मुझे हाल ही में इस समस्या का सामना करना पड़ा , बिना किसी महत्वपूर्ण कोड परिवर्तन के अनुप्रयोग के लिए ' नोट ' दिखाई देने लगा।

मेरे मामले में ' नोट ' प्रदर्शित होने का मूल कारण कनेक्शन से बाहर निकलने वाला कार्यक्रम अभी भी खुला था। कनेक्शन बंद न होने की परिस्थिति थोड़ी अधिक शामिल थी और MySQL से संबंधित नहीं थी लेकिन ACE, थ्रेड्स और TSS।


0

इस my.ini लाइन ने मेरी समस्या हल कर दी:

log_error_verbosity=1

संदर्भ इस लिंक


16
मुझे नहीं लगता कि आपने अंतर्निहित समस्या को हल कर दिया है, लेकिन बस इसे लॉग इन करना बंद कर दिया है।
user19292

1
मुझे एक ही संदेश "नोट" के रूप में रिपोर्ट हो रहा था। Log_error_verbosity = 2 का उपयोग करना वास्तव में "समस्या" को हल करता है (लेकिन "चेतावनी" को संबोधित किया जाना चाहिए, इसे अनदेखा नहीं किया जाना चाहिए)
xtian
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.