رفع خطای 10054 SQL Server: راهنمای جامع اتصال قطع شده توسط میزبان راه دور
خطای 10054 در SQL Server، با توضیح “Connection forcibly closed by the remote host – Network / TCP error”، یکی از خطاهای رایج اتصال است که هر توسعهدهنده یا مدیر پایگاه داده SQL Server ممکن است با آن مواجه شود. این خطا معمولاً نشاندهنده مشکلی در لایه شبکه یا پروتکل TCP/IP است که باعث میشود ارتباط بین کلاینت (مانند SSMS، یک اپلیکیشن) و سرور SQL به صورت ناگهانی و اجباری قطع شود. در واقع، این پیام خطا بیان میکند که سرور یا یک دستگاه میانی در مسیر شبکه، اتصال را بدون اطلاعرسانی صحیح به کلاینت قطع کرده است. این سناریو میتواند بسیار چالشبرانگیز باشد، زیرا اغلب ریشه مشکل خارج از خود موتور SQL Server قرار دارد و نیاز به بررسی زیرساخت شبکه، فایروالها و تنظیمات سیستم عامل دارد. درک صحیح این خطا و روشهای عیبیابی آن، برای حفظ پایداری و عملکرد سیستمهای مبتنی بر SQL Server حیاتی است. این مقاله به صورت جامع به بررسی علتها، سناریوهای رایج و راهکارهای عملی برای رفع خطای 10054 در SQL Server میپردازد.
علل خطای 10054 در SQL Server
خطای 10054 یک خطای عمومی شبکه است و میتواند به دلایل مختلفی رخ دهد. درک این دلایل کلید اصلی برای عیبیابی موفقیتآمیز است. عمده دلایل این خطا شامل موارد زیر هستند:
1. **فایروال (Firewall):**
فایروالها، چه در سمت کلاینت، چه در سمت سرور SQL و چه در شبکه میانی (مانند فایروالهای سختافزاری)، یکی از شایعترین علل قطع ناگهانی اتصالات هستند. اگر فایروال پورت مورد استفاده SQL Server (معمولاً 1433 برای نمونه پیشفرض) را مسدود کند یا قانون مشخصی برای اجازه ارتباط نداشته باشد، اتصال به محض برقراری یا حتی در حین فعالیت، توسط فایروال بسته میشود.
2. **تنظیمات نادرست شبکه در سرور SQL:**
عدم فعالسازی پروتکل TCP/IP در SQL Server Configuration Manager یا پیکربندی نادرست آن (مانند گوش ندادن به پورت یا آدرس IP اشتباه) میتواند منجر به این خطا شود.
3. **قطعی یا بیثباتی شبکه:**
مشکلات فیزیکی یا منطقی در شبکه، مانند خرابی کابل، مشکل در سوئیچها، روترها، کارت شبکه یا حتی بیثباتی کلی در اتصال شبکه (مانند Wi-Fi ضعیف)، میتواند باعث از دست رفتن ناگهانی اتصال شود.
4. **توقف یا راهاندازی مجدد سرویس SQL Server:**
اگر سرویس SQL Server در حین اتصال فعال کلاینتها متوقف شود یا به هر دلیلی راهاندازی مجدد شود، تمام اتصالات فعال به صورت اجباری قطع شده و کلاینتها خطای 10054 را دریافت میکنند.
5. **تایماوتهای (Timeouts) اتصال و کوئری:**
گاهی اوقات، کلاینت یک تایماوت مشخص برای برقراری یا حفظ اتصال دارد. اگر سرور SQL نتواند در زمان مقرر پاسخ دهد (مثلاً به دلیل اجرای یک کوئری بسیار طولانی، بارگذاری بالای سرور یا بنبستهای پایگاه داده)، کلاینت ممکن است اتصال را قطع کرده و سپس سرور اقدام به بستن آن کند، که به صورت خطای 10054 در سمت کلاینت ظاهر میشود. تایماوتهای سمت سرور نیز میتوانند منجر به قطع اتصال شوند.
6. **آنتیویروس و نرمافزارهای امنیتی:**
برخی نرمافزارهای آنتیویروس یا امنیتی ممکن است فعالیتهای شبکه SQL Server را به اشتباه به عنوان تهدید شناسایی کرده و اتصالات را قطع کنند.
7. **مشکلات در درایورهای کلاینت یا نسخههای ناسازگار:**
در موارد نادر، استفاده از درایورهای قدیمی یا ناسازگار SQL Server Native Client در سمت کلاینت میتواند منجر به مشکلات اتصال شود.
8. **اشباع پورتها (Port Exhaustion):**
در سیستمهای کلاینت یا سرور با بار کاری بسیار بالا، ممکن است پورتهای TCP/IP موقت (Ephemeral Ports) به اتمام برسند، که از برقراری اتصالات جدید یا حفظ اتصالات موجود جلوگیری میکند.
9. **مشکلات سیستم عامل سرور:**
مسائلی مانند کمبود منابع (حافظه، CPU) در سرور، آپدیتهای در حال انجام سیستم عامل که نیاز به راهاندازی مجدد دارند یا مشکلات دیگر در خود سیستم عامل میزبان SQL Server نیز میتوانند به قطع ناگهانی اتصالات منجر شوند.
راهکارهای عملی رفع خطای 10054 در SQL Server
برای رفع خطای 10054، باید یک رویکرد سیستماتیک برای عیبیابی در پیش گرفت. راهکارهای زیر به صورت مرحلهای و عملی برای شناسایی و رفع مشکل ارائه شدهاند:
1. بررسی وضعیت سرویس SQL Server
اولین گام اطمینان از این است که سرویس SQL Server فعال و در حال اجراست. اگر سرویس متوقف شده باشد، کلاینت نمیتواند به آن متصل شود.
* **مراحل:**
1. به سرور SQL Server وارد شوید.
2. “SQL Server Configuration Manager” را باز کنید.
3. به بخش “SQL Server Services” بروید.
4. اطمینان حاصل کنید که وضعیت سرویس “SQL Server (نام نمونه)” در حالت “Running” باشد.
5. اگر سرویس متوقف شده بود، آن را راهاندازی کنید.
2. بررسی پیکربندی شبکه SQL Server (TCP/IP)
SQL Server برای پذیرش اتصالات شبکه از پروتکل TCP/IP استفاده میکند که باید فعال و به درستی پیکربندی شده باشد.
* **مراحل:**
1. در “SQL Server Configuration Manager”، به بخش “SQL Server Network Configuration” و سپس “Protocols for [نام نمونه]” بروید.
2. اطمینان حاصل کنید که “TCP/IP” فعال (Enabled) باشد.
3. بر روی “TCP/IP” راستکلیک کرده و “Properties” را انتخاب کنید.
4. در تب “IP Addresses”، در قسمت “IPAll”، “TCP Dynamic Ports” را خالی (بدون مقدار) بگذارید تا SQL Server از پورت پیشفرض 1433 استفاده کند یا یک پورت استاتیک مشخص کنید (مثلاً 1433 را در “TCP Port” وارد کنید). اگر از چندین نمونه SQL Server استفاده میکنید، هر نمونه باید پورت متفاوتی داشته باشد.
5. پس از هر تغییری، سرویس SQL Server را راهاندازی مجدد کنید.
6. میتوانید برای مشاهده پروتکلهای فعال و اتصالات، از کوئری زیر در SSMS (اگر بتوانید موقتاً متصل شوید) استفاده کنید:
SELECT net_transport, auth_scheme, local_tcp_port, client_net_address
FROM sys.dm_exec_connections
WHERE session_id = @@SPID;
این کوئری اطلاعات مربوط به اتصال فعلی شما را نمایش میدهد، از جمله پروتکل شبکه و پورت TCP محلی.
3. بررسی تنظیمات فایروال
فایروال یکی از رایجترین موانع اتصال است.
* **مراحل:**
1. **فایروال ویندوز در سرور SQL:**
* “Windows Defender Firewall with Advanced Security” را باز کنید.
* به “Inbound Rules” بروید.
* مطمئن شوید یک قانون برای اجازه دادن به ترافیک ورودی به پورت SQL Server (معمولاً 1433 یا پورت سفارشی شما) وجود دارد. این قانون باید برای پروتکل TCP باشد.
* همچنین، فایل اجرایی SQL Server (sqlservr.exe) را نیز میتوان به لیست استثنائات فایروال اضافه کرد که معمولاً در مسیر `C:\Program Files\Microsoft SQL Server\MSSQLXX.MSSQLSERVER\MSSQL\Binn\sqlservr.exe` قرار دارد (مسیر دقیق به نسخه SQL Server و نام نمونه بستگی دارد).
2. **فایروال در سمت کلاینت:**
* فایروال کلاینت را نیز بررسی کنید تا مطمئن شوید ترافیک خروجی به پورت SQL Server مسدود نشده باشد.
3. **فایروالهای شبکه میانی:**
* اگر سرور و کلاینت در سگمنتهای شبکه متفاوت یا پشت روترها/فایروالهای سختافزاری هستند، با مدیر شبکه خود تماس بگیرید تا مطمئن شوید پورت SQL Server بین این دو مجاز است.
4. عیبیابی اتصال شبکه
مشکلات لایه شبکه میتواند منجر به قطع اتصال شود.
* **مراحل:**
1. **Ping:** از کلاینت، سرور SQL را پینگ کنید تا از دسترسی اولیه شبکه مطمئن شوید.
ping [IP_Address_of_SQL_Server]
اگر پینگ موفقیتآمیز نبود، مشکل در دسترسی اولیه شبکه است.
2. **Telnet:** از Telnet برای بررسی باز بودن پورت SQL Server استفاده کنید. (اگر Telnet نصب نیست، باید آن را از “Turn Windows features on or off” فعال کنید.)
telnet [IP_Address_of_SQL_Server] [Port_Number]
به عنوان مثال: `telnet 192.168.1.100 1433`. اگر صفحه سیاهی ظاهر شود و سپس ناپدید شود یا پیغام “Connection refused” دریافت کنید، به این معنی است که پورت بسته است یا سرویس SQL Server روی آن پورت گوش نمیدهد. اگر صفحه سیاه باقی بماند، اتصال برقرار شده است.
3. **Trace Route:** برای تشخیص مشکلات مسیریابی شبکه از `tracert` استفاده کنید:
tracert [IP_Address_of_SQL_Server]
این دستور به شما نشان میدهد که بستههای داده از چه مسیرهایی عبور میکنند و کجا ممکن است متوقف شوند.
4. **بررسی کابلها و دستگاههای شبکه:** از سلامت کابلهای شبکه، سوئیچها و روترها اطمینان حاصل کنید.
5. مدیریت تایماوتها
تایماوتهای نامناسب میتوانند به قطع اتصال منجر شوند.
* **مراحل:**
1. **افزایش Connection Timeout در کلاینت:** در رشته اتصال (Connection String) یا تنظیمات ابزار کلاینت (مانند SSMS)، مقدار `Connection Timeout` را افزایش دهید.
مثال رشته اتصال:
Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Connection Timeout=30;
افزایش `Connection Timeout` به یک مقدار بالاتر (مثلاً 60 یا 90 ثانیه) میتواند کمک کند.
2. **بررسی Command Timeout:** اگر کوئریهای طولانی دارید، `Command Timeout` (که `SQLCommand.CommandTimeout` در ADO.NET است) را در کد برنامه کلاینت خود افزایش دهید.
SqlCommand command = new SqlCommand("WAITFOR DELAY '00:00:45';", connection);
command.CommandTimeout = 60; // Set to 60 seconds
این پارامتر، مدت زمانی را مشخص میکند که یک دستور SQL میتواند قبل از لغو شدن اجرا شود.
3. **بررسی تنظیمات سمت سرور:** بررسی کنید که آیا تایماوتهای شبکه یا کوئری در سطح SQL Server Global Trace Flags یا تنظیمات پیشرفته سرور اعمال شدهاند که ممکن است اتصالات را قطع کنند.
برای مشاهده تنظیمات ارتباطات کاربر میتوانید از کوئری زیر استفاده کنید:
EXEC sp_configure 'remote query timeout (s)';
EXEC sp_configure 'query wait (s)';
این مقادیر بر رفتار تایماوت کوئریهای راه دور و انتظارات کلی کوئری تاثیر میگذارند.
6. بررسی Logهای SQL Server و Event Viewer
لاگهای سیستم و SQL Server میتوانند سرنخهای مهمی در مورد علت قطع اتصال ارائه دهند.
* **مراحل:**
1. **SQL Server Error Log:** در SSMS، به “Management” -> “SQL Server Logs” بروید و لاگها را بررسی کنید. به دنبال پیغامهایی باشید که درست قبل از وقوع خطای 10054 در کلاینت ظاهر شدهاند، مانند خطاهای مربوط به عدم پایداری، راهاندازی مجدد سرویس، یا مشکلات منابع.
2. **Windows Event Viewer:**
* در سرور SQL، “Event Viewer” را باز کنید.
* به “Windows Logs” -> “Application” و “System” بروید.
* به دنبال خطاهای مرتبط با SQL Server، شبکه یا سیستم عامل در زمان وقوع مشکل باشید. به خصوص به Event ID 10054 در لاگهای سیستمی دقت کنید که میتواند ریشه مشکل شبکه را نشان دهد.
7. بررسی آنتیویروس و نرمافزارهای امنیتی
گاهی اوقات، نرمافزارهای امنیتی میتوانند مزاحمت ایجاد کنند.
* **مراحل:**
1. به صورت موقت (و با احتیاط در محیطهای تست)، آنتیویروس یا فایروال نرمافزاری را غیرفعال کنید و مجدداً اتصال را تست کنید. اگر مشکل برطرف شد، باید قوانین مناسبی در آنتیویروس برای SQL Server تعریف کنید.
8. بهروزرسانی درایورها و کامپوننتهای کلاینت
استفاده از نسخههای قدیمی یا ناسازگار میتواند مشکلساز باشد.
* **مراحل:**
1. اطمینان حاصل کنید که آخرین نسخه SQL Server Native Client (یا ADO.NET Data Provider/ODBC Driver) را در سمت کلاینت نصب کردهاید. بهروزرسانی این درایورها میتواند مشکلات سازگاری را برطرف کند.
2. برای مشاهده اطلاعات درایورهای استفاده شده در SSMS میتوانید به `Help -> About` در SSMS بروید.
9. بررسی اشباع پورتهای موقت (Ephemeral Ports)
در سیستمهایی با تعداد بسیار زیاد اتصال همزمان یا متوالی، پورتهای موقت ممکن است به اتمام برسند.
* **مراحل:**
1. برای بررسی محدوده پورتهای موقت در ویندوز، از خط فرمان `cmd` با دسترسی مدیر استفاده کنید:
netsh int ipv4 show dynamicport tcp
یا
netsh int ipv6 show dynamicport tcp
محدوده پیشفرض معمولاً از 49152 تا 65535 است.
2. برای افزایش این محدوده (در صورت نیاز و با احتیاط)، میتوانید از دستورات زیر استفاده کنید (این کار نیاز به راهاندازی مجدد سیستم دارد):
netsh int ipv4 set dynamicport tcp start=10000 num=50000
این دستور محدوده را از 10000 تا 59999 تنظیم میکند. این راهکار در موارد خاص با حجم بالای اتصالات مورد نیاز است.
با دنبال کردن این مراحل به ترتیب و با دقت، میتوانید ریشه خطای 10054 را شناسایی کرده و آن را برطرف سازید. توجه داشته باشید که این خطا معمولاً یک مشکل خارجی برای SQL Server است و نه یک باگ داخلی، بنابراین تمرکز اصلی باید بر روی محیط شبکه و سیستم عامل باشد.