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
1 |
SELECT sqlserver_start_time FROM sys.dm_os_sys_info |
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
1 2 3 |
SELECT create_date FROM sys.databases WHERE [name] = 'tempdb' |
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
1 2 3 |
SELECT crdate FROM sys.sysdatabases WHERE [name] = 'tempdb' |
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
1 2 3 |
SELECT login_time FROM sys.dm_exec_sessions WHERE session_id = 1 |
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
1 2 3 |
SELECT start_time FROM sys.traces WHERE is_default = 1 |
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
1 2 |
SELECT DATEADD(ms, -sample_ms, GETDATE()) AS StartTime FROM sys.dm_io_virtual_file_stats(1,1) |
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
1 2 3 4 5 6 |
DECLARE @Retorno TABLE ( [LogDate] DATETIME, [ProcessInfo] NVARCHAR(12), [Text] NVARCHAR(3999) ) INSERT INTO @Retorno EXEC xp_readerrorlog 0, 1, N'Copyright (c) Microsoft Corporation' SELECT LogDate FROM @Retorno |
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.
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
1 2 3 |
SELECT last_startup_time FROM sys.dm_server_services WHERE ServiceName LIKE 'SQL Server (%' |
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
1 2 3 |
SELECT login_time FROM sys.sysprocesses WHERE spid = 1 |
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
1 2 |
SELECT MAX(agent_start_date) AS agent_start_date FROM msdb.dbo.syssessions |
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