यह यहाँ मेरे जवाब से लगभग शब्दशः लिया गया है , लेकिन मुझे पता है कि हम SO पर लिंक-ओनली उत्तरों पर ही भौंकते हैं, इसलिए मुझे लगता है कि आप लोग भी ऐसा करते हैं :-)
यदि आपको यह समस्या हो रही है और विंडोज 7 से पहले विंडोज के एक संस्करण का उपयोग कर रहे हैं, तो यह शायद आपकी समस्या का जवाब नहीं है।
ये क्यों हो रहा है?
इस समस्या का कारण IPv4 बनाम IPv6 है।
जब आप IP पते के बजाय एक होस्ट नाम का उपयोग करते हैं, तो MySQL क्लाइंट पहले AAAA
नाम के लिए (IPv6) होस्ट लुकअप चलाता है , और यदि IPv6 पते के लिए सफलतापूर्वक नाम हल करता है, तो पहले इस पते की कोशिश करता है। यदि या तो चरण विफल होता है (नाम समाधान या कनेक्शन) तो यह IPv4 पर वापस आ जाएगा, एक A
लुकअप चलाने और इसके बजाय इस होस्ट को आज़माने के लिए।
व्यवहार में इसका मतलब यह है कि यदि IPv6 localhost
लुकअप सफल है, लेकिन MySQL IPv6 लूपबैक के लिए बाध्य नहीं है, तो आपको IPv4 फ़ॉलबैक होने से पहले एक कनेक्शन टाइमआउट चक्र की प्रतीक्षा करनी होगी और कनेक्शन सफल हो जाएगा।
यह विंडोज 7 से पहले का मुद्दा नहीं था, क्योंकि localhost
मेजबानों की फाइल के माध्यम से रिजॉल्यूशन किया गया था, और यह केवल प्री-कॉन्फिगर हो गया 127.0.0.1
- यह IPv6 समकक्ष के साथ नहीं आया ::1
।
विंडोज 7 के बाद से, हालांकि, localhost
रिज़ॉल्यूशन को डीएनएस रिज़ॉल्वर में बनाया गया है, यहां उल्लिखित कारणों से । इसका अर्थ है कि IPv6 लुकअप अब सफल हो जाएगा - लेकिन MySQL उस IPv6 पते से बँधा नहीं है, इसलिए कनेक्शन विफल हो जाएगा, और आपको इस प्रश्न में उल्लिखित विलंब दिखाई देगा।
यह अच्छा है। बस मुझे बताएं कि इसे पहले से ही कैसे ठीक किया जाए!
आपके पास कुछ विकल्प हैं। इंटरनेट के चारों ओर देखते हुए, सामान्य "समाधान" के नाम के बजाय स्पष्ट रूप से आईपी पते का उपयोग करना प्रतीत होता है, लेकिन ऐसा न करने के कुछ कारण हैं, दोनों पोर्टेबिलिटी संबंधित हैं, दोनों यकीनन महत्वपूर्ण नहीं हैं:
यदि आप अपनी स्क्रिप्ट को किसी अन्य मशीन पर ले जाते हैं जो केवल IPv6 का समर्थन करती है, तो आपकी स्क्रिप्ट अब काम नहीं करेगी।
यदि आप अपनी स्क्रिप्ट को * nix- आधारित होस्टिंग वातावरण में स्थानांतरित करते हैं, तो जादुई स्ट्रिंग localhost
का अर्थ होगा कि MySQL क्लाइंट एक यूनिक्स सॉकेट का उपयोग करना पसंद करेगा यदि कोई कॉन्फ़िगर किया गया है, तो यह आईपी लूपबैक आधारित कनेक्टिविटी की तुलना में अधिक कुशल है।
वे हालांकि बहुत महत्वपूर्ण ध्वनि?
वे नहीं कर रहे हैं आपको अपना एप्लिकेशन डिज़ाइन करना चाहिए ताकि कॉन्फ़िगरेशन फ़ाइल में इस तरह की चीज़ परिभाषित हो। यदि आप अपनी स्क्रिप्ट को किसी अन्य वातावरण में ले जाते हैं, तो संभावना है कि अन्य चीजों को भी कॉन्फ़िगर करने की आवश्यकता होगी।
सारांश में, आईपी पते का उपयोग करना सबसे अच्छा समाधान नहीं है, लेकिन यह सबसे अधिक स्वीकार्य है।
तो सबसे अच्छा उपाय क्या है?
सबसे अच्छा तरीका यह होगा कि MySQL सर्वर द्वारा उपयोग किए जाने वाले बाइंड एड्रेस को बदल दिया जाए। हालांकि, यह उतना आसान नहीं है जितना कोई पसंद कर सकता है। अपाचे, नग्नेक्स और लगभग हर दूसरे साने नेटवर्क सर्विस एप्लिकेशन के विपरीत, MySQL केवल एक बाइंड पते का समर्थन करता है, इसलिए यह केवल एक और जोड़ने का मामला नहीं है। सौभाग्य से, ऑपरेटिंग सिस्टम यहां जादू का समर्थन करते हैं, इसलिए हम MySQL को IPv4 और IPv6 दोनों का एक साथ उपयोग करने में सक्षम कर सकते हैं।
आपको MySQL 5.5.3 या बाद का संस्करण चलाने की आवश्यकता है, और आपको --bind-address=
कमांड लाइन तर्क के साथ MySQL शुरू करने की आवश्यकता है । आपके पास 4 विकल्प डॉक्स हैं , जो आप करना चाहते हैं उसके आधार पर:
जिस से आप शायद परिचित हैं, और जिसको आप उपयोग करने की सबसे अधिक संभावना है (प्रभावी रूप से) 0.0.0.0
। यह मशीन पर उपलब्ध सभी IPv4 पतों को बांधता है। यह वास्तव में शायद सबसे अच्छी बात नहीं है, भले ही आप आईपीवी 6 के बारे में परवाह न करें, क्योंकि यह समान सुरक्षा जोखिमों से ग्रस्त है ::
।
एक स्पष्ट IPv4 या IPv6 पता (उदाहरण के लिए 127.0.0.1
या ::1
लूपबैक के लिए)। यह सर्वर को उस पते पर बांधता है और केवल उस पते को।
जादू की तार ::
। यह MySQL को IPv4 और IPv6 मोड में मशीन, लूपबैक और फिजिकल इंटरफेस एड्रेस दोनों पर हर पते पर बाँध देगा। यह संभावित रूप से एक सुरक्षा जोखिम है, केवल तभी करें जब आपको दूरस्थ होस्ट से कनेक्शन स्वीकार करने के लिए MySQL की आवश्यकता हो।
IPv4- मैप्ड IPv6 पते का उपयोग करें । यह 4 -> 6 संक्रमण के दौरान पीछे की संगतता के लिए IPv6 में बनाया गया एक विशेष तंत्र है, और यह आपको एक विशिष्ट IPv4 पते से बांधने की अनुमति देता है और यह IPv6 के बराबर है। यह आपके लिए "दोहरे लूपबैक" पते के अलावा किसी अन्य चीज़ के लिए उपयोगी होने की संभावना नहीं है ::ffff:127.0.0.1
। यह ज्यादातर लोगों के लिए सबसे अच्छा समाधान है, केवल लूपबैक के लिए बाध्य है, लेकिन आईपीवी 4 और आईपीवी 6 कनेक्शन दोनों की अनुमति देता है।
क्या मुझे होस्ट फ़ाइल को संशोधित करने की आवश्यकता है?
सं । होस्ट फ़ाइल को संशोधित न करें। DNS रिज़ॉल्वर जानता है कि इसके साथ क्या करना है localhost
, इसे फिर से परिभाषित करने का कोई प्रभाव नहीं होगा, और सबसे खराब रूप से रिज़ॉल्वर से नरक को भ्रमित करेगा।
किस बारे में --skip-name-resolve
?
यह संबंधित, लेकिन थोड़ा अलग कारण से भी समस्या को ठीक कर सकता है।
इस कॉन्फ़िगरेशन विकल्प के बिना, MySQL PTR
DNS क्वेरी के माध्यम से होस्टनाम के लिए सभी क्लाइंट कनेक्शन आईपी पते को हल करने का प्रयास करेगा । यदि आपका MySQL सर्वर पहले से ही IPv6 का उपयोग करने में सक्षम है, लेकिन कनेक्शन अभी भी लंबा समय ले रहे हैं, तो यह हो सकता है क्योंकि रिवर्स DNS ( PTR
) रिकॉर्ड सही तरीके से कॉन्फ़िगर नहीं किया गया है।
नाम रिज़ॉल्यूशन को अक्षम करने से यह समस्या ठीक हो जाएगी, लेकिन इसमें अन्य व्यवधान हैं, विशेष रूप से यह कि Host
कंडीशन में DNS नाम का उपयोग करने के लिए कॉन्फ़िगर की गई कोई भी एक्सेस अनुमतियाँ अब विफल हो जाएंगी।
यदि आप ऐसा करने जा रहे हैं, तो आपको नामों के बजाय आईपी पते का उपयोग करने के लिए अपने सभी अनुदानों को कॉन्फ़िगर करने की आवश्यकता होगी।