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

Если файл журнала транзакции содержит неиспользованное пространство, можно освободить его, уменьшив размер журнала. Этот процесс называется сжатием файла журнала.

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

ПримечаниеПримечание

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

Сжатие файла журнала (без сжатия файлов базы данных)

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

To monitor log space

ПримечаниеПримечание

Можно задать автоматическое выполнение сжатия файлов базы данных и журнала. Однако автоматическое сжатие не рекомендуется, поэтому свойство autoshrink базы данных по умолчанию имеет значение FALSE. Если свойство autoshrink имеет значение TRUE, то автоматическое сжатие уменьшит размер файла только в том случае, если неиспользуемое пространство занимает более 25 % от общего объема. Файл будет сжат либо до размера, в котором 25 % пространства не используется, либо до исходного размера, каким бы большим он ни был. Дополнительные сведения об установке свойства autoshrink см. в разделе Как просмотреть или изменить свойства базы данных (среда SQL Server Management Studio) при использовании свойства Auto Shrink на странице Параметры или в разделе Параметры ALTER DATABASE SET (Transact-SQL) при использовании параметра AUTO_SHRINK.

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

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

ПримечаниеПримечание

Компонент 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 МБ (т. е. три четверти виртуального журнала 3).

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

Виртуальные журналы 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 после этого освобождается, и размер физического файла журнала уменьшится до необходимого размера.

ПримечаниеПримечание

Определенные факторы, например длительная транзакция, могут поддерживать активность виртуальных файлов журнала в течение длительного времени. Это ограничивает возможности сжатия журнала или даже не допускает его. Дополнительные сведения см. в разделе Факторы, могущие вызвать задержку усечения журнала.