O chefe pediu uma lista de nomes de banco de dados junto com o tamanho e o nome da última pessoa a usar esse banco de dados. Encontrei recursos para quando um banco de dados foi acessado pela última vez, mas por quem. Como eu resolveria isso?
SQL2008R2 sendo usado e até agora eu tenho isso:
exec sp_MSForEachDB '
use ?
select ''?'', (SUM(df.size)*8)/1024 as ''Size (MB)''
from sys.database_files as df
'
É aceitável que o aspecto da última pessoa da resposta seja impreciso ou vago. ou seja, desde que seja alguém que tenha se aproximado vagamente recentemente, está "OK".
Se o seu servidor estiver ativo por um período de tempo confiável (por exemplo, pelo menos um ciclo de negócios), você poderá saber quando houve alguma leitura ou gravação em qualquer tabela em um banco de dados usando DMVs como
sys.dm_db_index_usage_stats
.Não há realmente uma maneira confiável de saber quem "usou" um banco de dados pela última vez. O SQL Server não registra essas informações, a menos que faça algo substancial (por exemplo, você pode ver que um usuário criou ou derrubou um objeto no rastreamento padrão , mas isso não lhe dirá de forma alguma que ele foi a última pessoa a acessar o banco de dados ou se foi a última vez que acessaram o banco de dados).
Para os tamanhos de arquivo de banco de dados, você realmente não precisa usar
sp_MSforeachdb
nada; e você não deve usar esse método de qualquer maneira. Aqui está o porquê:https://sqlblog.org/2010/12/29/a-more-reliable-and-more-flexible-sp_msforeachdb
https://sqlblog.org/2010/02/08/bad-habits-to-kick-relying-on-undocumented-behavior
http://www.mssqltips.com/sqlservertip/2201/making-a-more-reliable-and-flexible-spmsforeachdb/
Nesse caso, você não precisa percorrer todos os bancos de dados; esta informação é replicada na visão
master.sys.master_files
.Se você tiver que fazer algo por meio de vários bancos de dados que não são suportados por algo no mestre, prefiro fazer esse tipo de técnica do que usar
sp_MSforeachdb
:(Como um aparte, não use
'single quotes'
para delimitar um alias, use[square brackets]
. O primeiro é obsoleto em algumas formas - veja aqui e aqui - e faz seu alias parecer uma string literal de qualquer maneira.)Para a parte "quando", copiando da minha resposta aqui :
O SQL Server realmente não rastreia o acesso ao banco de dados da maneira que você deseja, pelo menos indo para trás (você pode configurar coisas como rastreamento do lado do servidor, eventos estendidos, auditoria, etc. daqui para frente).
Há uma coisa aproximada que você pode usar: DMVs que rastreiam o uso do índice e as estatísticas de procedimento/gatilho/consulta. Por exemplo:
Observe que essas estatísticas não são totalmente confiáveis, pois você pode não ter nenhum procedimento armazenado e as consultas encontradas
sys.dm_exec_query_stats
podem fazer referência a mais de um banco de dados e podem nunca refletir aquele com o qual você está preocupado.Além disso, eles são redefinidos quando o SQL Server é reiniciado, ou um banco de dados é desanexado / anexado ou restaurado, ou quando um banco de dados é fechado automaticamente e também pode depender, em alguns casos, dos planos que ainda estão no cache (o que outro banco de dados poderia assumir completamente em poucos minutos). Portanto, se você está olhando para o passado, a menos que saiba que nenhuma dessas coisas aconteceu durante todo um ciclo de negócios, eu não confiaria apenas nesses números para determinar se um banco de dados é usado (também pode haver processos automatizados que estão fazendo um banco de dados parece atual, mesmo que você não se importe que esses processos automatizados falhem quando você remover o banco de dados).
Outra observação é que determinados acessos ao índice podem não ser rastreados nas exibições de uso do índice; por exemplo, no SQL Server 2014, que adiciona tabelas com otimização de memória, a atividade nesses índices de hash não é capturada dessa maneira (e as exibições em que você acha que a atividade seria capturada, como
sys.dm_db_xtp_hash_index_stats
, não incluem nenhuma coluna de data/hora). Se você estiver usando SQL Server 2014 e OLTP na memória ("Hekaton"), convém adicionar alguma pesquisa para cobrir esses objetos (no caso de serem os únicos referenciados em um banco de dados).E mais uma observação é que as consultas capturadas por
sys.dm_exec_query_stats
podem ser falsos positivos. Por exemplo, se seu banco de dados tiverfilestream
/filetable
, você verá essas consultas sendo executadas pelo sistema ocasionalmente:Portanto, você pode querer adicionar filtragem adicional à consulta acima para filtrá-la (desde que o filtro não filtre acidentalmente as consultas com as quais você se importa). Esta é provavelmente uma adição segura a essa tabela derivada:
No final, a coisa mais segura a fazer em um ambiente de desenvolvimento é colocar os bancos de dados sobre os quais você não tem certeza offline por uma semana. Se ninguém reclamar, apoie-os e abandone-os. Se demorar mais de uma semana para alguém perceber que está faltando, você sempre pode restaurá-lo (lá ou em outro lugar).
Eu também escrevi um pouco sobre isso: