Сокращение журнала транзакций SQL Server

8

В настоящее время мне приходится иметь дело с журналом транзакций SQL Server, который вышел из-под контроля. Отказ от ответственности: я не dba, и это не моя область знаний, поэтому, пожалуйста, потерпите меня.

В настоящее время у меня есть файл журнала транзакций объемом 115 ГБ для базы данных объемом 500 МБ, который (очевидно) в течение некоторого времени плохо управлялся, чтобы он мог войти в это состояние.

Главный приоритет - освободить место на диске, занимаемое этим файлом, прежде чем мы исчерпаем! Мне сказали, что увеличивать размер диска нельзя, даже временно, и, исходя из прошлого роста, мы должны действовать довольно скоро.

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

Поскольку в полночь мы регулярно выполняем полное резервное копирование БД, могу ли я временно перевести базу данных в простой режим восстановления (после запуска одной из этих резервных копий), сжать файл журнала, чтобы освободить (практически все) пространство и затем верните его в полное восстановление с помощью стратегии резервного копирования, упомянутой выше?

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

ОБНОВИТЬ

Несколько дополнительных деталей в ответ на некоторые ответы и комментарии:

  • Мы хотим сохранить возможность восстановления на определенный момент времени, чтобы база данных оставалась в режиме полного восстановления.

  • Причина, по которой файл t-log стал настолько большим, заключается в том, что он никогда не копировался . Проверено как log_reuse_wait_desc возвращает «LOG_BACKUP».

Крейг Уокер
источник
Проверяли ли вы наличие каких-либо открытых транзакций или каких-либо специальных или запланированных задач, которые привели бы к увеличению журнала транзакций? Определение причины может помочь вам спланировать рост соответственно.
KASQLDBA
Как только вы переключите его в простой режим, вы больше не сможете выполнять восстановление журнала транзакций после этой точки, до следующего полного резервного копирования. Даже если вы переключите его обратно в режим полного восстановления, резервное копирование / восстановление-восстановление журнала транзакций не будет работать снова, пока вы не сделаете еще одну полную резервную копию. Поэтому обязательно сделайте полную резервную копию сразу после того, как вы вернете ее к полному восстановлению.
RBarryYoung
Обычная причина для таких файлов журналов, выходящих из-под контроля: 1) невозможность создания регулярных полных резервных копий, 2) невозможность создания регулярных резервных копий журнала транзакций, или 3) некоторые настройки в ваших полных или резервных копиях журналов (например, только для копирования). ), который не позволяет установить нормальные метки резервного копирования.
RBarryYoung
@RBarryYoung Мы убедились, что это потому, что не было выполнено ни одного резервного копирования t-log. Вы рекомендуете делать то, что я предлагал изначально, но делать полное резервное копирование вручную сразу после возврата БД в полное восстановление, чтобы избежать упомянутых проблем? Крайне важно, чтобы мы получили часть дискового пространства как можно скорее.
Крейг Уокер
AFAIK, нет смысла находиться в режиме полного восстановления, если вы не делаете резервные копии журналов. Если вы не планируете делать резервные копии журналов, просто оставьте его в простом режиме. Ваши полные резервные копии все равно будут восстановлены в любом случае, вы просто не сможете выполнить восстановление / откат, но вы все равно не сможете сделать это без резервного копирования журнала.
RBarryYoung

Ответы:

4

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

SELECT  d.Name
        ,d.log_reuse_wait_desc
FROM    sys.databases d
ORDER BY
        d.name

Если вы хотите восстановить момент времени, оставьте БД в модели полного восстановления и делайте частые резервные копии журналов. Каждая резервная копия журнала будет содержать все транзакции с момента последнего резервного копирования журнала. Процесс резервного копирования журнала также отвечает за очистку журнала и маркировку пространства для повторного использования, т.е. следующая транзакция, выполненная в БД, будет записана в начало усеченного журнала циклическим образом. Это резервное копирование и повторное использование журнала препятствует росту файла журнала.

Если вас не интересует момент восстановления времени и вы хотите упростить администрирование базы данных. Затем установите для базы данных простую модель восстановления и не делайте резервных копий t-log. SQL Server автоматически усекает журнал транзакций после каждой транзакции. Это означает, что после фиксации транзакции в журнале запись перезаписывается следующей транзакцией и т. Д.

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

Загрузите и разверните https://ola.hallengren.com/ решение для администрирования базы данных, чтобы охватить резервные копии, фрагментацию индекса, статистику и CHECKDB.

Вы также можете найти возвращенный отчет об использовании диска, щелкнув правой кнопкой мыши по БД в Object Explorer> Отчеты> Стандартные отчеты> «Использование диска», чтобы вернуть свободное место в t-log.

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

Pixelated
источник
3

Поскольку в полночь мы регулярно выполняем полное резервное копирование БД, могу ли я временно перевести базу данных в простой режим восстановления (после запуска одной из этих резервных копий), сжать файл журнала, чтобы освободить (практически все) пространство и затем верните его в полное восстановление с помощью стратегии резервного копирования, упомянутой выше?

Да, это будет безопасно при условии, что вы не будете вмешиваться в транзакции, например, в ночное время. В общем случае, если база данных должна находиться в режиме полного восстановления, необходимо регулярно создавать резервные копии T-Log. Это уменьшит проблему, с которой вы столкнулись. Я пишу «в общем», потому что в некоторых случаях я видел, как люди устанавливали базу данных на полную, не зная, почему они это сделали. Давайте предположим, что это не тот случай.

Вы можете подумать, почему журнал имеет такой размер относительно размера базы данных. База данных объемом 500 МБ с журналом 116 ГБ кажется очень непропорциональной для одного события. Я бы посоветовал следить за тем, что происходит в базе данных, чтобы увидеть, как она достигла такого размера.

user541852587
источник
Из того, что я понимаю, это продолжалось в течение шести месяцев или более с нулевым обслуживанием, отсюда и размер. Я сделаю так, как вы предлагаете, и буду следить за ростом файла, как только уладю проблему.
Крейг Уокер
Если честно, я хочу проголосовать за этот ответ.
Цзяо
1
На самом деле это НЕ безопасно переключаться с полного на простое восстановление, а затем начать делать сжатие. Из описания Крэйга Уокера, я полагаю, у этой базы данных нет резервной копии t-log. Поэтому первое, что нужно сделать, это проверить режим восстановления базы данных и то, что было выполнено последнее резервное копирование tlog (если это НЕ простой режим восстановления). Если существует резервная копия tlog, то проверьте, почему резервная копия tlog не очищает журнал, проверив [log_reuse_wait_desc] из представления sys.databases. По моему опыту, если большая часть файла журнала пуста, вы можете выполнить сжатие напрямую.
Цзяо
@jyao Ваше предположение верно, резервных копий журналов нет, и поэтому файл такой большой.
Крейг Уокер