Sql Server - лучшие практики для роста файлов базы данных

16

Я следил за ростом файлов через сборщик данных в SQL Server 2008 R2 в течение двух недель. База данных постоянно растет на уровне около 35 (МБ) / день. БД еще не достигла первоначального размера в 2 ГБ.

Автоматический рост файлов БД установлен на 5 МБ, и я хотел бы попробовать другой подход, поэтому я ищу предложения и комментарии.

Существует задание по настройке, которое выполняется каждую неделю в воскресенье вечером в 1:30. Задача будет:

  • Проверьте целостность базы данных
  • Сжатие файла журнала - (Это нормально, потому что режим регистрации прост)
  • Сжатие базы данных
  • Реорганизовать индекс
  • Перестроить индекс
  • Обновить статистику
  • Очистить историю

Я хотел бы добавить еще два шага к плану еженедельной настройки:

  1. Увеличьте файл базы данных на 500 МБ, если используемое пространство достигает определенного порога или общего размера.
  2. Увеличьте файл журнала на 250 МБ (после сжатия), если используемое пространство достигает определенного порога общего размера.

Размещая бремя роста в нерабочее время, я надеюсь повысить производительность, сократив количество событий автоматического роста при больших нагрузках.

У меня есть два вопроса, касающихся автоматического увеличения файлов.

  • Лучшее место, чтобы поместить шаги роста файла, было бы до текущих шагов или после?
  • Если я использую ALTER DATABASE|MODIFY FILEдля увеличения файла, то как я могу определить, если SpaceUsedInFile >= (TotalFileSpace-@AllowanceThreshold)?
Росс Буш
источник
2
Ваша БД должна иметь достаточный размер, чтобы она никогда не увеличивалась. Тем не менее, убедитесь, что включена мгновенная инициализация файла .
Ремус Русану
3
@Remus, хотя вы и идеальны, вы говорите, что вы идеально настроили каждую базу данных на протяжении всей своей карьеры? Всегда будут какие-то догадки и корректировки. Я согласен, что рост следует контролировать, а не просто делать это 7 раз в день.
Аарон Бертран
3
@AaronBertrand: я поддерживаю упрощенный, гиперболический совет. Со временем я узнал, что это лучше. Большинство пользователей не могут справиться с «это зависит», и те, кто это делает, сами могут понять, что между черным и белым есть оттенки серого ...
Remus Rusanu
3
@DanAndrews: перераспределение может иметь эффект «вниз по течению». Представьте, что разработчик пытается восстановить БД на своем компьютере только для того, чтобы обнаружить, что ему нужны два новых диска емкостью 1 ТБ для 1 ГБ данных ...
Remus Rusanu
2
Я играю только защитника дьявола. Однако HD дешевы. Потеря времени на производство для перенастройки и потери производительности стоит дорого.
Дэн Эндрюс

Ответы:

24

Вы должны стремиться к саморазвитию как можно меньше. Семь раз в день мучительно, даже с мгновенной инициализацией файла.

Не делайте Shrink Database. Когда-либо. Может быть, Shrinkfile, но только после необычного события. Сокращение его только для того, чтобы снова расти, является бесполезным упражнением и должно фактически называться автофрагментом.

Если модель восстановления проста, на земле нет никакого способа, вам нужно увеличить файл журнала на 250 ГБ. Используемое пространство в файле автоматически очищается с течением времени, если только вы не начали транзакцию месяц назад и не намерены когда-либо ее фиксировать или откатывать.

Так что мой совет будет:

Автоматически увеличивайте файл данных вручную в течение тихого периода до размера, который будет соответствовать нескольким месяцам роста. Для чего вы его сохраняете?

Установите для файла данных приращение автоматического увеличения относительно небольшого размера (чтобы оно не прерывало пользователей, когда это произойдет) и предупреждайте об этом событии (например, его можно отследить в трассировке по умолчанию или в расширенном режиме). События). Это может сказать вам, что вы достигли вершины, которую вы оценили, и пришло время снова расти вручную. На этом этапе вы захотите сохранить это руководство на тот случай, если вы захотите добавить новый файл / файловую группу на другой диск, чтобы вместить пространство, поскольку в итоге вы будете заполнять текущий диск.

Автоматически увеличивайте размер файла журнала, скажем, вдвое больше, чем когда-либо. Он не должен автоматически расти дальше, пока не произойдет какая-то ненормальная транзакция, удерживающая вещи. Вы должны следить за этим событием, чтобы вы знали о них.

Аарон Бертран
источник
Спасибо за ввод ... Я воспользуюсь вашим советом по расширению файла журнала и некоторое время буду за ним следить. Я неправильно использовал ГБ для МБ в размере autgrow. Я согласен и не думаю, что Shrink Database делает то, для чего она была предназначена. В конце года объем базы данных достиг 15 ГБ, на момент создания задания у нас не хватало места для резервных копий.
+1 для должен называться автофрагментом :-) Вы уже запустили проблему Connect для этого? :-)
marc_s
10

Авто рост это то, что вы должны стараться избегать, если это возможно. Проблема в том, что у вас нет контроля над тем, когда может произойти рост, и ваша система может серьезно пострадать, когда это произойдет.

Установите размер файла на что-то разумное в течение месяца или около того и следите за скоростью его роста, определите, сколько места вы оцениваете в течение X промежутка времени, и установите для этого размер + погрешность.

Я настроил простую работу по мониторингу, которая будет предупреждать меня, когда размер файла достигает предопределенного максимума перед автоматическим ростом. Вы можете использовать что-то вроде этого:

SELECT instance_name,
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
       into ##Logsize
FROM
(
   SELECT *
   FROM sys.dm_os_performance_counters
   WHERE counter_name IN
   (
       'Data File(s) Size (KB)',
       'Log File(s) Size (KB)',
       'Log File(s) Used Size (KB)',
       'Percent Log Used'
   )
     AND instance_name = 'database your interested in' 
) AS Src
PIVOT
(
   MAX(cntr_value)
   FOR counter_name IN
   (
       [Data File(s) Size (KB)],
       [LOG File(s) Size (KB)],
       [Log File(s) Used Size (KB)],
       [Percent Log Used]
   )
) AS pvt 
go
declare @logsize int
Select @logsize = [Percent Log Used] from ##Logsize

If @logsize > the maximum percent you want the log to fill too i.e 90
    BEGIN
        --Do your thing here
    END

Drop table ##Logsize

Это, конечно, может быть запланировано как работа.

Ник винстанли
источник
Я удаляю "И экземпляр_имя = 'база данных, в которой вы заинтересованы", чтобы она возвращала все базы данных. Затем используйте счет, где размер журнала превышает пороговое значение в операторе IF. Если число больше 1, я делаю sp_send_dbmail с оператором выбора имени из временной таблицы, чтобы отправить по электронной почте имена журналов сверх лимита.
Ник Уинстанли,