--Variables for cursors
DECLARE @DBName nvarchar(100)
--Cursor for temp..LogFiles filling
DECLARE Cursor_for_EnumDBs CURSOR
FOR SELECT name FROM sys.databases
WHERE name <> 'master' AND
name <> 'tempdb' AND
name <> 'model' AND
name <> 'msdb' AND
name <> 'NoShrinkLogDB'
ORDER BY name;
OPEN Cursor_for_EnumDBs
FETCH NEXT FROM Cursor_for_EnumDBs INTO @DBName WHILE @@FETCH_STATUS = 0
BEGIN
--Dynamic query for Transaction Log shrink
EXEC('
USE ' + @DBName + ';
DECLARE @LogName nvarchar(100);
SELECT name INTO #LogFiles FROM sys.database_files WHERE type = 1 AND state = 0;
DECLARE Cursor_for_EnumLogFiles CURSOR FOR SELECT * FROM #LogFiles
OPEN Cursor_for_EnumLogFiles
FETCH NEXT FROM Cursor_for_EnumLogFiles INTO @LogName WHILE @@FETCH_STATUS = 0
BEGIN
DBCC SHRINKFILE(@LogName);
FETCH NEXT FROM Cursor_for_EnumLogFiles INTO @LogName
END
CLOSE Cursor_for_EnumLogFiles
DEALLOCATE Cursor_for_EnumLogFiles
')
FETCH NEXT FROM Cursor_for_EnumDBs INTO @DBName
END
CLOSE Cursor_for_EnumDBs
DEALLOCATE Cursor_for_EnumDBsclear
Зачем вообще уменьшать журнал транзакций SQL Server
Журнал транзакций (Transaction Log) — критически важная часть MS SQL Server. Он отвечает за восстановление данных, репликацию, Always On и корректную работу транзакций.
Но со временем .ldf-файлы могут разрастаться до десятков и сотен гигабайт, особенно если:
- не настроены регулярные бэкапы логов;
- база работает в режиме FULL или BULK_LOGGED;
- были массовые операции (DELETE, BULK INSERT, INDEX REBUILD);
- ранее возникали ошибки дискового пространства.
Shrink логов — это не лечение, а разовая операция, которую нужно делать осознанно и правильно.
Когда shrink журнала транзакций оправдан
Использовать shrink имеет смысл только в конкретных ситуациях:
- после аварийного роста
.ldf; - при миграции базы на новый сервер;
- перед переносом БД или бэкапом на внешний носитель;
- после разовой массовой очистки данных;
- если точно известно, что текущий размер лога больше никогда не понадобится.
💡 Если лог растёт регулярно — shrink лишь маскирует проблему, а не решает её.
Когда shrink делать НЕ стоит
Shrink логов — частая ошибка администраторов. Не стоит выполнять его:
- на продуктивных системах «по расписанию»;
- при активных транзакциях;
- если не настроены бэкапы журналов;
- без понимания режима восстановления базы;
- на системных БД без крайней необходимости.
⚠️ Регулярный shrink = фрагментация + деградация производительности.
Влияние режима восстановления (Recovery Model)
Поведение журнала напрямую зависит от режима восстановления базы данных:
- FULL — лог очищается только после backup log;
- BULK_LOGGED — частично логгируемые операции;
- SIMPLE — лог очищается автоматически.
Перед выполнением shrink обязательно проверь текущий recovery model и убедись, что это не нарушит стратегию восстановления.
Почему лог не уменьшается после shrink
Частая ситуация: команда выполнена, а размер .ldf не меняется. Основные причины:
- активные транзакции;
- незавершённые репликации;
- Always On / Mirroring;
- открытые курсоры;
- long-running queries;
- отсутствие backup log (для FULL).
Shrink не может «отрезать» активную часть журнала — это нормально.
Лучшие практики работы с Transaction Log
Чтобы больше не возвращаться к shrink:
- настроить регулярные backup log;
- заранее задавать разумный размер
.ldf; - использовать автогроу не в MB, а в фиксированном шаге;
- контролировать long-running транзакции;
- мониторить использование лога;
- разделять data и log по разным дискам.
Shrink — это экстренная мера, а не часть рутинного обслуживания.
FAQ — частые вопросы
Можно ли делать shrink на рабочей базе?
Можно, но только при минимальной нагрузке и с пониманием последствий.
Опасен ли shrink?
Нет, если сделан правильно. Да — если использовать регулярно.
Нужно ли делать shrink после каждого backup log?
Нет. Это типичная ошибка.
Shrink уменьшает занятое место или максимальный размер?
Shrink уменьшает физический размер файла, но не меняет логику роста.
Советы администратора
- Сделай snapshot или полный backup до shrink
- Никогда не автоматизируй shrink
- Проверяй активные транзакции перед операцией
- Планируй размер логов заранее, а не «лечи последствия»
- Один правильный backup log лучше десяти shrink’ов


