बड़ी SQL फ़ाइल आयात करते समय MySQL सर्वर दूर चला गया है


259

मैंने phpMyAdmin के माध्यम से एक बड़ी sql फ़ाइल आयात करने की कोशिश की ... लेकिन यह त्रुटि दिखाती रही

'MySQL सर्वर रुक गया है'

क्या करें?


3
Max_allowed_packet और Wait_timeout के लिए आपके मूल्य क्या हैं?
डेमनोफैकोस

1
आप दोगुना करने की कोशिश कर सकते हैं max_allowed_packet। थोड़ा कच्चा, लेकिन अगर वह काम करता है तो आप एक समझदार मूल्य पा सकते हैं।
नन्ने

1
हंस कोल जॉनसन के लिए धन्यवाद। वह बहोत अच्छा था! जबरदस्त हंसी! :)
mbrinson

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

कभी-कभी आपको यह तब मिलता है जब आपका डिस्क स्थान कम होता है
प्रमोदटेक

जवाबों:


376

जैसा कि यहाँ कहा गया है :

MySQL सर्वर के लिए दो सबसे सामान्य कारण (और फिक्स) दूर हो गए हैं (त्रुटि 2006) हैं:

सर्वर ने समय समाप्त कर कनेक्शन बंद कर दिया। कैसे ठीक करना है:

  1. जाँच करें कि आपके mysqld की my.cnf कॉन्फ़िगरेशन फ़ाइल में wa_timeout चर काफी बड़ा है। डेबियन पर: sudo nano /etc/mysql/my.cnfसेट wait_timeout = 600सेकंड (आप इस मान को तब घटा / घटा सकते हैं, जब त्रुटि 2006 हो गई है), तब sudo /etc/init.d/mysql restart। मैंने जाँच नहीं की, लेकिन wa_time के लिए डिफ़ॉल्ट मान लगभग 28800 सेकंड (8 घंटे) हो सकता है।

  2. सर्वर ने एक गलत या बहुत बड़ा पैकेट गिरा दिया। यदि mysqld को एक पैकेट मिलता है जो बहुत बड़ा या गलत है, तो यह मानता है कि ग्राहक के साथ कुछ गलत हो गया है और कनेक्शन बंद कर दिया है। आप my.cnf फ़ाइल में max_allowed_packet का मान बढ़ाकर अधिकतम पैकेट आकार सीमा बढ़ा सकते हैं। डेबियन पर sudo nano /etc/mysql/my.cnf, सेट max_allowed_packet = 64M(आप इस मूल्य को ट्विस्ट / घटा सकते हैं जब त्रुटि 2006 चली गई है), फिर sudo /etc/init.d/mysql restart

संपादित करें:

ध्यान दें कि MySQL विकल्प फ़ाइलों में उनके कमांड पहले से ही टिप्पणी के रूप में उपलब्ध नहीं हैं (उदाहरण के लिए php.ini में)। तो अगर आप में कोई बदलाव / ट्वीक लिखना चाहिए my.cnfया my.iniऔर उन्हें रखते mysql/dataनिर्देशिका या अन्य रास्तों में से किसी में, इस तरह के रूप विकल्पों में से उचित समूह के तहत [client], [myslqd]आदि उदाहरण के लिए:

[mysqld]
wait_timeout = 600
max_allowed_packet = 64M

फिर सर्वर को पुनरारंभ करें। उनके मान प्राप्त करने के लिए, mysql क्लाइंट में टाइप करें:

> select @@wait_timeout;
> select @@max_allowed_packet;

72
मेरे मामले में यह max_allowed_packet वैरिएबल था। इसे 1 MB के डिफ़ॉल्ट पर सेट किया गया था (आप SHOW VARIABLESMySQL क्वेरी चलाकर इसे देख सकते हैं ) और जिस फ़ाइल को मैं आयात कर रहा था उसमें कुछ बड़े रिकॉर्ड थे। मैंने my.ini फ़ाइल खोली (मैं विंडोज़ चला रहा था) और इस पर मान सेट किया: max_allowed_packet = 64MMySQL को पुनः आरंभ किया और आयात को फिर से चलाया।
१27:२elle बजे ब्रेंट मैटेलेले

