Журнал транзакций SQL Server
Журнал транзакций SQL Server — это системный компонент реляционной системы управления базами данных Microsoft SQL Server, представляющий собой последовательный файл (или группу файлов), в котором фиксируются все изменения данных и структуры базы данных, а также каждая выполненная транзакция. Журнал транзакций является критически важным элементом обеспечения целостности, возможности восстановления после сбоев и поддержки механизмов репликации и моментальных снимков (snapshot) в SQL Server.
Назначение и принцип работы
Основная функция журнала транзакций — гарантировать, что база данных может быть восстановлена в согласованное состояние при любом сбое (отключение питания, ошибка оборудования, сбой программного обеспечения). SQL Server использует упреждающую запись журнала (Write-Ahead Logging, WAL). Согласно этому принципу, запись об изменении данных сначала фиксируется в журнале транзакций, и только после этого изменённая страница данных записывается на диск (операция checkpoint). Это гарантирует, что в случае сбоя система может либо откатить незавершённые транзакции (ROLLBACK), либо завершить уже зафиксированные, но не записанные в данные (REDO).
Журнал транзакций работает на уровне логических записей, называемых записями журнала (log records). Каждая запись содержит уникальный номер последовательности в журнале (Log Sequence Number, LSN), идентификатор транзакции, тип операции (вставка, обновление, удаление, создание индекса и т.д.), а также данные до и после изменения (для операций обновления).
Физическая структура
Журнал транзакций хранится в одном или нескольких физических файлах с расширением .ldf (Log Data File). Каждая база данных SQL Server имеет как минимум один файл журнала. Файл журнала логически делится на виртуальные файлы журнала (Virtual Log Files, VLF). VLF — это сегменты фиксированного размера, которые SQL Server управляет как единицами повторного использования пространства. Количество и размер VLF зависят от общего размера файла журнала и его настроек роста.
Журнал транзакций является циклическим (для простой модели восстановления) или растущим (для полной модели). В простой модели восстановления пространство, занятое записями о завершённых транзакциях, автоматически освобождается после контрольной точки. В полной модели записи хранятся до тех пор, пока не будет выполнена резервная копия журнала.
Модели восстановления
SQL Server поддерживает три модели восстановления, определяющие поведение журнала транзакций:
- Простая (Simple) — журнал автоматически усекается после каждой контрольной точки. Восстановление возможно только до последней полной или разностной резервной копии. Невозможно восстановление на момент времени (point-in-time recovery). Используется для баз данных, где потеря данных между резервными копиями допустима.
- Полная (Full) — все транзакции полностью записываются в журнал. Усечение журнала происходит только после выполнения резервного копирования журнала транзакций. Позволяет восстановить базу данных на любой момент времени в пределах последней резервной копии журнала. Требует регулярного резервного копирования журнала для предотвращения его неконтролируемого роста.
- С неполным протоколированием (Bulk-Logged) — для массовых операций (например, BULK INSERT, CREATE INDEX) протоколируется только результат, а не каждая строка. Это снижает нагрузку на журнал, но не позволяет восстановить базу данных на момент времени, если в период между резервными копиями выполнялись массовые операции.
Операции с журналом транзакций
Резервное копирование журнала
Резервная копия журнала транзакций (log backup) содержит все записи журнала, созданные с момента последней резервной копии журнала (или с момента создания полной резервной копии). Восстановление базы данных с использованием полной модели восстановления требует последовательного применения цепочки резервных копий журнала.
Усечение журнала
Усечение (log truncation) — это процесс освобождения пространства в файле журнала путём удаления записей о завершённых транзакциях, которые больше не нужны для восстановления. В простой модели усечение происходит автоматически. В полной модели — только после резервного копирования журнала. Если усечение не происходит (например, из-за долгой открытой транзакции или отсутствия резервного копирования), журнал может расти до заполнения диска.
Мониторинг и управление размером
Размер журнала транзакций можно отслеживать с помощью системных представлений, таких как sys.dm_db_log_space_usage и sys.database_files. Для управления размером используются команды DBCC SHRINKFILE (с осторожностью, так как это может привести к фрагментации VLF) и ALTER DATABASE ... MODIFY FILE для изменения начального размера или параметра автоприроста.
Проблемы и их решение
- Чрезмерный рост журнала — наиболее частая проблема. Причины: отсутствие резервного копирования журнала (в полной модели), долгие открытые транзакции, неправильная настройка модели восстановления, репликация или зеркалирование. Решение: выполнить резервное копирование журнала, найти и завершить долгие транзакции, переключить модель восстановления на простую (если это допустимо).
- Повреждение журнала — может произойти из-за сбоя диска или ошибки ввода-вывода. В этом случае база данных переходит в состояние «подозрительная» (suspect) или требует восстановления. Восстановление возможно только из резервной копии; в крайнем случае — с использованием опции
WITH CONTINUE_AFTER_ERRORили восстановления до последней полной копии. - Фрагментация VLF — возникает при частом увеличении или уменьшении файла журнала. Большое количество мелких VLF может снизить производительность операций записи. Решение: выполнить ручное усечение и изменение размера файла с оптимальным количеством VLF (рекомендуется не более 1000 VLF на файл).
Влияние на производительность
Журнал транзакций является узким местом для операций записи, так как каждая транзакция должна быть зафиксирована в журнале до подтверждения. Для повышения производительности рекомендуется:
- Размещать файл журнала на отдельном быстром диске (SSD) с низкой задержкой.
- Использовать правильный размер начального файла и автоприроста (фиксированный, а не в процентах).
- Минимизировать количество долгих транзакций.
- Настраивать параметр
log buffer size(по умолчанию 60 КБ) иmax server memoryдля оптимального кэширования.
Интересные факты
- Журнал транзакций не может быть размещён на сжатом томе NTFS (сжатие на уровне файловой системы не поддерживается).
- SQL Server не позволяет удалить файл журнала без удаления базы данных, но существуют методы для его восстановления при повреждении (например, использование опции
EMERGENCY). - В версиях SQL Server 2019 и выше появилась возможность использования ускоренного восстановления базы данных (Accelerated Database Recovery, ADR), которое уменьшает время отката долгих транзакций за счёт использования версионного хранения в журнале.
- Журнал транзакций используется не только для восстановления, но и для репликации (например, для технологии Always On Availability Groups), а также для создания моментальных снимков (snapshot) базы данных.
Источники
- Microsoft Docs: «Transaction Log Architecture» (SQL Server documentation)
- Microsoft Docs: «Manage the size of the transaction log file»
- Microsoft Docs: «Models of recovery (SQL Server)»
- Microsoft Docs: «Write-ahead logging (WAL)»
- Microsoft Docs: «Virtual Log Files (VLFs)»
- Microsoft Docs: «Accelerated database recovery (ADR)»
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →