Como posso saber se um banco de dados do SQL Server ainda está sendo usado?

33

Estamos procurando descomissionar uma instância do SQL Server que ainda tem alguns bancos de dados.

Como posso saber se eles ainda estão sendo usados ​​pelos usuários ou por um aplicativo da web?

Encontrei um tópico do fórum que tinha uma consulta T-SQL que você poderia executar para recuperar a data da última consulta. Parece funcionar, mas quero saber se essas informações são válidas o suficiente para descartar bancos de dados. É isso?

Se você tiver métodos alternativos, isso também ajudaria.

jsauni
fonte
1
Muita discussão excelente abaixo, mas também veja este post do blog .
Aaron Bertrand

Respostas:

29

Você precisaria se preocupar com itens que foram eliminados do cache e que foram perdidos ou com bancos de dados com uso pouco frequente.

Em vez de descartar os bancos de dados da mão, coloque-os OFFLINE para impedir o acesso sem descartá-los ou no modo RESTRICTED_USER para limitar o acesso. Fazendo isso, você pode deixá-los nesse estado por um mês ou dois para verificar e verificar se há uso ocasional.

Você também pode usar um filtro de rastreamento de criador de perfil do servidor nesse banco de dados.

NicCain
fonte
24
Regra nº 1 de ser um DBA: nunca faça nenhuma alteração da qual não possa desistir rapidamente, se for necessário.
Caio
14

Estes são os métodos que eu usei no passado:

  1. Colocar o banco de dados offline / desanexar
  2. DENY acesso de usuário / login
  3. Rastreio do Profiler

O problema é este: quanto tempo você espera para ter certeza de que ninguém vai acessar os dados? Para dados financeiros, alguns itens são executados diariamente, semanalmente, mensalmente, trimestralmente, semestralmente e anualmente. Mas um ano é suficiente? Também vi solicitações para manter os dados disponíveis por pelo menos sete anos e, em um caso, disseram-me que os dados em um sistema precisavam estar lá para sempre, mesmo que ninguém os estivesse usando.

O melhor conselho é o seguinte: o que você faz para desativar o acesso, certifique-se de poder ativá-lo imediatamente. Eu descobri que o destacamento funcionou melhor para isso. Eu simplesmente escreveria a recolocação e instruiria minha equipe "se alguém perguntar onde está, execute esse script". Isso nos deu a melhor chance de colocar as coisas de volta o mais rápido possível.

SQLRockstar
fonte
Eu pensei sobre isso, se a quantidade de tempo que monitorei o uso do banco de dados foi longa o suficiente. Você apenas pega a natureza do SQL Server e faz esse julgamento?
jsauni
Sim, em algum momento, todos fazem com que todos concordem em desligar o computador e entendam que, se algum processo invasor falhar, você precisará recuperar as coisas rapidamente. contanto que eles estejam bem com uma interrupção e você coloque as coisas on-line rapidamente, você deve ficar bem. mas não é fácil fazer com que todos concordem!
SQLRockstar
13

Eu concordo com Nic com seu conselho. Se você precisar ter certeza, precisará usar o Profiler (rastreio do lado do serviço), porque algumas das consultas SQL não serão armazenadas em cache ou, por qualquer motivo, o cache do procedimento pode ser removido.

Normalmente, eu também verificaria as informações de estatísticas do arquivo virtual para ver se há alguma leitura ou gravação acontecendo no nível do arquivo do SO. Mesmo se o banco de dados NÃO estiver ativo, você ainda verá pequenas leituras / gravações se estiver fazendo backups de log, backups completos etc ... mas isso também lhe dará uma idéia da atividade de leitura / gravação nesse banco de dados.

Antes de descartar qualquer banco de dados, eu asseguraria que você tivesse pelo menos 2 ou 3 backups legíveis (teste-os) em locais separados. Você nunca sabe quando precisa deles.

Sankar Reddy
fonte
8

