Muitas vezes vejo perguntas em que as pessoas querem saber se uma determinada coisa aconteceu, ou quando aconteceu, ou quem executou a ação. Em muitos casos, o SQL Server simplesmente não rastreia essas informações por conta própria. Por exemplo:
- Quem executou o último procedimento armazenado
dbo.MyProcedure
? - Quem atualizou a
salary
coluna nadbo.Employees
tabela? - Quem consultou a
dbo.Orders
tabela pela última vez no Management Studio?
Mas há vários outros eventos que o SQL Server rastreia temporariamente por padrão e pode responder a perguntas nativamente, como:
- Quando foi a última vez que um crescimento automático ocorreu no banco de dados AdventureWorks e quanto tempo demorou?
- Quem excluiu a
dbo.EmployeeAuditData
tabela e quando? - Quantos erros relacionados à memória aconteceram hoje?
Como obtenho essas informações e por quanto tempo elas ficam disponíveis?
Há muitas informações valiosas que o SQL Server rastreia para você por padrão. Desde o SQL Server 2005, existe um "rastreamento padrão" executado em segundo plano e, desde o SQL Server 2008, há uma sessão de eventos estendidos em execução automática, chamada
system_health
.Você também pode encontrar certas informações do log de erros do SQL Server, log do SQL Server Agent, logs de eventos do Windows e logs adicionais de coisas como SQL Server Audit , Management Data Warehouse , Event Notifications , DML Triggers , DDL Triggers , SCOM / System Center , seus próprios rastreamentos do lado do servidor ou sessões de eventos estendidos ou soluções de monitoramento de terceiros (como aquelas feitas pelo SentryOne ). Você também pode, opcionalmente, ativar o chamado "rastreamento Blackbox" para ajudar na solução de problemas .
Mas, para esta postagem, vou focar o escopo em itens que geralmente são ativados em quase todos os lugares: o rastreamento padrão, as sessões de eventos estendidos e o log de erros.
Rastreamento Padrão
O rastreamento padrão geralmente está em execução na maioria dos sistemas, a menos que você o tenha desativado usando
sp_configure
- o que definitivamente sou um grande fã de fazer . Contanto que esteja habilitado, pode ser uma rica fonte de informações valiosas, embora em versões modernas do SQL Server, muito disso seja ruído e/ou já tenha sido capturado em outro lugar. A lista a seguir lista os eventos de rastreamento que são capturados:Você pode obter mais detalhes juntando-se a
sys.trace_columns
para ver quais eventos vêm com quais dados, mas vou pular isso por enquanto, pois você pode ver o que tem quando realmente consulta os dados de rastreamento para eventos específicos. Estes são os eventos disponíveis no meu sistema (você deve executar a consulta no seu para ter certeza de que correspondem, embora ainda seja o mesmo conjunto de eventos por meio do SQL Server 2019 CTP 2.4):Observe que o rastreamento padrão usa arquivos de substituição e, portanto, os dados disponíveis para você voltarão apenas até certo ponto - o intervalo de datas dos dados disponíveis depende de quantos dos eventos acima estão sendo capturados e com que frequência. Se você deseja garantir a manutenção de um histórico mais longo, pode configurar uma tarefa que arquive periodicamente os arquivos atualmente inativos associados ao rastreamento.
Exemplos
Na pergunta, fiz algumas perguntas que encontrei. Aqui estão exemplos de consultas para extrair essas informações específicas do rastreamento padrão.
Esta consulta extrairá todos os eventos AutoGrow no banco de dados AdventureWorks, para arquivos de log e dados, que ainda estão nos arquivos de log de rastreamento padrão:
Isso retornará todos os
DROP
eventos para um objeto chamadoEmployeeAuditData
. Se você quiser ter certeza de que ele detecta apenasDROP
eventos para tabelas, você pode adicionar um filtro:ObjectType = 8277
(a lista completa está documentada aqui ). Se você deseja restringir o espaço de pesquisa a um banco de dados específico, pode adicionar um filtro:DatabaseName = N'db_name'
.Há uma complicação aqui, e é um caso muito delicado, mas achei prudente mencionar de qualquer maneira. Se você usar vários esquemas e puder ter o mesmo nome de objeto em vários esquemas, não poderá dizer qual é (a menos que sua(s) contraparte(s) ainda exista(m). Há um caso externo em que UserA pode ter descartado SchemaB.Tablename enquanto UserB pode ter descartado SchemaA.Tablename. O rastreamento padrão não rastreia o esquema do objeto (nem captura
TextData
para este evento) e oObjectID
incluído no rastreamento não é útil para uma correspondência direta (porque o objeto foi descartado e não existe mais). Incluir essa coluna na saída neste caso pode ser útil para fazer referência cruzada com quaisquer cópias da tabela com o mesmo nome que ainda existam, mas se o sistema estiver tão desordenado (ou se todas essas cópias tiverem sido excluídas), haverá ainda pode não ser uma maneira confiável de adivinhar qual cópia da tabela foi descartada por quem.Eventos Estendidos
A seguir está a lista de dados que você pode selecionar da
system_health
sessão no SQL Server 2008 e 2008 R2 ( essa lista é mais completa em versões modernas ):Em Use the system_health event session (MSDN) , a lista é um pouco expandida no SQL Server 2012 (e permanece a mesma para o SQL Server 2014):
No SQL Server 2016, mais dois eventos são capturados:
KILL
comando.(A documentação ainda não foi atualizada, mas escrevi no blog sobre como descubro essas e outras alterações .)
Para obter a configuração mais enigmática aplicável à sua versão específica, você sempre pode executar a seguinte consulta diretamente, mas terá que interpretar os nomes e analisar os predicados para corresponder às listas de idiomas mais naturais acima:
Se você estiver usando Grupos de Disponibilidade, também há duas novas sessões em execução:
AlwaysOn_failover
eAlwaysOn_health
. Você pode ver os dados que eles coletam com a seguinte consulta:Essas sessões de evento usam alvos de buffer de anel para armazenar os dados, portanto, como o buffer pool e o cache do plano, os eventos mais antigos serão eliminados gradualmente, portanto, você não poderá necessariamente extrair eventos do intervalo de datas desejado.
Exemplo
Na pergunta, coloquei esta pergunta fictícia:
Aqui está um exemplo (e provavelmente não muito eficiente) de consulta que pode extrair essas informações da
system_health
sessão:(Este exemplo toma emprestado vagamente da postagem introdutória do blog de Amit Banerjee na
system_health
sessão .)Para obter mais informações sobre eventos estendidos (incluindo muitos exemplos em que você pode consultar dados específicos), consulte esta série de blog de 31 partes de Jonathan Kehayias:
https://www.sqlskills.com/blogs/jonathan/an-xevent-a-day-31-days-of-extended-events/
Registro de erros
O SQL Server, por padrão, mantém os 6 arquivos de log de erros mais recentes (mas você pode alterar isso ). Muitas informações são armazenadas lá, incluindo informações de inicialização (quantos núcleos estão em uso, se as páginas de bloqueio na memória estão definidas, modo de autenticação etc.), bem como erros e outros cenários graves o suficiente para serem documentados (e não capturados em outro lugar). Um exemplo recente foi alguém procurando quando um banco de dados foi colocado offline. Você pode determinar isso examinando cada um dos 7 logs de erro mais recentes para o texto
Setting database option OFFLINE
:Cobri alguns outros detalhes nesta resposta recente , e também há algumas boas informações básicas no toadworld e também na documentação oficial .
Um grupo de "erros" que o log de erros rastreia por padrão - e pode fazer com que informações importantes caiam muito mais rapidamente - é cada mensagem de backup bem-sucedida. Você pode impedir que eles preencham o log de erros com ruído ativando o sinalizador de rastreamento 3226 .