Fala pessoal!
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
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
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
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
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
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
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
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 As procedures estendidas não documentadas do SQL Server.
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
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
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
SELECT MAX(agent_start_date) AS agent_start_date
FROM msdb.dbo.syssessions
É isso aí, pessoal!
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













Comentários (0)
Carregando comentários…