当前位置: 首页 > news >正文

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

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

 

[项目背景]

基于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,如需转载请自行联系原作者

相关文章:

  • 庖丁解Puppet之中级进阶篇
  • Web服务初探:用Demo学Web服务系列(2)——编写一简单的Web服务
  • Android DataBinding库(MVVM设计模式)
  • Linux LVM逻辑卷管理
  • Mysql ERROR 1396 (HY000) 错误的解决办法
  • QImage Mat IplImage 之间的相互转换
  • visual studio如何附加到进程调试python命令
  • 大数据时代的全能日志分析专家--Splunk安装与实践
  • 微软今天发布Windows 7/Server 2008 R2 SP1 RC候选版
  • mariadb的日志
  • 内存数据的十六进制Print
  • 1.4linux单用户模式下修改root密码和救援模式修改root密码
  • 跨进程通信之Messenger
  • 记录一次处理https监听不正确的过程
  • sed常见操作
  • Google 是如何开发 Web 框架的
  • Angularjs之国际化
  • angular学习第一篇-----环境搭建
  • Computed property XXX was assigned to but it has no setter
  • JavaScript设计模式与开发实践系列之策略模式
  • Puppeteer:浏览器控制器
  • 给新手的新浪微博 SDK 集成教程【一】
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 警报:线上事故之CountDownLatch的威力
  • 前端之Sass/Scss实战笔记
  • 提醒我喝水chrome插件开发指南
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • Java数据解析之JSON
  • PostgreSQL之连接数修改
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • $(function(){})与(function($){....})(jQuery)的区别
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (8)STL算法之替换
  • (LeetCode C++)盛最多水的容器
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (转)nsfocus-绿盟科技笔试题目
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)创业的注意事项
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .gitignore文件_Git:.gitignore
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • .sh
  • .考试倒计时43天!来提分啦!
  • @JoinTable会自动删除关联表的数据
  • @TableLogic注解说明,以及对增删改查的影响
  • []error LNK2001: unresolved external symbol _m
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C++]指针与结构体
  • [C++参考]拷贝构造函数的参数必须是引用类型