如何检查 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 地址以 IP1、IP2 和 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 到 SQL Server 2019)的所有相关 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 地址以 IP1、IP2 和 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 表示命名实例当前未运行,并且已针对动态端口进行配置。 启动实例后,值字段将反映实例当前正在使用的动态端口。

另请参阅