SQL Server2008突然连接不到本地数据库

时间:2022-03-14 14:14:26

一、问题

  有一对SQL Server2008服务器,采用主备双节点架构,分别是A1和A2,目前群集资源都挂在A2上。开发人员通过A2登录系统进行程序开发,近一年都没有问题,前几天突然发现在A2上使用SSMS(SQL Server Management Studio)无法登录SQL Server,但应用却没有任何问题。

--SQL Server2008的版本信息如下:

  Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (X64)   Mar 29 2009 10:11:52   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2)

二、解决

  由于从A2无法登录,但应用却没有问题,初步判断是A2上的客户端有故障。后来和微软工程师沟通后确认这是SQL Server2008的bug。我将这个故障的排查步骤列在下面,如果有相同的现象基本可以确定是同样的问题。

1.启动cmd输入如下命令

C:\Users\XXX>cd\

C:\>netstat -an >ports.txt

C:\>ports.txt

2.打开ports.txt文档后,我节选了一部分:

  TCP    10.x.x.12:65296      10.x.x.15:1433       TIME_WAIT
  TCP    10.x.x.12:65297      10.x.x.15:1433       TIME_WAIT
  TCP    10.x.x.12:65298      10.x.x.15:1433       TIME_WAIT
  TCP    10.x.x.12:65299      10.x.x.15:1433       TIME_WAIT
  TCP    10.x.x.12:65300      10.x.x.15:1433       TIME_WAIT
  TCP    10.x.x.12:65301      10.x.x.15:1433       TIME_WAIT
  TCP    10.x.x.12:65302      10.x.x.15:1433       TIME_WAIT
  TCP    10.x.x.12:65303      10.x.x.15:1433       TIME_WAIT
  TCP    10.x.x.12:65304      10.x.x.15:1433       TIME_WAIT
  TCP    10.x.x.12:65305      10.x.x.15:1433       TIME_WAIT
  TCP    10.x.x.12:65306      10.x.x.15:1433       TIME_WAIT
  TCP    10.x.x.12:65307      10.x.x.15:1433       TIME_WAIT

(我将网络拓扑细节隐藏掉了。)

10.x.x.12是A2的物理ip,10.x.x.15是SQL Server的ip。看这段netstat信息可以发现,A2的物理ip不断的连接SQL Server的ip,真实的过程是A2通过本地的SSMS连接到本地的数据库服务。因为SQL Server2008本身的bug,导致发起连接一端的port一直不释放,长年累月的积累将端口占用没了,一旦port值达到上限的65535,则SSMS无法连接数据库,而且应用连接数据库完全正常!

3.将服务切换至A1,再重启A2主机后,这些端口就释放了,之后就可以通过A2的SSMS登录数据库了。但是,一旦登录次数多了后,port值达到了上限65535后,这个问题就又会暴露出来了。