Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQL Server – Como descobrir há quanto tempo a instância está online ou quando a instância foi iniciada

Post Views 8,298 views
Reading time 6 minutes

Hey guys!
Tudo na paz??

Com esse artigo, gostaria de demonstrar a vocês como como descobrir há quanto tempo a instância está online ou quando a instância foi iniciada. Essa informação pode ser utilizada de diversas formas, como criar um monitoramento de quando o serviço do SQL foi reiniciado e depois iniciar uma auditoria de quem reinicou ou do motivo que levou a reiniciar o serviço, por exemplo.

Vou demonstrar alguns soluções que conheço abaixo e notem que, geralmente as datas possuem pequenas diferenças com a data/hora retornada entre os métodos.

Alternativa #1: dm_os_sys_info

Uma forma prática e simples de saber quando o serviço do SQL Server foi iniciado pela última vez, é consultando a DMV sys.dm_os_sys_info, disponível a partir do SQL Server 2008. Essa é a forma mais confiável de se obter essa informação.

Permissão necessária: VIEW SERVER STATE

Result:

Alternativa #2: sys.databases

Outra forma de se obter quando o serviço foi iniciado pela última vez, é consultando a view de sistema sys.databases (disponível a partir do SQL Server 2008) e olhar a data de criação do database tempdb. Como vocês sabem, esse database é recriado sempre que a instância é iniciada.

Permissão necessária: VIEW SERVER STATE

Result:

Entretanto, a recriação da tempdb não é a primeira coisa que o SQL Server faz durante o processo de subida do serviço do SQL, inclusive, os databases de usuários são iniciados (processo de recovery) antes da recriação da tempdb. Em cenários onde a rotina de recovery dos databases demore muito, pode haver uma grande diferença entre o tempo de inicialização da instância e a data de recriação da tempdb.

Alternativa #3: sys.sysdatabases

Outra view que podemos utilizar para atender a necessidade desse post, é a sys.sysdatabases, disponível desde o SQL Server 2000. A ideia é a mesma da sys.databases (Alternativa #2).

Permissão necessária: VIEW SERVER STATE

Result:

Vale ressaltar que essa view está marcada como descontinuada e será removida em futuras versões do SQL Server, logo, recomendo utilizar essa alternativa somente em casos de retrocompatibilidade.

Alternativa #4: sys.dm_exec_sessions

Utilizando a view sys.dm_exec_sessions (disponível a partir do SQL Server 2008) também podemos para atender a necessidade desse post ao filtrar pela sessão 1 (as sessões com sid < 50 são todas internas do SQL).

Permissão necessária: VIEW SERVER STATE

Result:

Alternativa #5: sys.traces

Utilizando a view sys.traces (disponível a partir do SQL Server 2005) filtrando pela coluna is_default = 1, você irá visualizar a data de criação do trace padrão do SQL Server, que é recriado sempre que a instância é reiniciada.

Permissão necessária: VIEW SERVER STATE e ALTER TRACE

Result:

Vale lembrar que esse recurso foi marcado como descontinuado (deprecated) a partir do SQL Server 2012, e deverá ser substituído em futuras versões do produto pelo system_health, que implementa esse recurso utilizando Extended Events (XE).

Alternativa #6: sys.dm_io_virtual_file_stats

Apresentando mais uma alternativa, temos a DMV sys.dm_io_virtual_file_stats, que nos traz estatísticas de I/O referentes aos arquivos de dados e log dos databases.

Permissão necessária: VIEW SERVER STATE

Result:

Para atender ao que precisamos, vamos utilizar a coluna sample_ms, que, segundo o BOL, retorna o número de milissegundos desde que o computador foi iniciado. Ou seja, com essa consulta, temos uma informação ainda anterior ao início do SQL Server, que é quando o servidor que está rodando o serviço do SQL Server foi iniciado.

Como vocês devem ter observado no print acima, provavelmente ocorreu algum bug nessa DMV, pois a teórica data de inicialização do servidor está bem depois das outras datas de inicialização do serviço do SQL Server, utilizando as outras alternativas desse post.

Alternativa #7: xp_readerrorlog ou sp_readerrorlog

Utilizando a stored procedure de sistema xp_readerrorlog (disponível a partir do SQL Server 2005), podemos ler o arquivo de logs do SQL Server e buscar pela string que contém o registro de log de quando o serviço foi iniciado.

Essa informação, apesar de ser um pouco mais trabalhosa de se obter, é uma das mais confiáveis, embora a documentação da Microsoft nos informe que a SP de sistema sp_cycle_errorlog pode ser utilizada internamente para reciclar os arquivos de logs, sem precisar de reiniciar a instância, fazendo com que você não consiga recuperar essa informação, caso isso aconteça.

Permissão necessária: VIEW SERVER STATE e ser membro da server role securityadmin

Resultados:

A SP de sistema xp_readerrorlog e a sp_readerrorlog são muito similares uma da outra. Na verdade, a sp_readerrorlog realiza alguns tratamentos na entrada dos dados e internamente, executa a xp_readerrorlog.

Vale observar que existem alguns relatos de bugs nas versões 2012 pra cima, ao tentar utilizar um valor do tipo varchar nos 3º e 4º parâmetros da xp_readerrorlog (funciona apenas com NVARCHAR), e que não ocorre na sp_readerrorlog.

Exemplos do erro:

Caso queira saber um pouco mais sobre essas SP’s de sistema, dê uma lida no meu post The Undocumented SQL Server Extended Procedures.

Alternativa #8: sys.dm_server_services

Utilizando a DMV sys.dm_server_services (disponível a partir do SQL Server 2008 R2 SP1), podemos verificar informações referentes aos serviços da instância, como o próprio serviço do SQL Server e também o SQL Agent, Full-text search e outros.

Permissão necessária: VIEW SERVER STATE

Result:

Alternativa #9: sys.sysprocesses

Utilizando a view de sistema sys.sysprocesses (disponível a partir do SQL Server 2000), podemos verificar informações referentes aos processos em aberto na instância. Para tentar identificar a data que a instância ficou online, vamos pegar o primeiro processo aberto (spid = 1), numa técnica parecida com a alternativa #4

Permissão necessária: VIEW SERVER STATE

Result:

Alternativa #10: msdb.dbo.syssessions

Sempre que o serviço do SQL Agent é iniciado, um registro na tabela msdb.dbo.syssessions é adicionado com o ID da nova sessão do Agent e a data/hora desse evento. Desta forma, essa tabela registra o histórico de quando o Agent foi iniciado.

Normalmente, esse serviço é iniciado junto com o serviço do SQL Server, mas esse é um ponto de falha para essa alternativa (quando isso não acontece). Outro ponto fraco dessa solução, é que o Agent demora alguns segundos para ser iniciado, fazendo com o que a hora não seja tão sincronizada com a hora de inicialização do serviço do SQL Server.

Caso queira ver mais alguns exemplos da syssessions, dê uma lida no meu post Como consultar o histórico de inicialização do SQL Agent no SQL Server.

Permissão necessária: VIEW SERVER STATE

Result:

And that's it, folks!
Espero que tenham gostado desse post e até a próxima!

sql server quanto tempo a instância está up online quando foi iniciada o serviço subiu

sql server quanto tempo a instância está up online quando foi iniciada o serviço subiu

sql server when datetime time instance service became become online up bring online

sql server when datetime time instance service became become online up bring online