मैं वेबसीरीज के साथ डेटाबेस में बड़ी फाइलें अपलोड कर रहा था। इससे मदद मिली, धन्यवाद ... :-)
inf3rno

@BrentMatzelle "निश्चित रूप से" मैसकल चले गए "समस्या का ध्यान रखा गया है। धन्यवाद!
asprin

2
मैं wait_timeoutलाइन नहीं ढूँढ सकता
ओकी एरी रिनाल्डी

4
विंडोज़ के मामले में (Xampp के साथ) यह my.ini फ़ाइल और innodb_lock_wait_timeout थी
आनंदा

98

मेरे लिए यह समाधान काम नहीं आया इसलिए मैंने निष्पादित किया

SET GLOBAL max_allowed_packet=1073741824;

मेरे SQL क्लाइंट में।

यदि चल रही MYSql सेवा के साथ इसे बदलने में सक्षम नहीं है, तो आपको सेवा को रोकना चाहिए और "my.ini" फ़ाइल में चर को बदलना चाहिए।

उदाहरण के लिए:

max_allowed_packet=20M

1
यह मेरे लिए MAMP (OS X) पर काम करता है, जब अन्य अधिक लोकप्रिय उत्तर नहीं आते। लेकिन क्या यह स्थायी है?
atwixtor

2
@atwixtor नहीं, सर्वर के पुनरारंभ होने तक इस काम की तरह चर सेट करना। और फिर वे डिफ़ॉल्ट मान पर रीसेट हो जाते हैं।
d.raev

1
यह चाल php.iniचली, विंडोज पर एक परीक्षण XAMPP मशीन पर मुझे दोनों फ़ाइल को संशोधित करना पड़ा (जैसा कि उत्तर में @GBD द्वारा सुझाया गया है) और my.iniइसे बनाने के लिए MySQL कॉन्फ़िगरेशन फ़ाइल ।
ग्रुबर

2
मुझे लगता है कि आप के साथ वर्तमान का आकार देखने के जोड़ने का सुझाव थाSHOW variables LIKE 'max_allowed_packet'
अर्थ

यह इस बात में स्थायी नहीं है कि सर्वर के फिर से शुरू होने (अंततः) होने पर मूल्य रीसेट हो जाएगा, लेकिन यह भी वर्तमान सत्र के लिए ही नहीं है। max_allowed_packetएक ग्राहक में सेट करना और फिर .sqlदूसरे सत्र में बड़ी फ़ाइल आयात करना ठीक काम करेगा।
VoteyDisciple

21

यदि आप XAMPP पर काम कर रहे हैं तो आप MySQL सर्वर को ठीक कर सकते हैं। निम्नलिखित बदलावों के साथ समस्या दूर हो गई है।

अपनी my.ini फ़ाइल खोलें my.ini स्थान है (D: \ xampp \ mysql \ bin \ my.ini)

निम्न चर मानों को बदलें

max_allowed_packet = 64M
innodb_lock_wait_timeout = 500

wamp के लिए samp, max_allowed_packet = 64M
एंड्रयू

19

यदि आप डिफ़ॉल्ट मानों के साथ चल रहे हैं तो आपके पास अपने mysql कॉन्फ़िगरेशन को अनुकूलित करने के लिए बहुत जगह है।

मेरे द्वारा सुझाया गया पहला कदम मैक्सिमम_लग्ड_पैकेट को 128M तक बढ़ाना है।

फिर MySQL ट्यूनिंग प्राइमर स्क्रिप्ट डाउनलोड करें और इसे चलाएं। यह बेहतर प्रदर्शन के लिए आपके कॉन्फ़िगरेशन के कई पहलुओं के लिए सिफारिशें प्रदान करेगा।

