¿Cuándo es un puerto dinámico "dinámico"?

23

Tuve una discusión hoy Dynamic Portscon uno de mis compañeros de trabajo y podría necesitar ayuda para aclarar cómo funcionan.

Primera pregunta: si la IPALL TCP Dynmaic Portsconfiguración es un número específico (por ejemplo, 1971), eso significa que tiene un puerto estático de 1971 o un puerto dinámico que actualmente es 1971 y puede cambiar en algún momento en el futuro.

ingrese la descripción de la imagen aquí

Segunda pregunta: esta es la que más me interesa. Tenemos una instancia que ha tenido el mismo puerto (el valor en la IPALL TCP Dynmaic Portsconfiguración) durante varios años a través de docenas de reinicios de instancia. ¿Qué hace que el puerto dinámico cambie realmente después de reiniciar una instancia?

Kenneth Fisher
fuente

Respuestas:

22

Este artículo de KB: Cómo configurar SQL Server para escuchar en un puerto específico le aclarará las cosas:

Asignación dinámica de puertos

Si configura una instancia de SQL Server para utilizar la asignación dinámica de puertos y aún no ha reiniciado la instancia de SQL Server, los valores del registro se establecen de la siguiente manera:

TCPDynamicPorts = En blanco

TCPPort = 0

Sin embargo, si configura una instancia de SQL Server para utilizar la asignación dinámica de puertos y reinicia la instancia de SQL Server, los valores del registro se establecen de la siguiente manera:

TCPDynamicPorts = Puerto actual que se usa

TCPPort = puerto actual que se utiliza

Asignación de puertos estáticos:

Si configura una instancia de SQL Server para usar un puerto estático y aún no ha reiniciado la instancia de SQL Server, los valores del registro se establecen de la siguiente manera:

TCPDynamicPorts = Último puerto que se usa

TCPPort = Nuevo puerto estático que se utilizará después del próximo reinicio; nuevo puerto estático que establezca mediante la Utilidad de red del servidor

Sin embargo, si configura una instancia de SQL Server para usar un puerto estático y reinicia la instancia de SQL Server, los valores del registro se establecen de la siguiente manera:

TCPDynamicPorts = En blanco

TCPPort = Nuevo puerto estático que configura utilizando la Utilidad de red del servidor

Sobre la segunda pregunta -

Cada vez que inicia el SQLServer nombrado, utiliza el puerto asignado. En caso de que otro programa utilice el puerto , SQL Server elige otro puerto en el momento del reinicio, es decir, el puerto dinámico se elige en el primer inicio y, en general , seguirá siendo el mismo en futuros reinicios (almacenados en el Registro), pero si es utilizado por otro programa, luego el servidor SQL elegirá un nuevo puerto. nota: para los servidores Prod, solo uso puertos estáticos: razones de seguridad y facilidad de administración

Nota: Más cosas interesantes para descubrir:

Compruebe si el puerto dinámico se está utilizando o no con T-SQL:

SELECT NAME
    ,protocol_desc
    ,type_desc
    ,state_desc
    ,is_admin_endpoint
    ,port
    ,is_dynamic_port
    ,ip_address
FROM sys.tcp_endpoints

ingrese la descripción de la imagen aquí

Puede usar netstat -anopara verificar usando cmdline.

Además, puede verificar qué se almacenó en caché anteriormente en el registro en el lado del cliente en cuanto a qué puerto está utilizando para conectarse al servidor sql:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Client\SNI11.0\LastConnect

ingrese la descripción de la imagen aquí

Kin Shah
fuente
Gracias y ese es un enlace muy útil! ¿Sabes qué hace que un puerto dinámico cambie de puerto? Ver Second questionen mi pregunta anterior.
Kenneth Fisher
@KennethFisher para su second question: cada vez que inicia el SQLServer con nombre, utiliza el puerto asignado. En caso de que otro programa use el puerto , SQL Server elige otro puerto en el momento del reinicio. El puerto dinámico se elige en el primer inicio y, en general, seguirá siendo el mismo en futuros reinicios (almacenados en el Registro), pero si lo utiliza otro programa, el servidor SQL elegirá un nuevo puerto. nota : para los servidores Prod, solo uso puertos estáticos: razones de seguridad y facilidad de administración.
Kin Shah
¿Sería tan amable de explicar por qué cree que vale la pena implementar un servicio completamente nuevo (navegador del servidor SQL) que funciona en un puerto estático, por lo que es posible que no se inicie si se utiliza este puerto, solo porque desea iniciar el servidor SQL en ¿Un caso en el que otros servicios están utilizando puertos que usted es demasiado torpe para conectarlo al software más caro que está utilizando?
kakaz