什么时候动态端口是“动态的”?

Ken*_*her 24 sql-server dynamic-ports tcpip

我今天正在Dynamic Ports与我的一位同事讨论,可以使用一些帮助来澄清他们的工作方式。

第一个问题:如果IPALL TCP Dynmaic Ports设置是一个特定的数字(比如 1971),这是否表示您有一个 1971 的静态端口或一个当前为 1971 的动态端口,并且可能会在将来的某个时候发生变化。

在此处输入图片说明

第二个问题:这是我最好奇的一个。我们有一个实例,IPALL TCP Dynmaic Ports通过数十次实例重启,该实例具有相同的端口(设置中的值)数年。是什么导致实例重启后动态端口实际发生变化?

Kin*_*hah 22

这篇知识库文章:如何配置 SQL Server 以侦听特定端口将为您澄清一些事情:

动态端口分配

如果将 SQL Server 实例配置为使用动态端口分配,并且尚未重新启动 SQL Server 实例,则注册表值设置如下:

TCPDynamicPorts = 空白

TCP端口 = 0

但是,如果将 SQL Server 实例配置为使用动态端口分配,并重新启动 SQL Server 实例,则注册表值设置如下:

TCPDynamicPorts = 使用的当前端口

TCPPort = 使用的当前端口

静态端口分配:

如果将 SQL Server 实例配置为使用静态端口,并且尚未重新启动 SQL Server 实例,则注册表值设置如下:

TCPDynamicPorts = 最后使用的端口

TCPPort = 下次重启后使用的新静态端口;您使用服务器网络实用程序设置的新静态端口

但是,如果将 SQL Server 实例配置为使用静态端口,并重新启动 SQL Server 实例,则注册表值设置如下:

TCPDynamicPorts = 空白

TCPPort = 您使用服务器网络实用程序设置的新静态端口

对于你的第二个问题-

每次启动指定的 SQLServer 时,它都会使用分配的端口。如果该端口被另一个程序使用,那么 SQL Server 在重新启动时会选择另一个端口,即在第一次启动时选择动态端口,并且以后的重新启动时通常会保持不变(存储在注册表中) - 但如果它被另一个程序使用,然后 SQL Server 将选择一个新端口。注意:对于 Prod 服务器,我只使用静态端口 - 出于安全和易于管理的原因。

注意:要找出更酷的东西:

检查动态端口是否正在使用或不使用 T-SQL :

SELECT NAME
    ,protocol_desc
    ,type_desc
    ,state_desc
    ,is_admin_endpoint
    ,port
    ,is_dynamic_port
    ,ip_address
FROM sys.tcp_endpoints
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

您可以使用 netstat -anocmdline 进行检查。

此外,您可以检查客户端注册表中先前缓存的内容,以了解它用于连接到 sql server 的端口:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI11.0\LastConnect
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明