如何检查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 2014 年到 2019 SQL Server 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 表示命名实例当前未运行,并且已为动态端口配置。 启动实例后,值字段将反映实例当前使用的动态端口。

另请参阅