MSDE2000与SQLExpress2005共存时如何远程访问

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

昨天被一个数据库的问题折腾了半天,把解决过程记录下来。

 

[项目背景]

基于MSSQL的一个项目,考虑到用户环境可能没有数据库系统,因此自带了MSDE 2000 SP4,允许用户选装。整个项目由多个服务构成,允许分布式安装,因此安装MSDE时开启了远程访问。

PS:我知道分布式系统还允许用户用MSDE确实挺BT的,不过项目就这么要求的,没办法。

 

[问题]

在一台Windows Server 2008上部署系统,选择安装MSDE,结果数据库实例无法连接,导致安装失败。

先用osql.exe尝试连接了一下:

 

 
  1. osql.exe -S x.x.x.x\InstanceName -U sa -P PASS 

连接失败,无论本机还是远程都不行,排除了防火墙问题。

用svrnetcn命令检查协议,有TCP/IP协议,端口号是随机的45592,然后再用osql.exe指定端口号连接了一下:

 
  1. osql.exe -S x.x.x.x\InstanceName,45592 -U sa -P PASS 

这回成功了,而且本机和远程都能连上。

 

[分析与解决]

对应用程序来说,要访问远程服务器上的MSDE,它是如何知道该连接哪个端口呢?在启用了TCP/IP协议的情况下,sqlservr.exe(MSSQL服务程序)除了开启指定的tcp端口(比如本例中的45592),还会开启一个固定的udp 1434。这样应用程序先通过udp询问,得到指定实例对应的tcp端口号,再发起连接。

执行“netstat -ano | findstr 1434”看了一下,果然没有udp1434,但tcp 45592是处于监听状态的。

为了对比,特意找了另一台正常的机器看了一下,有udp 1434的监听,进程就是msde的服务进程sqlservr.exe。

看来是有程序干扰了MSDE的服务监听udp 1434,但又肯定不是端口冲突,没有进程在使用这个端口。进系统服务看了一下,结果发现这台机器上还随着Visual Studio 2005安装了SQL Express 2005(实例名sqlexpress),但几个服务都没有处于启动状态。

对MSSQL 2005系列来说,udp 1434不再由sqlservr提供了,而是改到了一个叫SQL Server Browser的服务上,看来MSDE在启动的时候,受2005的影响(虽说sqlbrowser服务并没有启动),不知出于什么原因,没有开启udp1434或是开启失败了,导致命名实例无法解析。

net start一下这个sqlbrowser服务,猜测它会接管对两个命名实例的解析,满心欢喜的以为问题能解决,结果对2005的实例能解析,msde的实例依然不行,晕倒。

开始上网查阅资料,无果。

为什么sqlbrowser服务不解析msde的实例呢?尝试用调试方式启动了sqlbrowser,想碰碰运气,这个文件在 C:\Program Files\Microsoft SQL Server\90\Shared 目录下:

 
  1. C:\Program Files\Microsoft SQL Server\90\Shared>sqlbrowser.exe -c 
  2. SQLBrowser: starting up in console mode 
  3. SQLBrowser: starting up SSRP redirection service 
  4. SQLBrowser is successfully listening on ::[1434] 
  5. SQLBrowser is successfully listening on 0.0.0.0[1434] 
  6. [8052]: Waiting for next request... 
  7. [6676]: Waiting for next request... 
  8. [6676]: Received request... 
  9. [8052]: Received request... 
  10. [6676]: Waiting for next request... 
  11. [8052]: Waiting for next request... 

然后再用osql连接,居然成功了,远程也可以了。

为何服务方式不行而命令行可以?两者最大的区别应该是运行帐号的问题,去服务里查了一下,SQL Server Browser服务是用Network Service帐户启动的,而产品中安装MSDE时用的是admin权限,猜测sqlbrowser以服务方式启动时,尝试去读MSDE的某些配置失败,因此无法为其提供解析服务。

把sqlbrowser服务切换到local system下,再试,一切正常了。为了防止有缓存的问题,特意重启了机器,证明确实是OK了。

 

[解决方案]

原因是找到了,不过只能说是找到了MSDE和SQL Express并存的方法,对于产品来说,问题还未解决,想了想,有以下几种解决方案:

方案一:

完全卸载SQL Express 2005,保证机器上只有MSDE,没有冲突就没有问题。不过对于一个产品来说,对用户的环境要求就更高了一些。

方案二:

开启SQL Server Browser服务,并且确保合适的帐户权限。这个说实话,让用户来处理有点不合适,由安装程序来做,复杂度会增加不少。

方案三:

安装MSDE时指定端口号,应用程序连接时一律用明确的端口号连接,比如C#,连接串写成:

 
  1. Server=IP\INSTANCE,PORT;Database=DB;Uid=USER;Pwd=PASS 

这样似乎修改代价最小。至于如何修改MSDE端口号,这个在安装时是没法指定的,可以由安装程序修改注册表,再重启服务。

注册表键值位于 HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Microsoft SQL Server/实例名/MSSQLServer/SuperSocketNetLib/Tcp,修改其下的TcpDynamicPorts和TcpPort为需要的值,注意不要和已有端口冲突,否则服务起不来。

 

[补充]

微软官方的这篇文章挺不错,http://msdn.microsoft.com/zh-cn/library/ms181087(SQL.90).aspx





     本文转自 BoyTNT 51CTO博客,原文链接:http://blog.51cto.com/boytnt/781547,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
1月前
|
数据可视化 Linux Docker
在Linux本地部署开源自托管导航页配置服务Dashy并远程访问
在Linux本地部署开源自托管导航页配置服务Dashy并远程访问
34 0
|
1月前
|
网络协议 安全 文件存储
Potplayer通过公网访问群晖WebDav,快速搭建远程办公环境
Potplayer通过公网访问群晖WebDav,快速搭建远程办公环境
42 0
Potplayer通过公网访问群晖WebDav,快速搭建远程办公环境
|
1月前
|
网络协议 数据安全/隐私保护 网络架构
如何使用软路由R4S+iStoreOS实现远程访问内网电脑桌面
如何使用软路由R4S+iStoreOS实现远程访问内网电脑桌面
|
12月前
|
网络协议 安全 算法
远程访问及控制(下)
远程访问及控制(下)
|
12月前
|
安全 网络协议 Shell
远程访问及控制(上)
远程访问及控制(上)
115 1
|
存储 安全 定位技术
第四章 部署远程访问服务
第四章 部署远程访问服务
140 0
|
网络协议 安全 算法
远程访问及控制
1、SSH远程管理,TCP Wrappers访问控制 2、配置密钥对验证
远程访问及控制
|
网络安全 Windows
IIS多站点共享端口
如何支持多站点共用一个SSL端口
818 0
|
Web App开发 安全 关系型数据库
阿里云专用网络开放80端口及开放mysql远程访问故障解决
阿里云专用网络开放80端口及开放mysql远程访问故障解决
3356 0

热门文章

最新文章