MySQL कनेक्शन के मूक हत्यारों में से एक MySQL पैकेट है। यहां तक कि MySQL प्रतिकृति के I / O थ्रेड को भी इसका शिकार बनाया जा सकता है।
MySQL प्रलेखन के अनुसार
यदि आप सर्वर से कोई क्वेरी गलत या बहुत बड़ी है, तो आप इन त्रुटियों को भी प्राप्त कर सकते हैं। यदि mysqld एक पैकेट प्राप्त करता है जो बहुत बड़ा है या ऑर्डर से बाहर है, तो यह मानता है कि क्लाइंट के साथ कुछ गलत हो गया है और कनेक्शन बंद कर देता है। यदि आपको बड़े प्रश्नों की आवश्यकता है (उदाहरण के लिए, यदि आप बड़े BLOB स्तंभों के साथ काम कर रहे हैं), तो आप सर्वर के मैक्स_allowed_packet चर को सेट करके क्वेरी सीमा बढ़ा सकते हैं, जिसका डिफ़ॉल्ट मान 1MB है। आपको क्लाइंट अंत पर अधिकतम पैकेट आकार बढ़ाने की भी आवश्यकता हो सकती है। पैकेट आकार निर्धारित करने के बारे में अधिक जानकारी धारा C.5.2.10, "पैकेट बहुत बड़ी" में दी गई है।
एक INSERT या REPLACE स्टेटमेंट जो कई शानदार पंक्तियों को सम्मिलित करता है, इस प्रकार की त्रुटियों का कारण भी बन सकता है। या तो इन कथनों में से कोई भी एक सर्वर को भेजे जाने के बावजूद पंक्तियों की संख्या के बावजूद अनुरोध करता है; इस प्रकार, आप अक्सर INSERT या REPLACE पर भेजी गई पंक्तियों की संख्या को कम करके त्रुटि से बच सकते हैं।
बहुत कम से कम, आपको यह सुनिश्चित करना चाहिए कि जिस मशीन से आप mysqldump'd हैं और जिस मशीन को आप लोड कर रहे हैं, उसके लिए पैकेट के आकार समान हैं।
आपके द्वारा लिए जा सकने वाले दो (2) दृष्टिकोण हो सकते हैं:
APPROACH # 1: mysqldump --skip-Extended-Insert का उपयोग करें
यह सुनिश्चित करेगा कि MySQL पैकेट एकाधिक BLOBs, TEXT फ़ील्ड्स के साथ नहीं है। इस तरह से SQL INSERT को एक बार में एक किया जाता है। प्रमुख कमियां हैं
- mysqldump बहुत बड़ा है
- ऐसे डंप को फिर से लोड करने में अधिक समय लगता है।
APPROACH # 2: max_allowed_packet बढ़ाएँ
यह पसंदीदा तरीका हो सकता है क्योंकि इसे लागू करना सिर्फ एक mysql पुनरारंभ है। MySQL पैकेट को समझने से यह स्पष्ट हो सकता है।
"अंडरस्टैंडिंग माईएसक्यूएल इंटरनल्स" के पृष्ठ 99 (आईएसबीएन 0-596-00957-7) के अनुसार , यहां पैरा 1-3 हैं जो इसे समझाते हैं:
MySQL नेटवर्क कम्युनिकेशन कोड इस धारणा के तहत लिखा गया था कि प्रश्न हमेशा बहुत कम होते हैं, और इसलिए इसे सर्वर द्वारा एक चंक में भेजा और संसाधित किया जा सकता है, जिसे MySQL शब्दावली में एक पैकेट कहा जाता है । पैकेट को संग्रहीत करने के लिए सर्वर अस्थायी बफर के लिए मेमोरी आवंटित करता है, और यह इसे पूरी तरह से फिट करने के लिए पर्याप्त अनुरोध करता है। इस आर्किटेक्चर को सर्वर के मेमोरी से बाहर चलने से बचने के लिए एहतियात की आवश्यकता होती है --- पैकेट के आकार पर एक कैप, जिसे यह विकल्प पूरा करता है।
इस विकल्प के संबंध में रुचि का कोड sql / net_serv.cc में पाया जाता है
। My_net_read () पर एक नज़र डालें , फिर my_real_read () पर कॉल का अनुसरण करें और net_realloc () पर विशेष ध्यान
दें ।
यह चर कई स्ट्रिंग फंक्शन्स के परिणाम की लंबाई को भी सीमित करता है। विवरण के लिए sql / field.cc और
sql / intem_strfunc.cc देखें।
इस विवरण को देखते हुए, बल्क INSERT बनाने से MySQL पैकेट को जल्दी से लोड / अनलोड किया जा सकेगा। यह विशेष रूप से सच है, जब उस पर आने वाले डेटा के अधिकतम लोड के लिए max_allowed_packet बहुत छोटा है।
निष्कर्ष
MySQL के अधिकांश इंस्टाल में, मैं आमतौर पर इसे 256M या 512M पर सेट करता हूं। जब डेटा लोड "MySQL दूर चला गया" त्रुटियों का उत्पादन करता है तो आपको बड़े मूल्यों के साथ एक्सपीरिएंस करना चाहिए।
max_allowed_packet
900M में बसने की कोशिश की और मैं उपयोग कर रहा था--skip-extended-insert
(और आप सही कह रहे हैं - जो कि Huuuge db-dumps के लिए बना है), लेकिन यह अभी भी विफल है। मुझे अब डंप में एक विशेष लाइन पर संदेह हो रहा है कि मैं शायद काम कर सकता हूं। लेकिन यह अभी भी अजीब है - डंप को मेरे CentOS सर्वर पर ठीक आयात किया जा सकता है।