Расшифровка ошибки 1С
"Журнал транзакций для базы данных "YourDb" переполнен"
- Где возникает
- Клиент-серверная 1С на MS SQL Server. Окно "Ошибка СУБД" получает любой сеанс, который пытается записать данные: проведение, обмен, регламентное задание. Чтение и отчёты обычно ещё работают.
- Что значит
- Файл .ldf вашей рабочей базы заполнен, а вырасти ему некуда: кончился диск или упёрся заданный потолок размера. Затереть старые записи SQL Server не вправе, они ещё кому-то нужны. Кому, написано после "due to" или "из-за".
Как ещё выглядит этот текст
- The transaction log for database is full due to LOG_BACKUP
- The transaction log for database is full due to ACTIVE_TRANSACTION
- The transaction log for database is full due to AVAILABILITY_REPLICA
- The transaction log for database is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases
- Журнал транзакций для базы данных переполнен из-за LOG_BACKUP
- Журнал транзакций для базы данных переполнен из-за ACTIVE_TRANSACTION
- журнал транзакций переполнен 1с
- transaction log is full 1c
- native=9002
- ошибка 9002
- Error 9002 SQL Server
- журнал транзакций переполнен log_reuse_wait_desc
Причины
| Причина | Как узнать | Как часто |
|---|---|---|
| Модель восстановления FULL, а резервных копий журнала нет или они идут слишком редко | log_reuse_wait_desc = LOG_BACKUP, recovery_model_desc = FULL; в плане обслуживания только полные бэкапы базы | чаще всего у нас, в большинстве обращений про журнал |
| Длинная или зависшая открытая транзакция: оборванный сеанс, упавшее регламентное задание, массовая обработка одной транзакцией | log_reuse_wait_desc = ACTIVE_TRANSACTION; DBCC OPENTRAN показывает старую транзакцию | встречали сами |
| Реструктуризация таблиц при обновлении конфигурации в модели FULL: журнал за одно обновление вырастает в разы | Ошибка всплыла во время или сразу после обновления конфигурации с изменением структуры | известная причина |
| Вторичная реплика AlwaysOn отстала и ещё не применила записи журнала | log_reuse_wait_desc = AVAILABILITY_REPLICA | известная причина, у нас не встречалась |
Порядок действий
-
Прочитайте хвост сообщения. После “due to” (в русской локализации “из-за”) SQL Server уже назвал причину. Если в тексте стоит
tempdb, вам на другую страницу: ошибка 9002 в tempdb. Если имя рабочей базы, идём дальше. -
Снимите диагноз двумя запросами. Первый покажет модель восстановления и держателя, второй - сколько процентов журнала занято по каждой базе экземпляра.
-- что мешает переиспользовать журнал
SELECT name, recovery_model_desc, log_reuse_wait_desc
FROM sys.databases
WHERE name = 'YourDb';
-- размер журнала и процент заполнения по всем базам
DBCC SQLPERF(LOGSPACE);
- При
LOG_BACKUPсделайте копию журнала прямо сейчас, на диск, где есть место. Сразу после неё место внутри файла освободится.
-- разовая копия журнала, место внутри .ldf освободится после неё
BACKUP LOG [YourDb]
TO DISK = N'E:\Backup\YourDb_log_01.trn';
Потом поставьте копии журнала в план обслуживания с шагом 15-60 минут или осознанно перейдите на SIMPLE (см. вопросы ниже).
- При
ACTIVE_TRANSACTIONищите сеанс-держатель.
-- самая старая открытая транзакция в базе
DBCC OPENTRAN ('YourDb');
-- все открытые транзакции базы с сеансами, старые сверху
SELECT s.session_id, s.login_name, s.host_name, s.program_name,
t.transaction_begin_time
FROM sys.dm_tran_database_transactions dt
JOIN sys.dm_tran_active_transactions t ON t.transaction_id = dt.transaction_id
JOIN sys.dm_tran_session_transactions st ON st.transaction_id = dt.transaction_id
JOIN sys.dm_exec_sessions s ON s.session_id = st.session_id
WHERE dt.database_id = DB_ID('YourDb')
ORDER BY t.transaction_begin_time;
В host_name для 1С окажется сервер приложений srv1c: в СУБД ходят рабочие процессы, а не компьютеры пользователей. Человека ищут по журналу регистрации. Без доступа к SQL Server это делает обработка “Диагностика журнала транзакций”: называет держателя по имени и компьютеру и печатает скрипт для администратора. Сеанс завершают в консоли кластера 1С, KILL на стороне SQL - крайняя мера: откат идёт почти столько же, сколько жила транзакция.
- Нужна минута форы, а диск забит? Добавьте второй файл журнала на другой диск, когда причина снята - уберите его через
REMOVE FILE.
-- временный второй файл журнала на другом диске
ALTER DATABASE [YourDb]
ADD LOG FILE (NAME = YourDb_log2, FILENAME = N'F:\SQLLog\YourDb_log2.ldf',
SIZE = 4GB, FILEGROWTH = 1GB);
- Журнал снова переиспользуется - один раз сожмите файл и задайте приращение в мегабайтах. Мелкий шаг дробит журнал на тысячи VLF и тормозит старт базы.
USE [YourDb];
-- целевой размер в мегабайтах, с запасом под обычную нагрузку
DBCC SHRINKFILE (YourDb_log, 8192);
ALTER DATABASE [YourDb]
MODIFY FILE (NAME = YourDb_log, FILEGROWTH = 1GB);
Как проверить, что исправлено
- Запрос из шага 2 показывает
NOTHINGилиLOG_BACKUP, который сбрасывается после каждой копии журнала. - Процент в
DBCC SQLPERF(LOGSPACE)падает после бэкапа журнала. - Документ в 1С проводится, обмен проходит без ошибки СУБД.
- Через неделю
.ldfтого же размера, что после шринка. Растёт - причина не снята, назад к шагу 2.
Чтобы не встретить её снова
Переполнение с ровным шагом, раз в неделю, означает FULL без копий журнала. Внезапное посреди дня - чью-то длинную транзакцию. Модель восстановления, размер и приращение журнала с вердиктом по каждому пункту проверяет чек-ап СУБД под 1С.
Наш случай
В проекте свёртки крупной базы журнал транзакций занимал 119 ГБ. После того как модель восстановления и расписание бэкапов привели в порядок, он ужался до 8 ГБ и обратно больше не распухал. Шринк сам по себе этого результата не дал.
Разбор: почему разрастается LDF и как выбрать модель восстановленияПохожие ошибки
Журнал переполняется второй раз за месяц, а шринк уже не спасает?
Подбираем модель восстановления под допустимую потерю данных, ставим бэкапы журнала и сторож зависших транзакций с оповещением в Telegram.
- Qiyməti
- 450 000 ₸-dənbirdəfəlik sazlama; müşayiət - ayda 150 000 ₸-dən; vergilərsiz
Yazmaq tezdir? Özünüz ölçün
Чек-ап СУБД под 1С: 40+ проверок с вердиктом по каждой
Частые вопросы
В тексте ошибки стоит tempdb, а не имя нашей базы. Это сюда?
Нет. Журнал tempdb общий на весь экземпляр SQL Server, бэкапы журнала к нему не относятся, и лечится он по-другому: ищут держателя длинной транзакции и смотрят version store. Пошагово это разобрано в статье про ошибку 9002 в tempdb, ссылка в первом шаге.
Можно сразу перевести базу в SIMPLE, чтобы ошибка ушла?
Журнал освободится на ближайшей контрольной точке. Цена: восстановиться можно будет только на момент последнего полного или разностного бэкапа, цепочка копий журнала рвётся. Решает владелец данных: сколько часов работы он готов потерять.
Сделали DBCC SHRINKFILE, а файл не уменьшился. Почему?
Пока журнал не стал переиспользуемым, сжимать нечего: все записи заняты. Сначала снимают держателя (бэкап журнала или завершение транзакции), потом сжимают один раз и с запасом, а не в ноль.
Проверено: MS SQL Server, ноябрь 2026
Tapşırığı müzakirə edək
Ən sürətlisi WhatsApp: tapşırıq barədə bir-iki sətir yazın, iş günü ərzində cavab verəcəyik.