इसके अलावा MySQL और PHP दोनों में अपने टाइमआउट मानों को समायोजित करें।

कितनी बड़ी (फ़ाइल का आकार) वह फ़ाइल है जिसे आप आयात कर रहे हैं और क्या आप PHPMyAdmin के बजाय mysql कमांड लाइन क्लाइंट का उपयोग करके फ़ाइल को आयात करने में सक्षम हैं?


धन्यवाद, मेरे पास पहले से ही 16M के लिए max_allowed_packet सेट था, फिर इस सवाल को उठाया और यह सोचकर 32M पर उठाया कि यह निश्चित रूप से पर्याप्त होगा, लेकिन फिर आपका जवाब देखा और 128M निश्चित रूप से काम करता है। मैं इकट्ठा कर रहा हूं कि * .sql फ़ाइल के अंदर पूरे SQL स्टेटमेंट को सिर्फ एक पैकेट माना जाता है?
एलिजा लिन

8

यदि आप OS X पर MAMP का उपयोग कर रहे हैं, तो आपको max_allowed_packetMySQL के टेम्पलेट में मान को बदलना होगा ।

  1. आप इसे यहां पा सकते हैं: फ़ाइल> टेम्पलेट संपादित करें> MySQL my.cnf

  2. फिर बस खोज करें max_allowed_packet, मूल्य बदलें और सहेजें।


6

मैंने इस छोटी /etc/mysql/my.cnf फ़ाइल के साथ अपनी समस्या हल की:

[mysqld]
wait_timeout = 600
max_allowed_packet = 100M

1
पुष्टि की गई कि यह WAMP पर MySQL v5.6.12 के लिए भी काम करता है: विंडोज़ पर, "mysqld] अनुभाग के ऊपर" प्रतीक्षा_टाइम "और" max_allowed_packet "लाइनों को जोड़ें: wamp \ bin \ mysql \ mysql_version \ my.ini
dean.huczok

धन्यवाद @dan ने मेरे साल पुराने मुद्दे को हल किया, मैंने उन सेटिंग्स को खंड के तहत कभी नहीं जोड़ा[mysqld]
shivgre

यह MySQL v5.7 के लिए काम करता है। my-default.ini डिफ़ॉल्ट रूप से नहीं बनाया गया है इसलिए आपको इसे बनाने की आवश्यकता है।
रोडोल्फो वेलास्को

5

यह हो सकता है अन्य कारण स्मृति से बाहर है। / Var / log / संदेश की जाँच करें और सुनिश्चित करें कि आपके my.cnf को mysqld के कारण आपकी मशीन की तुलना में अधिक मेमोरी आवंटित करने के लिए सेट नहीं किया गया है।

आपकी mysqld प्रक्रिया वास्तव में कर्नेल द्वारा मार दी जा सकती है और फिर "safe_mysqld" प्रक्रिया द्वारा आपको इसे साकार किए बिना फिर से शुरू किया जा सकता है।

शीर्ष का उपयोग करें और स्मृति आवंटन देखें, जबकि यह देखने के लिए कि आपका हेडरूम क्या है।

इसे बदलने से पहले my.cnf का बैकअप बनाएं।


यही मेरी समस्या का कारण बन रहा था। मैंने 1GB स्वैप फ़ाइल जोड़ी और इसे पूरी तरह से ठीक कर दिया।
पिकामेंडर 2

5

मेरे पास यह त्रुटि और अन्य संबंधित थे, जब मैंने 16 जीबी एसक्यूएल फ़ाइल पर आयात किया था। मेरे लिए, my.ini को संपादित करना और [mysqld] अनुभाग में निम्नलिखित (कई अलग-अलग पोस्ट के आधार पर) सेटिंग करें:

max_allowed_packet      = 110M
innodb_buffer_pool_size=511M
innodb_log_file_size=500M
innodb_log_buffer_size = 800M
net_read_timeout        = 600
net_write_timeout       = 600

