বেশিরভাগ মানুষ 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 হোস্টনেম একটি সম্পূর্ণ ঠিকানা। এটি একটি হোস্ট এবং নামযুক্ত ইনস্ট্যান্সের ক্ষেত্রে একটি অনুসন্ধান যা টানেল বহন না-ও করতে পারে। পোর্টের নাম দিন, ডিসকভারি পথের নাম দিন, আর পরের ব্যর্থতা বলবে কোন স্তর ঠিক করতে হবে।

সম্পর্কিত নিবন্ধ