A consulta a seguir mostra os bancos de dados que não tiveram uso desde a última reinicialização, sem depender de planos de consulta mantidos no cache, pois mostram as E / S do usuário em relação aos índices (e heaps). Isso é mais ou menos como usar estatísticas de arquivo virtual, mas a DMV usada aqui exclui a atividade de E / S dos backups. Não é necessário manter um rastreamento do criador de perfil em execução, nenhum acionador ou auditoria é necessária. Obviamente, se você reiniciar o servidor SQL com frequência (ou anexar / desligar bancos de dados com frequência), talvez este não seja o caminho :-)

Dito isto, ainda concordo que, mesmo que essa consulta pareça confirmar que um banco de dados pode ser descartado, definitivamente faça o OFFLINE / desanexe ou negue o acesso do usuário por algum tempo, além de qualquer diligência de perguntar antes de realmente cair!

select [name] from sys.databases 
where database_id > 4
AND [name] NOT IN 
(select DB_NAME(database_id) 
from sys.dm_db_index_usage_stats
where coalesce(last_user_seek, last_user_scan, last_user_lookup,'1/1/1970') > 
(select login_time from sys.sysprocesses where spid = 1))
FloorDivision
fonte
Isso é ótimo se funcionar bem. Posso perguntar por que você está tomando a coalescência e comparando com o login_time? E por que você não incluiu last_user_update? É uma tentativa inteligente de ver se um banco de dados está recebendo INSERTS, mas ninguém nunca o está consultando? Ou é possível que esse DMV inclua todos os registros de data e hora NULL?
Jason
2

Eu trabalhei em um local que tinha um grande número de bancos de dados órfãos e semi-órfãos. Era difícil dizer se eles realmente eram órfãos, pois muitas tarefas eram sazonais ou anuais - para que o site funcione apenas de 3 a 4 meses por ano (por exemplo, os formulários W2 precisam ser arquivados eletronicamente em 1/31, portanto, o processamento do site estes ocorreram apenas de meados de janeiro até o final de abril).

O que foi feito foi uma combinação de:
* pergunte a todos os desenvolvedores se eles estão usando algum banco de dados ou outro (esses e-mails saem mensalmente ou sempre que os backups estão demorando muito).
* coloque o banco de dados offline e veja quem reclama.
* renomeie o servidor para ver quem reclama.

Como o chefe de cabelos pontudos só estava disposto a permitir documentação "completa e completa", um wiki foi expressamente proibido e as reduções de pessoal levaram a um declínio dramático na documentação que atendia ao padrão.

Se dependesse de mim, haveria uma página wiki por servidor com nomes de contato para cada banco de dados (e talvez uma breve descrição do que é o banco de dados). Qualquer banco de dados não documentado no wiki seria um bom jogo para exclusão.

Como tínhamos um grande cliente financeiro que ainda usava o SQL Server 2000 em 2009, tivemos que manter uma instância do SQL Server 2000 em execução até o cliente finalmente mudar para o SQL Server 2005.

Tangurena
fonte
2

Outras duas alternativas são:

  1. Crie gatilhos no banco de dados que notificarão você (ou armazenará em tabelas) de qualquer atividade.
  2. Habilite a auditoria nos bancos de dados.

    • Depende da sua versão do banco de dados.
StanleyJohns
fonte
2

A próxima solução mostra páginas temporárias totais, limpas e sujas em MB para bancos de dados específicos em sua instância (encontrados na Internet e modificados um pouco):

SELECT
    (CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
    COUNT(*) *8/1024 AS [TotalPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END) *8/1024 AS [CleanPages in MB],
    SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END) *8/1024 AS [DirtyPages in MB]
FROM sys.dm_os_buffer_descriptors
GROUP BY database_id
ORDER BY DB_NAME(database_id)

ou

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
where  attribute = 'dbid' 
order by last_execution_time desc

ou

select value [DBid],attribute, last_execution_time ,text
from
sys.dm_exec_query_stats
cross apply
sys.dm_exec_plan_attributes(plan_handle)
cross apply
sys.dm_exec_sql_text(plan_handle)
--where dbid=8
where 
      text like '%idAdministrator%' and
      attribute = 'dbid' 
      and value>= 5 -- dbid >=5 for user databases but include resource database which
                     --you can exclude by its numer I don't remember at the moment
order by last_execution_time desc
SQL Server Frant
fonte
2
Você poderia esclarecer como isso resolve o problema original?
Dezso