यदि आप विंडोज के तहत चल रहे हैं, तो नियंत्रण कक्ष, सेवाओं पर जाएं, और MySQL के विवरण देखें और आप देखेंगे कि my.ini कहां है। इसके बाद आप my.ini को एडिट और सेव करें, mysql सर्विस को पुनरारंभ करें (या कंप्यूटर को पुनरारंभ करें)।

यदि आप HeidiSQL का उपयोग कर रहे हैं, तो आप इनका उपयोग करके कुछ या सभी सेट भी कर सकते हैं।


2

मैंने "max_allowed_packet" को 1024M में अपडेट किया, लेकिन यह अभी भी काम नहीं कर रहा था। यह मेरी तैनाती स्क्रिप्ट चल रहा था पता चला है:

mysql --max_allowed_packet=512M --database=mydb -u root < .\db\db.sql

यदि आप इसे इस तरह से दान कर रहे हैं, तो कमांड लाइन से स्पष्ट रूप से एक बड़ी संख्या निर्दिष्ट करना सुनिश्चित करें।


2

यदि आपके डेटा में BLOBडेटा शामिल है:

ध्यान दें कि कमांड लाइन से डेटा का आयात BLOB डेटा पर चोक होता है, जिसके परिणामस्वरूप 'MySQL सर्वर' चला गया है 'त्रुटि।

इससे बचने के लिए, mysqldump को फिर से बनाएं लेकिन --hex-blobझंडे के साथ :

http://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_mysqldump_hex-blob

जो अन्य पाठ के बीच बाइनरी के बजाय हेक्स मान के साथ डेटा फ़ाइल को लिख देगा।

PhpMyAdmin में हेक्साडेसिमल नोटेशन में डंप बाइनरी कॉलम का भी विकल्प है (उदाहरण के लिए, "abc" 0x616263 हो जाता है) "जो अच्छी तरह से काम करता है।

ध्यान दें कि एक लंबे समय तक चलने वाला बग है (दिसंबर 2015 तक) जिसका अर्थ है कि GEOMकॉलम परिवर्तित नहीं हैं: mysqldump का उपयोग करके GEOMETRY कॉलम वाली तालिका का बैकअप लें? इसलिए PhpMyAdmin जैसे प्रोग्राम का उपयोग करना एकमात्र समाधान लगता है (ऊपर दिया गया विकल्प GEOM कॉलम को सही रूप से परिवर्तित करता है)।


1

यदि असफल होने में लंबा समय लगता है, तो wait_timeoutचर को बड़ा करें ।

यदि यह तुरंत विफल हो जाता है, तो max_allowed_packetचर को बढ़ाएं; यह अभी भी काम नहीं करता है, सुनिश्चित करें कि कमांड वैध एसक्यूएल है। खदानों में बिना खर्चे के खदानें थीं जो सब कुछ खराब कर देती थीं।

इसके अलावा, यदि संभव हो, तो 1000 एसक्यूएल कमांड के आवेषण की संख्या को सीमित करने पर विचार करें, कहते हैं, 1000। आप एक स्क्रिप्ट बना सकते हैं जो INSERT ... reintroducing द्वारा एक एकल में से कई कथन बनाता है ... प्रत्येक एन आवेषण का हिस्सा।


1

मुझे एक समान त्रुटि मिली .. इसे हल करने के लिए बस my.ini फ़ाइल खोलें। कहीं भी लाइन 36 में अधिकतम अनुमत पैकेट आकार के मूल्य को परिवर्तित न करें। max_allowed_packet = 20M


1

सुनिश्चित करें कि सिस्टम की तरह सेवा प्रबंधकों के कारण mysqld प्रक्रिया पुनरारंभ नहीं होती है।

मुझे यह समस्या सेंटोस 7 के साथ योनि में थी। कॉन्फ़िगरेशन ट्विक्स ने मदद नहीं की। यह पता चला कि यह बहुत अधिक मेमोरी लेने पर हर बार मायस्कल्ड सेवा को मार डाला गया था।


