Introducción
¡¡Hola, chicos!!
En este artículo me gustaría compartir con ustedes lo que expliqué en un grupo de Telegram, que es cómo funcionan los puertos dinámicos de SQL Server, lo cual mucha gente tiene una concepción errónea de cómo funciona.
Mientras que algunas personas piensan que SQL Server asigna un nuevo puerto cada vez que se inicia el servicio, otros piensan que este proceso solo ocurre en el primer inicio. Demostraré en este artículo cuál es el comportamiento real de SQL Server en relación con los puertos dinámicos y estáticos.
Si desea conocer el puerto actual de SQL Server, asegúrese de visitar mi artículo. Cómo identificar el puerto utilizado por la instancia de SQL Server.
Para comprender mejor cómo funciona SQL Browser y para qué sirve, lea el artículo SQL Server: cómo conectarse mediante la conexión DAC (conexión de administrador dedicada) sin el navegador SQL.
Cómo funciona el puerto dinámico de SQL Server
El primer paso es verificar si SQL Server está configurado para usar puertos dinámicos o estáticos. Para hacer esto, simplemente abra el Administrador de configuración de SQL Server:

Si el campo “Puertos dinámicos TCP” en el Administrador de configuración de SQL Server tiene un valor de 0 (cero), es porque SQL Server está configurado para usar puertos dinámicos y esta es la primera vez que se inicia el servicio (o acaba de cambiar esta configuración). Reiniciaré el servicio SQL y veré qué pasa.
Después de reiniciar el servicio SQL Server, verifiquemos qué sucedió con nuestro puerto SQL Server:

El puerto dinámico TCP se cambió de 0 a un puerto aleatorio que SQL Server solicita al sistema operativo (en este caso, el puerto 55043).
Este número de puerto está registrado en el registro de Windows:

Si reinicio SQL Server nuevamente, vemos que el número de puerto dinámico NO HA CAMBIADO:

Después de que regrese el sistema operativo, SQL almacenará este número de puerto en el registro de Windows y siempre usará este mismo puerto la próxima vez que se inicie el servicio. ¿Pero es siempre cierto?
Después de usar el puerto SQL en otro proceso
Ahora quiero entender cómo se comporta SQL Server cuando el servicio intenta iniciarse y el puerto seleccionado la primera vez que se inició el servicio ya está en uso. Para hacer esto, detendré todos los servicios de SQL Server y cambiaré el servicio de la instancia “SQLEXPRESS” para usar el puerto de la otra instancia (55043):

Luego de iniciar el servicio SQLEXPRESS y luego SQL2017, podemos notar que se generó nuevamente el número de puerto de la instancia SQL2017, quedando asociado a otro número de puerto:

Después de que el sistema operativo regrese, SQL almacenará este número de puerto en el registro de Windows y siempre usará este mismo puerto la próxima vez que se inicie el servicio hasta que un día, este puerto ya esté en uso por otro proceso. Si esto sucede, el número de puerto dinámico vuelve a 0 y el sistema operativo asignará un nuevo puerto a esta instancia de SQL Server.
Definir un puerto estático
Si deseas dejar de usar un puerto dinámico en SQL Server y comenzar a usar un puerto estático, simplemente configura en la pantalla anterior para que el campo “Puertos Dinámicos TCP” esté vacío (sin valor completado) y en la columna “Puerto TCP” defines qué puerto estará activo esta instancia en espera de conexiones:

Vale la pena recordar que al utilizar un puerto estático, SQL Server siempre intentará utilizar el mismo puerto, definido por usted. Si el puerto elegido está en uso, el servicio SQL Server devolverá un error (que se puede encontrar en SQL ERRORLOG):

Transcripción del mensaje de error:
La inicialización de TDSSNIClient falló con el error 0x2740, código de estado 0xa. Motivo: No se puede inicializar el escucha TCP/IP.
La inicialización de TDSSNIClient falló con el error 0x2740, código de estado 0x1. Motivo: la inicialización falló debido a un error de infraestructura. Verifique errores anteriores.
No se pudo iniciar la biblioteca de red debido a un error interno en la biblioteca de red. Para determinar la causa, revise los errores inmediatamente anteriores a este en el registro de errores.
SQL Server no pudo generar el subproceso FRunCommunicationsManager. Consulte el registro de errores de SQL Server y el registro de errores del sistema operativo para obtener información sobre posibles problemas relacionados.
Puerto estático x puerto dinámico
Uno de los mayores dilemas para quienes comienzan en SQL Server es la definición de un puerto dinámico versus uno estático. Te prepararé un resumen para facilitar tu decisión:
| Puerto dinámico (Puertos dinámicos TCP) | Puerto estático (puertos TCP) |
|---|---|
| Tiene un valor de "0" en el campo "Puertos dinámicos TCP" en el primer inicio, un número de puerto fijo (generado aleatoriamente) después de la primera ejecución. Vuelve a 0 si el puerto previamente asignado está en uso. | Valor fijo en el campo "Puertos TCP", definido por el usuario (y el campo "Puertos dinámicos TCP" está en blanco) |
| El puerto puede cambiar si está ocupado cuando inicia el servicio (aunque esto no es tan común) | El puerto no cambia, incluso si está ocupado cuando se inicia el servicio (dará un error) |
| Las reglas del firewall se deben rehacer si el puerto cambia. Y debe esperar a que se cargue el servicio para identificar qué puerto se asociará con el servicio en el primer inicio. | Las reglas del firewall se configuran solo una vez y no cambian nuevamente. Además, se pueden configurar incluso antes de instalar SQL Server, ya que el número de puerto ya se puede definir antes de la instalación. |
| Se utiliza de forma predeterminada para instancias con nombre (por ejemplo, localhost\sql2017) | Se utiliza de forma predeterminada para la instancia predeterminada (por ejemplo, localhost) |
| No hay ningún puerto predeterminado | Puerto predeterminado 1433 para la instancia predeterminada |
¡Eso es todo, amigos!
Un fuerte abrazo y hasta luego.

Comentários (0)
Carregando comentários…