Identificar eventos de crescimento de arquivos

9

Estou descobrindo vários bancos de dados no meu portfólio que foram criados com configurações de crescimento automático padrão (incrementos de 1 MB ou 10%) que foram expandidas por um longo período de tempo. Se eu quisesse avaliar a quantidade de fragmentação externa de cada um dos arquivos de banco de dados, posso obter dos metadados quantas vezes um arquivo de banco de dados foi modificado em tamanho (por crescimento automático ou manualmente)? Para esclarecer, posso obter dos metadados o histórico de modificações no arquivo do banco de dados durante a vida útil do banco de dados, não apenas desde o reinício da instância?

MattyZDBA
fonte
11
A menos que eles também tenham sido reduzidos em algum momento, este deve ser um cálculo simples, do tamanho inicial ao tamanho atual, com base na configuração de crescimento automático?
Martin Smith
Se ele foi modificado apenas pelo crescimento automático, eu concordo, mas já vi modificações manuais que podem estar fora das configurações do crescimento automático.
MattyZDBA

Respostas:

20

Você pode obter informações sobre eventos de crescimento automático a partir do rastreamento padrão, se estiver ativado:

select distinct
    ei.eventid,
    e.name
from sys.fn_trace_geteventinfo(1) ei
inner join sys.trace_events e
on e.trace_event_id = ei.eventid
where name like '%grow%';

É possível ver a partir disso que o rastreamento padrão possui a captura de eventos Crescimento automático do arquivo de dados e Crescimento automático do arquivo de log . Para verificar se você tem o rastreamento padrão ativado nessa instância, faça o seguinte:

exec sp_configure 'default trace enabled';
go

Nota: esta é uma opção de configuração avançada, portanto, show advanced optionsseria necessário definir 1 para visualizar essa opção de configuração sp_configure. Além disso, esses dois eventos não serão acionados se o arquivo crescer manualmente .

Aqui está uma rápida amostra de consulta para obter esses eventos:

select
    te.name as event_name,
    tr.DatabaseName,
    tr.FileName,
    tr.StartTime,
    tr.EndTime
from sys.fn_trace_gettable('<Trace Path>', 0) tr
inner join sys.trace_events te
on tr.EventClass = te.trace_event_id
where tr.EventClass in (92, 93)
order by EndTime;

E você pode obter <Trace Path>da função do sistema sys.fn_trace_getinfo:

select *
from sys.fn_trace_getinfo(1);
Thomas Stringer
fonte
Esta é uma boa informação, mas lembre-se de que alguns desses eventos podem ter expirado a partir do rastreamento padrão.
Nic
Absolutamente, mas acredito que é o único monitoramento pronto para uso que o OP fará com a realização da auditoria adequada.
6173 Thomas Stringer