Определить события роста файлов

9

Я обнаружил несколько БД в моем портфеле, которые были созданы с настройками автоматического увеличения по умолчанию (с шагом 1 МБ или 10%), которые расширялись в течение длительного периода времени. Если бы я хотел получить оценку количества внешней фрагментации для каждого из файлов БД, могу ли я получить из метаданных, сколько раз размер файла БД был изменен (автоматически или вручную)? Чтобы уточнить, могу ли я получить из метаданных историю изменений файла БД за время существования БД, а не только после перезапуска экземпляра?

MattyZDBA
источник
1
Если они не были сокращены в какой-то момент, это должен быть простой расчет от начального размера до текущего размера на основе настройки автоматического увеличения?
Мартин Смит
Если бы он был изменен только с помощью autogrow, я бы согласился, но я видел, как выполнялись ручные изменения, которые могут быть за пределами настроек autogrow.
MattyZDBA

Ответы:

20

Вы можете получить информацию о событиях автоматического роста из трассировки по умолчанию, если она включена:

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%';

Вы можете видеть из этого , что след по умолчанию это есть файл данных Auto Grow и Log File Auto Grow события захвата. Чтобы проверить, включена ли трассировка по умолчанию для этого экземпляра, вы можете сделать следующее:

exec sp_configure 'default trace enabled';
go

Примечание. Это расширенный параметр конфигурации, поэтому show advanced optionsдля просмотра этого параметра необходимо установить значение 1 sp_configure. Кроме того, эти два события не будут вызваны, если файл вырос вручную .

Вот быстрый пример запроса для получения этих событий:

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;

И вы можете получить <Trace Path>из системной функции sys.fn_trace_getinfo:

select *
from sys.fn_trace_getinfo(1);
Томас Стрингер
источник
Это хорошая информация, просто имейте в виду, что некоторые из этих событий вполне могли истечь из трассы по умолчанию.
Nic
Абсолютно, но я считаю, что это единственный готовый мониторинг, к которому OP может приступить, фактически выполнив надлежащий аудит.
Томас Стрингер