Бэкап журнала транзакций MSSQL и правильное усечение лога (Truncation)
Ошибки администрирования журнала транзакций вызывают остановку бизнес-процессов СУБД:
- Ошибка
The transaction log for database 'ERP_1C' is full due to 'LOG_BACKUP' (Error 9002); - Файл
.ldfразрастается до сотен гигабайт, занимая весь свободный объем накопителя; - База переходит в режим Read-Only или зависает при попытке проведения документов 1С.
1. Принцип усечения журнала (Log Truncation)
Журнал транзакций состоит из виртуальных файлов журнала (VLF — Virtual Log Files). В модели восстановления FULL неактивные VLF (в которых транзакции уже зафиксированы на диске контрольной точкой Checkpoint) не освобождаются до тех пор, пока не будет выполнен бэкап журнала:
BACKUP LOG [ERP_1C]
TO DISK = N'E:\Backup\Log\ERP_1C_Log_Current.trn'
WITH COMPRESSION, CHECKSUM;2. Анализ причин блокировки усечения лога
Если бэкап лога выполняется, но файл LDF не освобождает место внутри, выполните диагностический запрос:
SELECT name, log_reuse_wait, log_reuse_wait_desc
FROM sys.databases
WHERE name = N'ERP_1C';Расшифровка статусов `log_reuse_wait_desc`:
- LOG_BACKUP: Требуется выполнить BACKUP LOG (лог еще не архивирован);
- ACTIVE_TRANSACTION: В базе есть зависшая длительная незафиксированная транзакция (например, фоновый пересчет итогов 1С);
- REPLICATION / AVAILABILITY_GROUP: Вторичные реплики AlwaysOn или подписчики репликации отстают и не вычитали транзакции;
- CHECKPOINT: Требуется сброс грязных страниц из RAM на диск.
3. Поиск зависших открытых транзакций
DBCC OPENTRAN ([ERP_1C]);
-- Детальный анализ сессии, удерживающей лог
SELECT
r.session_id,
s.login_name,
s.host_name,
r.start_time,
r.status,
t.text AS sql_script
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t; Частые вопросы (FAQ)
Уменьшает ли физический размер файла .ldf команда BACKUP LOG?
Нет. BACKUP LOG освобождает виртуальные лог-файлы (VLF) внутри структуры .ldf для повторной циклической перезаписи новыми транзакциями, но физический размер файла на диске не уменьшается автоматически. Для уменьшения физического размера требуется DBCC SHRINKFILE.
Как часто нужно делать бэкап журнала транзакций?
В типовых конфигурациях 1С:Предприятие рекомендуется интервал от 5 до 15 минут. Это обеспечивает минимальное окно потери данных (RPO) и удерживает размер файла LDF в компактных пределах (10-30 ГБ).
Почему нельзя переводить рабочую базу в SIMPLE ради очистки лога?
Перевод базы в модель SIMPLE мгновенно и безвозвратно разрывает цепочку LSN (Log Sequence Number). Вы потеряете возможность восстановления базы на момент времени (Point-in-Time Recovery) вплоть до следующего полного Full бэкапа.
Что делать, если log_reuse_wait_desc показывает REPLICATION, хотя репликация отключена?
Выполните сброс репликационного флага журнала: EXEC sp_repldone @xactid = NULL, @xact_seqno = NULL, @numtrans = 0, @time = 0, @reset = 1.