如何检查SQL Server是侦听动态端口还是静态端口

本文讨论如何确定Microsoft SQL Server命名实例是侦听动态端口还是静态端口。 排查与SQL Server相关的不同连接问题时,此信息会很有帮助。

默认情况下,SQL Server命名实例配置为侦听动态端口。 它从操作系统获取可用端口。 还可以将SQL Server命名实例配置为从特定端口开始。 这称为静态端口。 有关SQL Server上下文中的静态端口和动态端口的详细信息,请参阅静态端口与动态端口

使用以下过程确定SQL Server命名实例是否正在侦听动态端口与静态端口。

选项 1:使用SQL Server 配置管理器

  1. SQL Server 配置管理器 中,展开 SQL Server网络配置,展开 实例名称的协议,然后双击 TCP/IP

  2. TCP/IP 属性 中,选择 "协议"。

  3. 检查" 全部侦听 "设置中的值。 如果设置为 "是",请转到步骤 4。 如果设置为 "否",请转到步骤 6。

  4. 转到 IP 地址,并滚动到 TCP/IP 属性 页的底部。

  5. 检查 IP All 中的值,并使用下表确定命名实例是侦听动态端口还是静态端口。

    TCP 动态端口 TCP 端口 SQL Server使用动态或静态端口的实例?
    空白 空白 动态端口
    <Number> 空白 动态端口 - <Number> 是SQL Server当前正在侦听的动态端口
    <Number1> <Number2> 同时侦听动态端口 <Number1> 和静态端口 <Number2>
  6. 切换到 IP 地址。 请注意,多个 IP 地址以 IP1IP2 格式显示,最多显示 IP All。 其中一个 IP 地址适用于环回适配器 127.0.0.1。 计算机上每个 IP 地址会显示更多 IP 地址。 (可能会看到 IP4 和 IP6 地址。) 若要检查是否为动态端口和静态端口配置了特定 IP 地址,请使用下表。

    TCP 动态端口 TCP 端口 SQL Server使用动态或静态端口的实例?
    空白 空白 动态端口
    <Number> 空白 动态端口 - <Number> 是SQL Server当前正在侦听的动态端口。
    <Number1> <Number2> 同时侦听动态端口 <Number1> 和静态端口 <Number2>

备注

TCP 动态端口 中的值 为 0 表示命名实例当前未运行,并且已配置为动态端口。 启动实例后,值字段将反映实例当前使用的动态端口。

选项 2:使用 PowerShell

  1. 在 PowerShell ISE 中运行以下脚本。 控制台窗口显示当前安装在系统上的所有SQL Server实例 (SQL Server 2014 到 2019 SQL Server) 的所有相关 TCP/IP。

    clear
    Write-Host "SQL Server 2019"
    Write-Host "====================="
    Get-ItemProperty  -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.*\MSSQLServer\SuperSocketNetLib\Tcp" | Select-Object -Property Enabled, KeepAlive, ListenOnAllIps,@{label='ServerInstance';expression={$_.PSPath.Substring(74)}} |Format-Table -AutoSize
    Get-ItemProperty  -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL15.*\MSSQLServer\SuperSocketNetLib\Tcp\IP*\" | Select-Object -Property TcpDynamicPorts,TcpPort,DisplayName, @{label='ServerInstance_and_IP';expression={$_.PSPath.Substring(74)}}, IpAddress |Format-Table -AutoSize
    
    Write-Host "SQL Server 2017"
    Write-Host "====================="
    Get-ItemProperty  -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.*\MSSQLServer\SuperSocketNetLib\Tcp" | Select-Object -Property Enabled, KeepAlive, ListenOnAllIps,@{label='ServerInstance';expression={$_.PSPath.Substring(74)}} |Format-Table -AutoSize
    Get-ItemProperty  -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL14.*\MSSQLServer\SuperSocketNetLib\Tcp\IP*\" | Select-Object -Property  TcpDynamicPorts,TcpPort, DisplayName, @{label='ServerInstance_and_IP';expression={$_.PSPath.Substring(74)}}, IpAddress |Format-Table -AutoSize
    
    Write-Host "SQL Server 2016"
    Write-Host "====================="
    Get-ItemProperty  -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL13.*\MSSQLServer\SuperSocketNetLib\Tcp" | Select-Object -Property Enabled, KeepAlive, ListenOnAllIps,@{label='ServerInstance';expression={$_.PSPath.Substring(74)}} |Format-Table -AutoSize
    Get-ItemProperty  -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL13.*\MSSQLServer\SuperSocketNetLib\Tcp\IP*\" | Select-Object -Property  TcpDynamicPorts,TcpPort, DisplayName, @{label='ServerInstance_and_IP';expression={$_.PSPath.Substring(74)}}, IpAddress |Format-Table -AutoSize
    
    Write-Host "SQL Server 2014"
    Write-Host "====================="
    Get-ItemProperty  -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.*\MSSQLServer\SuperSocketNetLib\Tcp" | Select-Object -Property Enabled, KeepAlive, ListenOnAllIps,@{label='ServerInstance';expression={$_.PSPath.Substring(74)}} |Format-Table -AutoSize
    Get-ItemProperty  -Path "HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL12.*\MSSQLServer\SuperSocketNetLib\Tcp\IP*\" | Select-Object -Property  TcpDynamicPorts,TcpPort, DisplayName, @{label='ServerInstance_and_IP';expression={$_.PSPath.Substring(74)}}, IpAddress |Format-Table -AutoSize
    
  2. 在输出中,检查SQL Server实例的 ListenOnAllIPs 列中的值 (引用该行) 的 ServerInstance 中的 相应值。 如果值设置为 1,请转到步骤 3。 如果设置为 0,请转到步骤 4。

  3. 扫描实例 DisplayName 列中包含 任何 IP 地址 条目的行的输出,或检查 行的 TcpDynamicPortsTcpPort 的值。 然后使用下表确定命名实例是侦听动态端口还是静态端口。

    TCP 动态端口 TCP 端口 SQL Server使用动态或静态端口的实例?
    空白 空白 动态端口
    <Number> 空白 动态端口 - <Number> 是当前正在侦听的动态端口SQL
    <Number1> <Number2> 同时侦听动态端口 <Number1> 和静态端口 <Number2>
  4. 请注意,多个 IP 地址以 IP1IP2 格式显示,最多显示 IP All。 其中一个 IP 地址适用于环回适配器 127.0.0.1。 计算机上每个 IP 地址会显示更多 IP 地址。 (可能会看到 IP4 和 IP6 地址。) 若要检查是否为动态端口和静态端口配置了特定 IP 地址,请使用下表。

    TCP 动态端口 TCP 端口 SQL Server使用动态或静态端口的实例?
    空白 空白 动态端口
    <Number> 空白 动态端口 - <Number> 是SQL Server当前正在侦听的动态端口。
    <Number1> <Number2> 同时侦听动态端口 <Number1> 和静态端口 <Number2>

备注

TCP 动态端口 中的值 为 0 表示命名实例当前未运行,并且已配置为动态端口。 启动实例后,值字段将反映实例当前使用的动态端口。

另请参阅