अधिकांश लोग SQL Server के होस्टनाम को पूरा पता मानते हैं, और VPN को या तो अनुमत या नहीं। व्यवहार में नामित इंस्टेंस क्लाइंट को DNS के बाद दूसरी खोज करने पर मजबूर करता है, और टनल सबसे अधिक बार उसी खोज को तोड़ती है। स्पष्ट एंडपॉइंट उससे बच जाता है, इसीलिए tcp:host,port काम कर सकता है जबकि host\INSTANCE समय-सीमा पर पहुँच जाता है। अंतर सेवा खोजने और उसका उपयोग करने की अनुमति मिलने के बीच है।

भ्रम: एक होस्टनाम का अर्थ एक पोर्ट

होस्टनाम एक पते में हल होता है, और वहीं उसका काम खत्म होता है। नामित इंस्टेंस एक इंस्टेंस नाम जोड़ता है जिसे सर्वर को TCP पोर्ट में बदलना होता है, और क्लाइंट उसका अनुमान नहीं लगा सकता। पोर्ट 1433 डिफ़ॉल्ट इंस्टेंस के लिए डिफ़ॉल्ट है, मशीन के हर इंस्टेंस का गुण नहीं। दोनों को एक ही चीज मानने से क्लासिक लक्षण बनता है: ping काम करता है, DNS काम करता है, 1433 का स्कैन कुछ नहीं दिखाता, और निष्कर्ष यह निकलता है कि नेटवर्क SQL को ब्लॉक करता है।

दूसरी धारणा भी उसी तरह विफल होती है: कि TCP 1433 खोलना पर्याप्त है। अगर इंस्टेंस कहीं और सुनता है, तो खुला 1433 केवल यह सिद्ध करता है कि वहाँ कुछ और है। पोर्ट को श्रोता से मेल खाना चाहिए, और कि श्रोता सर्वर पक्ष का कॉन्फ़िगरेशन विवरण है, यह पूछा जाना चाहिए, अनुमान नहीं लगाया जाना चाहिए।

क्लाइंट नामित इंस्टेंस के साथ वास्तव में क्या करता है

होस्ट हल करने के बाद क्लाइंट UDP 1434 पर SQL Server Browser को डिस्कवरी अनुरोध भेजता है और पूछता है कि नामित इंस्टेंस कौन सा पोर्ट उपयोग करता है। ब्राउज़र सेवा सर्वर की अपनी रजिस्ट्री से उत्तर देती है, और फिर क्लाइंट उस पोर्ट पर TCP कनेक्शन खोलता है। लॉगिन का प्रयास होने से पहले ही दो प्रोटोकॉल और दो पोर्ट शामिल होते हैं।

nslookup sqlhost.corp.example
nc -vzu sqlhost.corp.example 1434
Get-Service -Name SQLBrowser

इसीलिए केवल UDP का ब्लॉक ऐसा टाइमआउट पैदा करता है जो मृत होस्ट जैसा दिखता है। अगर ब्राउज़र सेवा बंद या निष्क्रिय है, तो डिस्कवरी अनुरोध बिना उत्तर रह जाता है, भले ही डेटाबेस इंजन चल रहा हो और उसका TCP पोर्ट खुला हो। अगर इंस्टेंस स्थिर पोर्ट पर कॉन्फ़िगर है, तो क्लाइंट फिर भी पूछता है, जब तक उसे सीधे एंडपॉइंट न दिया गया हो। इनमें से हर विफलता एप्लिकेशन के त्रुटि संदेश में एक जैसी दिखती है, और उन्हें अलग-अलग सुधार चाहिए।

ब्राउज़र सेवा डिस्कवरी की सुविधा है, डेटाबेस नहीं। उसे रोकने से इंजन नहीं रुकता, और उसे शुरू करने से इंस्टेंस का TCP पोर्ट नहीं खुलता।

जब नाम काम नहीं करता तो स्पष्ट एंडपॉइंट क्यों काम करता है

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

sqlcmd -S "tcp:sqlhost.corp.example,51433" -U app_login -Q "SELECT @@SERVERNAME"
Test-NetConnection sqlhost.corp.example -Port 51433

अगर स्पष्ट रूप सफल होता है और नामित रूप विफल होता है, तो कमी डिस्कवरी में है, और आप चुन सकते हैं कि इसे कैसे बंद करें: टनल के माध्यम से UDP 1434 की अनुमति दें, या व्यवस्थापक से स्थिर पोर्ट तय करने और एंडपॉइंट का दस्तावेज़ीकरण करने को कहें। दोनों अलग-अलग रखरखाव लागत वाले जानबूझकर लिए गए निर्णय हैं। रेंज का हर पोर्ट खोलना इनमें से कोई नहीं है, और लंबे दिन के अंत में आमतौर पर यही विकल्प सुझाया जाता है। कनेक्शन स्ट्रिंग जहाँ रहते हैं वहाँ चुनाव दर्ज करें।

अगर कोई भी रूप काम नहीं करता, तो समस्या डिस्कवरी से ऊपर है। ब्राउज़र सेवा को दोष देने से पहले श्रोता, मार्ग और उस पोर्ट के लिए एक्सेस नियम जाँचें जो इंस्टेंस वास्तव में उपयोग करता है।

डिस्कवरी के बाद: प्रमाणीकरण और पहचान अलग हैं

लॉगिन विफलता टाइमआउट से अलग घटना है, और टनल होने से VPN पहचान SQL लॉगिन नहीं बन जाती। एक बार क्लाइंट सही पोर्ट पर पहुँच जाए, तो डेटाबेस इंजन अपना प्रमाणीकरण और अनुमतियाँ लागू करता है। दोनों चरणों को एक टिकट में मिलाना ही वह तरीका है जिससे डिस्कवरी की समस्या गलत टीम को सौंपी जाती है। कुछ भी बदलने से पहले त्रुटि संख्या पढ़ें।

अगर ड्राइवर सर्वर का प्रमाणपत्र सत्यापित करता है तो दस्तावेज़ीकृत होस्टनाम रखें, क्योंकि संख्यात्मक पते से जुड़ना मूल समस्या हल करने के बजाय उस जाँच को बदल सकता है। हाल के Microsoft ड्राइवर डिफ़ॉल्ट रूप से एन्क्रिप्ट करते हैं, इसलिए नाम की असंगति सफल TCP कनेक्शन के बाद प्रमाणपत्र त्रुटि के रूप में सामने आती है। यह नई विफलता नहीं, प्रगति है।

जिस भ्रम को छोड़ना चाहिए वह यह है कि SQL Server का होस्टनाम पूरा पता है। यह एक होस्ट है और नामित इंस्टेंस के लिए एक खोज जोड़ता है जिसे टनल शायद न ले जाए। पोर्ट का नाम दें, डिस्कवरी पथ का नाम दें, और अगली विफलता बताएगी कि कौन सी परत ठीक करनी है।

संबंधित लेख