MySQL सर्वर बड़े डंप के आयात को बाधित करने से दूर हो गया है


14

मैं अपने मैक पर अपने स्थानीय mysql को एक बड़ा sql डंप (2GB) आयात करने की कोशिश कर रहा हूं। मैं अतीत में ऐसा करने में सक्षम रहा हूं (मैं MAMP का उपयोग कर रहा था), लेकिन अब मुझे 7758 लाइन पर एक ERROR 2006 (HY000) मिलता है: MySQL सर्वर हर बार जब मैं डंप आयात करने की कोशिश करता है तो दूर चला जाता है। डेटाबेस में इनोडब टेबल होते हैं।

मैंने अपने my.cnf के लिए मेरी innodb-भारी-4G.cnf फ़ाइल को कॉपी करने की कोशिश की, यह देखने के लिए कि क्या वे सेटिंग्स मदद करेंगे, लेकिन भाग्य नहीं।

क्या विचार पर कोई विचार?

मैं यहाँ से "Mac OS X ver। 10.6 (x86, 64-bit), DMG संग्रह" का उपयोग कर रहा हूँ: http://dev.mysql.com/downloads/mysql/

जवाबों:


15

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 को एक बार में एक किया जाता है। प्रमुख कमियां हैं

  1. mysqldump बहुत बड़ा है
  2. ऐसे डंप को फिर से लोड करने में अधिक समय लगता है।

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_packet900M में बसने की कोशिश की और मैं उपयोग कर रहा था --skip-extended-insert(और आप सही कह रहे हैं - जो कि Huuuge db-dumps के लिए बना है), लेकिन यह अभी भी विफल है। मुझे अब डंप में एक विशेष लाइन पर संदेह हो रहा है कि मैं शायद काम कर सकता हूं। लेकिन यह अभी भी अजीब है - डंप को मेरे CentOS सर्वर पर ठीक आयात किया जा सकता है।
naxoc

मैंने sql डंप जो बहुत, बहुत लंबी लाइन थी, से एक इंसर्ट निकालकर खत्म कर दिया। यह तय है (और लाइन की जरूरत नहीं थी)।
8

BTW कृपया सुनिश्चित करें कि डेटा डंप के लिए डिफ़ॉल्ट चरित्र MacOSX ऑपरेटिंग सिस्टम और MySQL में समर्थित हो सकता है।
RolandoMySQLDBA

@naxov - मैं सिर्फ उस एक पंक्ति के बारे में उत्सुक हूं जिसे आप डंप में संदेह करते हैं। क्या कोई TEXT या BLOB फ़ील्ड शामिल है ???
रोलेंडोमीक्यूडीबीए

हां एक बहुत लंबा टेक्स्टफील्ड।
नक्सलोक

2

समय समाप्त होने से पहले यह कब तक चलता है? पहला कदम जाँच करने के लिए शर्त होगी wait_timeoutऔर interactive_timeoutसुनिश्चित करें कि वे अपने आयात के लिए बड़ा पर्याप्त हो बनाने के लिए सेटिंग्स:

SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;

डिफ़ॉल्ट 8 घंटे (28800) है, इसलिए संभवतः यह समस्या नहीं है। इस मुद्दे के अन्य संकेत यहां देखे जा सकते हैं । जो बाहर खड़ा है वह यह है:

किसी भिन्न होस्ट पर चल रहे क्लाइंट अनुप्रयोग के पास होस्ट से MySQL सर्वर से कनेक्ट करने के लिए आवश्यक विशेषाधिकार नहीं हैं।

अनुमतियों को पहले सत्यापित करें, लेकिन फिर संभावित समस्याओं की उस सूची से गुजरें।


यह सभी लोकलहोस्ट पर है, इसलिए या तो मुझे समझ नहीं आ रहा है कि आपका क्या मतलब है या यह समस्या नहीं है। क्या आप mysql में विशेषाधिकारों के रूप में अनुमति का मतलब है?
naxoc

2

हाँ आमतौर पर Wait_timeout और max_allowed_packets के साथ खेलने से मुझे त्रुटि संदेश के साथ-साथ होने की अनुमति मिलती है।


यह मेरे लिए काम नहीं किया। मुझे डंप फ़ाइल में sql को संपादित करना था और एक बहुत लंबी लाइन को दूर करना था जो समस्या पैदा कर रहा था।
8

एक को कुछ मापदंडों के साथ नहीं खेलना चाहिए जो वह नहीं समझता है
जेरीडैप

2

यह करने के लिए "सही" बात नहीं हो सकती है, लेकिन यह काम हो सकता है ('एर किया, सही?)?

अपने बड़े डंप को कई फाइलों में तोड़ने और उन्हें एक क्रम में एक बार चलाने की कोशिश करें। मेरा दृष्टिकोण इसे आधे में तोड़ना और परीक्षण करना होगा। फिर प्रत्येक आधे को आधे में तोड़ दें, फिर से परीक्षण करें, और इसी तरह।

मैं कुछ उत्सुक हूँ अगर आपके बॉक्स पर राम की मात्रा है, तो इससे कुछ हो सकता है। जब इसे चलाने के लिए MySQL मेमोरी में पूरे डंप लोड करता है? मुझे नहीं पता ... लेकिन अगर आपके पास केवल 2GB RAM है और इसका कुछ उपयोग आपके OS और अन्य ऐप्स को चलाने में है, तो यह समस्या हो सकती है।


2

उन है जो अन्य सुझावों के साथ सफलता BigDump पीएचपी पर एक नज़र लेने पर विचार हो सकता है नहीं था MySQL डंप टेढ़े आयातक स्क्रिप्ट

यह MySQL में बड़े डेटाबेस डंप आयात करने के लिए एक समाधान है। मैंने अपने स्थानीय विकास परिवेश में एक बड़े MySQL डंप को आयात करने के लिए इसका सफलतापूर्वक उपयोग किया है (मैं इस मामले में MAMP का उपयोग कर रहा हूं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.