zoukankan      html  css  js  c++  java
  • SQL Server Browser探究

    一、官网关于SQL SERVER Browser服务的解释(谷歌翻译后稍作修改的)
    背景:
    在SQL Server 2000之前,只能在计算机上安装一个SQL Server实例。 SQL Server通过官方互联网号码分配机构(IANA)侦听端口1433上的传入请求,然后分配给SQL Server。只有一个实例可以使用这个端口,所以当SQL Server 2000引入了对多个SQL Server实例的支持时,开发了SQL Server解析协议(SSRP)来侦听UDP端口1434。该监听器服务响应客户端对所有已安装实例的带实例名字的请求,返回实例们所使用的端口号和命名管道。为了解决SSRP系统的局限性,SQL Server 2005引入了SQL Server Browser服务作为SSRP的替代品。
    SQL Server Browser的工作原理:
    当SQL Server实例启动时,如果TCP / IP协议启用,则会为服务器分配一个TCP/IP端口。如果命名管道协议启用,SQL Server将侦听特定的命名管道。该端口或“管道”被该特定实例用于与客户端应用程序交换数据。在安装过程中,TCP端口1433和pipe sqlquery分配给默认实例,但之后可以由服务器管理员使用SQL Server Configuration Manager更改这些实例。因为只有一个SQL Server实例可以使用默认端口或管道,所以为命名实例(包括SQL Server Express)分配不同的端口号和管道名称。
    默认情况下,命名实例和SQL Server Express实例启动时配置为使用动态端口,即SQL Server启动时分配可用端口。如果需要,可以将特定端口分配给SQL Server实例。连接时,客户端可以指定特定端口;但是如果端口是动态分配的,则在SQL Server重新启动时,端口号可以随时更改,因此客户端不知道正确的端口号。
    SQL Server Browser启动时,配置使用UDP端口1434。SQL Server Browser读取注册表,标识计算机上的所有SQL Server实例,并记下使用的端口和命名管道。当服务器有两个或更多网卡时,SQL Server浏览器将返回第一个启用的SQL Server端口。 SQL Server浏览器支持ipv6和ipv4。
    当SQL Server客户端请求SQL Server资源时,客户端网络库使用端口1434向服务器发送UDP消息。SQL Server Browser会使用所请求实例的TCP / IP端口或命名管道进行响应。然后,客户端应用程序上的网络库通过使用所需实例的端口或命名管道向服务器发送请求来完成连接。
     
    二、个人实验:
    从官网的解释来看,SQL Server Browser是为解决多实例情况下,非默认实例使用动态端口号的情况。因此实例重启后,客户端可能无法连接命名实例。因此需要开启SQL Server Browser服务来使用UDP的1434端口监听本服务器所有命名实例,并为客户端请求返回命名实例所使用的真实端口或命名管道。
     
    1)实验环境
    SQL Server 2008R2版本,安装了默认实例MSSQLSERVER和命名实例TEST,其中默认实例使用默认的1433端口,TEST使用默认的动态分配端口。
    实验过程中主要观察:
    1、是否可以使用sqlcmd联通 
    2、netstat -ano的端口占用情况
    2)实验说明:
    开启SQL Server Browser服务等同于开启UDP的1434端口。而且如果将默认实例的端口换为1434,Browser服务依然使用UDP1434端口,不会改变。
    3)实验步骤
        1.只开启两个实例的服务,默认实例使用1433端口,TEST实例使用动态端口,用sqlcmd远程尝试连接两个实例的的结果如下:
        2.开启SQL Server Browser服务之后:
    此时如果关闭SQL Server Browser:
    sqlcmd -S 192.168.111.69TEST -U sa -P Leo123 依然会成功,但是将动态端口号设置为0后重启服务就会失败,说明只要启动过一次Browser服务且数据库服务没重启过(这意味着动态端口号没变过)就一直可以连通。
        3.将默认实例的端口号改为动态端口:
    sqlcmd -S 192.168.111.69MSSQLSERVER -U sa -P Leo123 无论Browser服务是否开启,都无法连接。
    说明此服务对默认实例无效。
    4)实验结论
    SQL Server Browser只负责使用UDP的1434端口转发使用动态端口的命名实例的信息给客户端,默认实例必须使用固定端口,并告知客户端。
    因此如果服务器上有多个实例,且命名实例使用动态端口,那么一定要开启Browser服务。
    对使用固定端口1433连接服务器的程序来说,如果是命名实例,那么最好设置固定的端口号,并修改配置文件使用新的固定端口号连接。此时可以关闭Browser服务。
    在集群环境中,应保证Browser服务在所有节点始终开启。
    最后,也希望大家不要迷信这个实验结论,不保证能解释所有问题,要自己动手验证。
     
    三、一些附加信息:
    1.可以使用netstat -ano|findstr PID来查看SQL Server监听的端口号,其中[: :]表示所有IPv6地址,[: : 1]表示IPv6的looopback address,在ipv6中::表示连续的0且只能出现一次双冒号,::和::1单独出现时比较特殊,表示任意地址和本地回环地址,当然sqlserver肯定会设置这些ipv6地址都可以接受ipv4连接(通过ipv4-mapped ipv6 address),这里无需对此问题更加深入。
    2.如何修改SQL Server实例的默认端口号:
    修改下图的IPALL即可,动态端口设为空表示使用固定端口,设为0表示使用动态端口。

     

     

  • 相关阅读:
    影评
    札记
    竞赛203
    竞赛201
    StopWatch的使用
    mysql:GROUP_CONCAT
    DispatcherServlet核心方法doDispatch解析
    class对象与实例对象
    mybatis与传统ORM框架的区别
    servlet容器中listener、filter、interceptor的启动顺序
  • 原文地址:https://www.cnblogs.com/leohahah/p/7007472.html
Copyright © 2011-2022 走看看