Introduction
Fala pessoal!!
Nesse artigo eu gostaria de compartilhar com vocês o que expliquei em um grupo do Telegram, que é o funcionamento das portas dinâmicas do SQL Server, o qual muitas pessoas têm a concepção errada de como isso funciona.
Enquanto algumas pessoas acham que o SQL Server atribuiu uma nova porta a cada vez que o serviço é iniciado, outras já acham que esse processo só acontece na primeira inicialização. Vou demonstrar neste artigo, qual é o comportamento real do SQL Server em relação às portas dinâmicas e estáticas.
Caso você queira descobrir a porta atual do SQL Server, não deixe de visitar o meu artigo Como identificar a porta utilizada pela instância do SQL Server.
Para entender melhor o funcionamento do SQL Browser e para que ele serve, dê uma lida no artigo SQL Server – Como conectar utilizando a conexão DAC (Dedicated Admin Connection) sem o SQL Browser.
Como funciona a porta dinâmica do SQL Server
O primeiro passo é verificar se SQL Server está configurado para utilizar portas dinâmicas ou estáticas. Para isso, basta abrir o SQL Server Configuration Manager:
Caso o campo “TCP Dynamic Ports” do SQL Server Configuration Manager esteja com o valor 0 (zero), é porque o SQL Server está configurado para utilizar portas dinâmicas e é a primeira inicialização do serviço (ou você acabou de alterar essa configuração). Vou reiniciar o serviço do SQL para ver o que acontece.
Após reiniciar o serviço do SQL Server, vamos verificar o que aconteceu com a nossa porta do SQL Server:
A porta dinâmica do TCP (TCP Dynamic Port) foi alterada de 0 para uma porta aleatória que o SQL Server solicita ao SO (nesse caso, porta 55043).
O número dessa porta é gravado no registro o Windows:
Se eu reiniciar novamente o SQL Server, veremos que o número da porta dinâmica NÃO FOI ALTERADO:
Após o retorno do SO, o SQL irá armazenar no registro do Windows o número dessa porta e irá sempre utilizar essa mesma porta nas próximas vezes em que o serviço for iniciado. Mas será que é sempre mesmo?
Após utilizar a porta do SQL em outro processo
Agora quero entender como é o comportamento do SQL Server quando o serviço for tentar ser iniciado e a porta selecionada na primeira vez que o serviço foi iniciado já estiver em uso. Para fazer isso, vou parar todos os serviços do SQL Server e alterar o serviço da instância “SQLEXPRESS” para utilizar a porta da outra instância (55043):
Após iniciar o serviço SQLEXPRESS e depois o SQL2017, podemos reparar que o número da porta da instância SQL2017 foi gerado novamente, sendo associado a um outro número de porta:
Após o retorno do SO, o SQL irá armazenar no registro do Windows o número dessa porta e irá sempre utilizar essa mesma porta nas próximas vezes em que o serviço for iniciado até que um dia, essa porta já esteja em uso por outro processo. Se isso acontecer, o número da porta dinâmica volta para 0 e uma nova porta será atribuída à essa instância SQL Server pelo Sistema Operacional.
Definir uma porta estática
Se você deseja parar de usar uma porta dinâmica no SQL Server e começar a utilizar uma porta estática, basta configurar na tela anterior para que o campo “TCP Dynamic Ports” fique vazio (sem valor preenchido) e na coluna “TCP Port” você define qual porta essa instância vai ficar ativa e aguardando conexões:
Vale lembrar que utilizando uma porta estática, o SQL Server sempre vai tentar utilizar uma mesma porta, definida por você. Caso a porta escolhida esteja em uso, o serviço do SQL Server vai retornar um erro (que pode ser localizado no ERRORLOG do SQL):
Transcrição da mensagem de erro:
TDSSNIClient initialization failed with error 0x2740, status code 0xa. Reason: Unable to initialize the TCP/IP listener.
TDSSNIClient initialization failed with error 0x2740, status code 0x1. Reason: Initialization failed with an infrastructure error. Check for previous errors.
Could not start the network library because of an internal error in the network library. To determine the cause, review the errors immediately preceding this one in the error log.
SQL Server could not spawn FRunCommunicationsManager thread. Check the SQL Server error log and the operating system error log for information about possible related problems.
Porta estática x Porta dinâmica
Um dos grandes dilemas de quem está começando na área de SQL Server, é a definição de porta dinâmica X estática. Vou preparar um resumo para facilitar na sua decisão:
Porta dinâmica (TCP Dynamic Ports) | Porta estática (TCP Ports) |
---|---|
Possui valor "0" no campo "TCP Dynamic Ports" na primeira inicialização, número de uma porta fixa (gerada aleatoriamente) após a primeira execução. Volta a ter valor 0 se a porta atribuída anteriormente estiver em uso. | Valor fixo no campo "TCP Ports", definido pelo usuário (e campo "TCP Dynamic Ports" fica em branco) |
Porta pode mudar, caso esteja ocupada no momento da inicialização do serviço (embora não seja algo tão comum) | Porta não muda, mesmo que esteja ocupada no momento da inicialização do serviço (vai dar erro) |
Regras de firewall devem ser refeitas se a porta mudar. E deve esperar subir o serviço para identificar qual será a porta associada ao serviço na primeira inicialização | Regras de firewall são configuradas apenas uma vez, e não mudam mais. Além disso, podem ser configuradas antes mesmo da instalação do SQL Server, pois o número da porta já pode ser definido antes de instalar. |
Utilizado por padrão para instâncias nomeadas (ex: localhost\sql2017) | Utilizado por padrão para a instância padrão (ex: localhost) |
Não existe porta padrão | Porta padrão 1433 para a instância padrão |
And that's it, folks!
Um grande abraço e até mais.