Escolar Documentos
Profissional Documentos
Cultura Documentos
assim como todos os outros SGBDs, não é nada mais nada menos que apenas um
Há uma série de informações que você pode coletar apenas usando ferramentas do
não somente ter um maior controle sobre suas instâncias, mas também ter mais
cartas na manga para resolver um problema incomum, e até montar interessantes
linhas de raciocínio.
Nesta série, iremos mostrar alguns conceitos e ferramentas úteis para o dia-a-dia de
quem Administra instâncias SQL Server, não somente em ambiente Windows, mas
em Linux, e até docker.
Processos e threads
Eu sempre digo em minhas apresentações que entender o que é uma Thread é
essencial pra entender e dominar o SQL Server. Afinal, tudo se resumem a elas.
processos definem quais recursos suas threads tem acesso. Tais limites podem ser
mesma maneira, que é simples, como fazem com seus próprios recursos. Você verá
que isso explica muita coisa quando trabalha com múltiplas instâncias!
3
Para resumir:
Thread: É a coisa que, de fato, executa instruções em uma CPU. Há várias dessas coisas o
Processo: É como se fosse um “grupo” de threads. Um processo não executa código, mas
contém, no mínimo, uma thread. Além disso, o processo contém uma série de outras
Executável e Argumentos
.exe, e no Linux sem uma extensão específica. Ele é gerado a partir de alguma
linguagem de programação, como C++, que é o caso do SQL Server.
um novo processo em sua lista de processos, e também cria a primeira thread desse
partir daí, a thread seguirá seu fluxo de execução, realizando as mais variadas
operações que foram codificadas, como abrir arquivos, receber conexões, processar
texto, fazer cálculos e até criar novas threads.
Todo executável pode receber um ou mais parâmetros, que são strings passadas por
quem o iniciou. A sintaxe é:
Uma correta documentação irá dizer quais os parâmetros existem, como devem ser
especificados e o que eles causam na execução daquele software.
Parâmetro Descrição
-s Nome da instância
Você pode consultar uma lista de parâmetros que o executável do SQL Server
Você pode observar o executável usado para iniciar um processo, e seus argumentos,
usando ferramentas como Gerenciador de Tarefas ou o Process Explorer:
Baixe o process explorer e tente ver os argumentos dos vários processo que existem em
execução
o Vá na aba “Detalhes”
Talvez você nunca tenha precisado interagir diretamente com o executável do SQL
Server porque você sempre iniciou ele através de um serviço. Em palavras simples,
um serviço está fazendo a mesma coisa que você: pedindo ao sistema operacional
que inicie a execução de um arquivo. Mas, no final das contas, ele é apenas um
processo. Você pode confirmar isso usando ferramentas do seu sistema operacional
que permitem monitorar e gerenciar os processos, como:
Windows
o Process Explorer
o Get-Process (powershell)
o tasklist.exe
Linux
o Top
o htop
o /proc
Por exemplo, a seguinte imagem demonstra dois processos, cada um referente a uma
instância que iniciei através do Configuration Manager:
execução, cada instância irá ser executada em seu próprio processo. O SQL Server
Agent também é outro processo, e que usa um executável diferente do SQL:
Assim como o SQL Browser, Analysis Services, etc. Cada um tem seu próprio
executável, e aceitam diferentes parâmetros.
O PID
Uma das informações mais importante sobre um processo é seu identificador, ou
“Process ID” (PID). O PID é um número exclusivo que um processo ganha ao ser
pode ser reusado quando seu respectivo processo encerrar. Raramente você verá o
serviço do SQL Server usar o mesmo ID de processo entre seus restarts. Se ocorrer,
é uma bela sorte!
A linha de comando
Repare na última coluna dessa imagem:
A coluna “Linha de comando” (você consegue habilitar mais colunas usando o botão
mostra o caminho do executável que foi usado para iniciar o processo. Se você olhar
na definição do serviço desta instância, poderá ver a mesma informação:
3. Clique com o botão direito, e vá em propridades. Você verá uma imagem semelhante a esta:
8
Se você selecionar o texto sob “Caminho do Executável”, poderá ver o resto das informações.
Quando o Windows é solicitado para rodar esta linha de comando, seja diretamente
pelo usuário, ou através de um serviço, ele cria um novo processo e aponta a primeira
esses valores para a primeira thread do processo, e a partir daí ela faz o que quiser
com eles.
instância. No caso do SQL Agent, é o parâmetro “-i” quem dita essa informação.
(No post anterior há uma tabelinha contendo essas informações).
9
O usuário
Uma outra informação bastante útil vem da coluna “Nome de usuário”. Essa coluna
indica com qual conta de usuário o processo está rodando. Todo processo, e,
(geralmente, usamos o nome “conta de serviço”, pois estamos falando de uma conta
de usuário que irá rodar um serviço. Mas é tudo a mesma coisa). Essa conta é usada
Uma outra situação comum, é ter que dar direitos específicos para que o SQL Server
Instant File Initialization é permitido somente se a conta com a qual o serviço está
formas de verificar se o processo tem esse privilégio habilitado e uma delas é usando
o Process Explorer:
desejada
3. Vá na aba “Security”. No final da janela aberta, você verá a lista de privilégios com as quais o
processo executa (que foi herdado do usuário associado com esse processo)
10
A lista vem ordenada pelo nome do privilégio. Apesar da conta possuir alguns
Além disso, há uma série de outras informações a respeito do usuário, que podemos
discutir melhor em um outro post.
executa
Experimente retirar ou adicionar permissões da conta de serviço utilizada pelo SQL Server,e
Powershell: Explore cmdlet Get-Service ou a classe WMI win32_service para obter mais
O “Gerenciador de Tarefas”
A esta altura, você já percebeu o Gerenciador de Tarefas do Windows é, na verdade,
Por exemplo, você pode usar o comando “ps” para encontrar a linha de comando
usada para iniciar o SQL Server:
Note que há dois processos. São duas instâncias? Não. No Linux, o sql server inicia
um processo conhecido como “watchdog”,e este por sua vez é quem inicia um
segundo processo que irá atuar como uma instância SQL como a conhecemos. Como
pode notar, ambos usam o mesmo executável. O primeiro processo fica monitorando
recurso nativo do sistema operacional quem faz esse trabalho. Este artigo do Bob
Dorr, detalha.
Você pode usar o seguinte comando para exibir o PID do processo, o usuário e a
linha de comando usada:
13
Um exemplo:
No exemplo acima, o processo 25526 foi iniciado pelo processo 1 (PPID = parent pid,
Windows, que são os responsáveis por iniciar os serviços. Então, podemos dizer que
o processo 25526 é o “watchdog”, pois ele foi o primeiro processo com o executável
do SQL Sever a ser iniciado. A linha seguinte, demonstra que o respectivo processo,
de PID 25531, é filho de 25526 (o watchdog), então, este é a instância SQL (é este
processo, por exemplo, quem escuta na porta 1433, e processa os comandos SQL
que chegam).
O comando “htop” pode ser uma alternativa interessante ao comando “ps”. Usando a
tecla F5, você consegue trocar a exibição entre uma árvore de processos e uma lista
ordenada:
Aqui, a coluna “PID” é auto explicativa. Ela contém o PID do processo, conceito que
você já aprendeu no post anterior. É a mesma coisa. A coluna “User” informa qual o
usuário sob o qual o processo está executando. A mesma informação está disponível
No Windows, você consegue ver essa relação de processo pai e processo filho melhor
Note que no Windows, não temos um outro processo pai chamado sqlservr.exe. O sqlservr.exe é
Server sendo criados. O Process Explorer demonstra que cmd.exe é filho de sqlservr.exe. E
A primeira linha é o comando sudo. Da maneira em que foi executado na imagem, ele
faz com que mudemos o usuário atual. O nome do usuário é “mssql”, criado por
Server, com o parâmetro “-e”, alterando o local do Error Log, semelhante como
fizemos no Windows. A razão pelo qual eu mudei de usuário é apenas para evitar
em ambiente de produção, pois pode vir a ter seu serviço inoperável. Mas, se o fizer,
e tiver problemas, tente restabelecer as permissões, desta maneira:
Note que o processo é filho do processo 23892. Utilizando o comando ps, podemos
observar quem é:
bash é um programa que atua como um shell no Linux, semalhante ao que o cmd, ou mesmo o
powershell, é no Windows. Ele é responsável por captar e exibir a saída de comandos fornecidos
no terminal. Quando eu iniciei o SQL Server na linha de comando do Linux, foi o bash da minha
quem vai rodar esse processo. Sendo assim, todas os recursos do Sistema
Operacional que minha instância precisar, estarão sujeitos a esse usuário. Note que
usuário que será usado quando o sql for iniciado por lá (ou pelo gerenciador de
serviços).
Note que, como no Linux, o processo agora é filho do “cmd.exe” (semelhante ao bash’).
No Linux, é o mesmo caso, porém, eu apenas optei por utilizar o mesmo usuário
isso não são tão graves como no Linux, mas ainda sim, não recomendo que faça isso
em um ambiente operacional, pois poderá ter os mesmos problemas.
17
tela, além do errorlog. Isso acontece nas versões para ambos os sistemas
operacionais.
Bom, há muito o que falar sobre processos. Esta foi uma introdução cujo o objetivo é
análises. As vezes, os simples fato de olhar o usuário com o qual o processo está
rodando, pode te ajudar a perceber um problema devido a permissões de acesso.
o strace, que ajudam a compreender tudo o que um processo está fazendo. Conhecer
o que são os processos e seus conceitos mais simples, ajudam a melhor utilizar essas
ferramentas. E em algum momento iremos dedicar atenção a elas aqui no blog!
https://docs.microsoft.com/en-us/sql/tools/sqlservr-application?view=sql-server-2017
Executável sqlservr
https://docs.microsoft.com/en-us/sql/tools/sqlservr-application?view=sql-server-2017
Linux Bash
http://tldp.org/LDP/Bash-Beginners-Guide/html/Bash-Beginners-Guide.html#chap_01
https://docs.microsoft.com/en-us/sql/linux/sql-server-linux-setup?view=sql-server-2017
https://docs.microsoft.com/en-us/windows/desktop/procthread/processes-and-threads
Linux clone system call (útil para aprender como processos são criados no Linux)
http://man7.org/linux/man-pages/man2/clone.2.html
18
https://www.thegeekstuff.com/2013/11/linux-process-and-threads/
https://cloudblogs.microsoft.com/sqlserver/2016/12/16/sql-server-on-linux-how-introduction/