Сжатие журнала транзакций

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

ms178037.note(ru-ru,SQL.90).gifПримечание.
Если журнал транзакций не усекался в последнее время, его сжатие может быть невозможным до тех пор, пока не выполните усечение. Дополнительные сведения см. в разделе Факторы, вызывающие задержку усечения журнала.

Как работает сжатие файла журнала?

Единицей измерения уменьшения размера является виртуальный файл журнала. Например, если имеется файл журнала размером 600 мегабайт (МБ), разделенный на шесть виртуальных журналов по 100 МБ, размер файла журнала может уменьшаться на число, кратное 100 МБ. Размер файла может быть уменьшен до размера 500 МБ или 400 МБ, но не может быть уменьшен до размера 433 МБ или 525 МБ.

ms178037.note(ru-ru,SQL.90).gifПримечание.
Компонент Database Engine выбирает размер виртуального файла журнала динамически при его создании или расширении. Дополнительные сведения см. в разделе Физическая архитектура журнала транзакций.

Текущий размер файла журнала равен числу страниц, используемых виртуальными файлами журнала. Виртуальные файлы журнала, которые содержат часть логического журнала, не могут быть освобождены. Если все виртуальные файлы в журнале содержат части логического журнала, сжатие файла невозможно до тех пор, пока усечение журнала не пометит один или несколько виртуальных файлов журнала как неактивные.

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

При сжатии любого файла пространство освобождается в конце файла. При сжатии файла журнала транзакций в конце файла журнала освобождается достаточное количество виртуальных файлов журнала. Это происходит, чтобы журнал уменьшился до размера, заданного пользователем. Аргумент target_size, заданный пользователем, округляется до следующей самой большой границы виртуального файла. Например, если для файла в 600 МБ, который содержит шесть виртуальных файлов журнала размером по 100 МБ, пользователь указывает аргумент target_size, равный 325 МБ, последние два виртуальных файла журнала удаляются, и новый размер файла становится равным 400 МБ.

Операция DBCC SHRINKDATABASE или DBCC SHRINKFILE немедленно делает попытку сжать физический файл журнала до требуемого размера:

  • Если ни одна из частей логического журнала виртуальных файлов журнала не расширяет отметку target_size, виртуальные файлы журнала, находящиеся после отметки target_size, освобождаются, и инструкция DBCC успешно выполняется без сообщений.

Если часть логического журнала расширяет отметку target_size, компонент SQL Server Database Engine максимально освобождает пространство и выдает информационное сообщение. В сообщении говорится о том, какие действия необходимо выполнить, чтобы удалить логический журнал из виртуальных журналов в конце файла. После выполнения этих действий можно повторно выполнить инструкцию DBCC для освобождения оставшегося пространства.

Предположим, что имеется файл журнала размером 600 МБ, который содержит шесть виртуальных файлов журнала, имеет логический журнал, начинающийся в виртуальном журнале 3 и заканчивающийся в виртуальном журнале 4, при выполнении инструкции DBCC SHRINKFILE с аргументом target_size, равным 275 МБ.

Файл журнала с шестью виртуальными файлами журнала перед сжатием

Виртуальные журналы 5 и 6 освобождаются немедленно, так как они не содержат части логического журнала. Однако для достижения указанного значения аргумента target_size виртуальный файл журнала 4 также должен быть освобожден, но это невозможно, так как он содержит конечную часть логического журнала. После освобождения виртуальных файлов журнала 5 и 6 компонент Database Engine заполняет оставшуюся часть виртуального файла журнала 4 фиктивными записями. Это приводит к смещению конца файла журнала в конец виртуального файла журнала 1. В большинстве систем все транзакции, начинающиеся в виртуальном файле журнала 4, будут зафиксированы за несколько секунд. Это значит, что вся активная часть журнала перемещается в виртуальный файл журнала 1. Теперь файл журнала выглядит примерно так:

Файл журнала уменьшен до четырех виртуальных файлов

Инструкция DBCC SHRINKFILE также выдает информационное сообщение, в котором говорится, что она не может освободить все необходимое пространство и для освобождения оставшегося пространства может быть выполнена инструкция BACKUP LOG. После перемещения активной части виртуального файла журнала 1 инструкция BACKUP LOG произведет усечение всего логического журнала, находящегося в виртуальном файле журнала 4:

Файл журнала в результате усечения журнала

Так как виртуальный файл журнала 4 больше не содержит части логического журнала, можно выполнить ту же инструкцию DBCC SHRINKFILE с аргументом target_size, равным 275 МБ. Виртуальный файл журнала 4 после этого освобождается, и размер физического файла журнала уменьшится до необходимого размера.

ms178037.note(ru-ru,SQL.90).gifПримечание.
Определенные факторы, например длительная транзакция, могут поддерживать активность виртуальных файлов журнала в течение длительного времени. Это ограничивает возможности сжатия журнала или даже не допускает его. Дополнительные сведения см. в разделе Факторы, вызывающие задержку усечения журнала.

Когда журнал сжимается?

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

  • при выполнении операции автосжатия;
  • при выполнении инструкции DBCC SHRINKFILE для файла журнала;
  • при выполнении инструкции DBCC SHRINKDATABASE.

Для сжатия файла журнала

Для мониторинга событий сжатия файла журнала

Для мониторинга использования дискового пространства журналом

См. также

Основные понятия

Устранение неполадок при переполнении журнала транзакций (ошибка 9002)
Установка параметров базы данных
Использование резервных копий журналов транзакций
Усечение журнала транзакций

Другие ресурсы

BACKUP (Transact-SQL)
DBCC SHRINKDATABASE (Transact-SQL)
DBCC SHRINKFILE (Transact-SQL)
Выделение и повторное использование места на диске

Справка и поддержка

Получение помощи по SQL Server 2005