0

डेटाबेस को डुप्लिकेट करते समय मुझे आज भी ऐसी ही त्रुटि हुई थी (MySQL सर्वर दूर चला गया है ...), लेकिन जब मैंने mysql.server पुनरारंभ करने का प्रयास किया तो मुझे त्रुटि मिली

ERROR! The server quit without updating PID ...

मैंने इसे कैसे हल किया: मैंने एप्लिकेशन / उपयोगिताएँ खोलीं और गतिविधि मॉनिटर चलाया

 quit mysqld

तब त्रुटि समस्या को हल करने में सक्षम था

mysql.server restart

0

मैं कुछ बड़ी गणनाएं कर रहा हूं जिसमें लंबे समय तक रहने और भारी डेटा के साथ mysql कनेक्शन शामिल है। मैं इस का सामना कर रहा था "मस्क़ल जाना मुद्दा"। इसलिए मैंने प्रश्नों का अनुकूलन करने की कोशिश की, लेकिन इससे मुझे मदद नहीं मिली, फिर मैंने mysql वैरिएबल सीमा को बढ़ा दिया जो डिफ़ॉल्ट रूप से कम मूल्य पर सेट है।

wait_timeout max_allowed_packet

आपको जो भी सूट करता है उसे सीमित करने के लिए यह कोई भी संख्या * 1024 (बाइट्स) होनी चाहिए। आप ' mysql -u उपयोगकर्ता नाम - p ' कमांड का उपयोग करके टर्मिनल में प्रवेश कर सकते हैं और इन चर सीमाओं के लिए जाँच और परिवर्तन कर सकते हैं।


0

GoDaddy के लिए साझा होस्टिंग

GoDaddy ने होस्टिंग खातों को साझा किया, यह PHP.ini आदि फ़ाइलों को ट्विक करने के लिए मुश्किल है। हालांकि, एक और तरीका है और यह सिर्फ मेरे लिए पूरी तरह से काम करता है। (मैं अभी एक 3.8Mb .sql पाठ फ़ाइल को सफलतापूर्वक अपलोड करता हूं, जिसमें 3100 पंक्तियाँ और 145 कॉल हैं। phpMyAdmin में महत्वपूर्ण आदेश का उपयोग करके, मुझे मिल रहा था खूंखार MySQL सर्वर दूर चला गया है त्रुटि, और आगे कोई जानकारी नहीं।)

मैंने पाया कि मैट बुचर के पास सही जवाब था। मैट की तरह, मैंने माईएसक्यूएल डेटाबेस को काटने के आकार के चंक्स में निर्यात करने से लेकर स्क्रिप्ट लिखने तक, सभी प्रकार की तरकीबें आजमाई थीं, जो बड़े आयात को छोटे लोगों में तोड़ देती हैं। लेकिन यहाँ क्या काम किया है:

(१) CPANEL ---> फ़ाइलें (समूह) ---> बैकअप

(2a) "आंशिक बैकअप" शीर्षक के
तहत ... (2 बी) "डाउनलोड मायएसक्यूएल डाटाबेस बैकअप डाउनलोड करें"
(2 सी) के तहत अपना डेटाबेस चुनें और बैकअप डाउनलोड करें (यह चरण वैकल्पिक, लेकिन बुद्धिमान)

(3a) सीधे 2b के दाईं ओर, "रिस्टोर a MySQL डेटाबेस बैकअप"
(3b) शीर्षक के तहत अपने स्थानीय ड्राइव से .SQL आयात फ़ाइल चुनें
(3c) सच्ची खुशी आपकी (शीघ्र ही ....) होगी। 5 सेकंड

मैं एकल तालिका आयात करने के लिए इस पद्धति का उपयोग करने में सक्षम था। मेरे डेटाबेस में और कुछ भी प्रभावित नहीं हुआ था - लेकिन यह है कि ऊपर दिए गए कदम (2) से बचाव करना है।

