一、问题
有一对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后,这个问题就又会暴露出来了。