नोट्स:
ए। यदि आप अनिश्चित हैं कि .SQL आयात फ़ाइल कैसे बनाई जाए, तो एक तालिका निर्यात करने और उस फ़ाइल संरचना को संशोधित करने के लिए phpMyAdmin का उपयोग करें।

स्रोत: मैट कसाई 2010 अनुच्छेद


ठीक है, तो एक तत्काल डाउनवोट, लेकिन क्यों के रूप में कोई टिप्पणी नहीं। क्या यह जानकारी किसी के काम नहीं आई? यदि हां, तो कृपया साझा करें - इसने मेरे लिए काम किया, यही वजह है कि मैंने इस उत्तर को जोड़ा। ऊपर दिए गए अन्य उत्तर मेरे काम नहीं आए, लेकिन इस समाधान ने किया। तो नीचे क्यों? यदि आप GoDaddy पर हैं और यह आपके लिए काम नहीं करता है, तो मैं जानना चाहूंगा ताकि मैं सहायता कर सकूं। हालाँकि, यदि आप GoDaddy द्वारा साझा की गई होस्टिंग का उपयोग नहीं कर रहे हैं, तो आप इस उत्तर को केवल इसलिए ही अस्वीकृत कर देंगे क्योंकि यह आपके लिए लागू नहीं होता है ?
cssyphus

0

अगर बढ़ती max_allowed_packetमदद नहीं करता है।

जब आप .sqlअपने डेटाबेस में सीक्वल प्रो के माध्यम से एक फ़ाइल आयात करते हैं तो मुझे भी वही त्रुटि मिल रही थी ।

त्रुटि अभी भी ऊपर उठा रही थीं के बाद कायम max_allowed_packetकरने के लिए 512Mतो मैं बजाय साथ कमांड लाइन में आयात भाग गया:

mysql --verbose -u root -p DatabaseName < MySQL.sql

इसने निम्नलिखित त्रुटि दी:

ASCII '\0' appeared in the statement, but this is not allowed unless option --binary-mode is enabled

मुझे कुछ मददगार StackOverflow प्रश्न मिले:

मेरे मामले में, मेरी .sqlफ़ाइल थोड़ी भ्रष्ट थी या कुछ और थी। MySQL डंप हमें मिलता है दो ज़िप फ़ाइलों में एक साथ और फिर unzipped करने की आवश्यकता है। मुझे लगता है कि शुरुआत में कुछ विषम पात्रों और एन्कोडिंग के साथ फाइल को छोड़कर, अनज़िपिंग बाधित हो गई थी। एक नया MySQL डंप प्राप्त करना और इसे ठीक से खोलना मेरे लिए काम कर रहा है।

बस इसे यहाँ जोड़ना चाहते हैं यदि अन्य लोग पाते हैं कि max_allowed_packetचर को बढ़ाने में मदद नहीं मिल रही थी।


0

पैकेट आकार या टाइमआउट के बारे में किसी भी समाधान ने मेरे लिए कोई फर्क नहीं पड़ा। मुझे ssl को निष्क्रिय करने की आवश्यकता थी

mysql -u -p -hmyhost.com --disable-ssl db < file.sql

https://dev.mysql.com/doc/refman/5.7/en/encrypted-connections.html


0

मुझे एक ही मुद्दा मिला

$image_base64 = base64_encode(file_get_contents($_FILES['file']['tmp_name']) );
$image = 'data:image/jpeg;base64,'.$image_base64;
$query = "insert into images(image) values('".$image."')";
mysqli_query($con,$query);

Phpmyadmin की \ xampp \ mysql \ bin \ my.ini फ़ाइल हमें केवल मिलती है

[mysqldump]
max_allowed_packet=110M

जो सिर्फ mysqldump -u root -p dbname के लिए है। मैंने ऊपर कोड के साथ प्रतिस्थापित करके अपनी समस्या का समाधान किया

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