Журнал транзакций переполнен. Учёт стоит, а доступа к SQL у вас нет

24.08.26

База данных - Администрирование СУБД

Журнал транзакций упёрся в потолок, проведение встало, а доступа к SQL Server нет. Разбираем, что на самом деле означает ошибка 9002, почему она бьёт по tempdb и как найти держателя транзакции прямо из журнала регистрации 1С, не подходя к серверу баз данных.

Утро, звонок, у людей на экране красная простыня:

The transaction log for database 'tempdb' is full due to 'ACTIVE_TRANSACTION'
... native=9002

Проведение не идёт, документы не записываются, в чате уже спрашивают, когда заработает. Админ на обеде, доступа к SQL Server у вас нет и не будет. Дальше обычно начинается гадание: перезапустить сервер приложений, попросить кого-нибудь сделать SHRINK, посмотреть, не кончилось ли место на диске.

Гадать не нужно. На все три вопроса, которые тут важны, отвечает сама платформа, и отвечает из 1С, без единого запроса к СУБД.

 

Что вообще означает эта ошибка

Читается она по частям, и каждая часть важна.

The transaction log ... is full - заполнился журнал транзакций, а не файл данных и не диск. Это разные вещи, и лечатся они по-разному.

due to 'ACTIVE_TRANSACTION' - вот причина. Журнал заполнился не потому, что он маленький, а потому что его нельзя очистить: какая-то транзакция ещё активна, и SQL Server не имеет права затирать записи, которые могут ей понадобиться для отката.

native=9002 - код ошибки, по которому это ищут в поиске.

Перевод на человеческий: кто-то открыл транзакцию и долго её не закрывает. Диск тут следствие, а не причина. Добавите места - журнал вырастет дальше и упрётся снова, только позже и на большем объёме.

Причина очистки видна в одном показателе - log_reuse_wait_desc. Значений там немного, и каждое означает свой сценарий:

Значение Что происходит
ACTIVE_TRANSACTION живая транзакция держит журнал. Тот самый случай из 9002
LOG_BACKUP база в полной модели восстановления, а бэкапов журнала нет. Журнал будет расти, пока не кончится диск
CHECKPOINT контрольная точка не прошла, обычно временно
REPLICATION или AVAILABILITY_REPLICA журнал ждёт подписчика или реплику
NOTHING ничего не мешает, журнал переиспользуется нормально

Разница принципиальная. LOG_BACKUP - это не авария, а неверная настройка: полная модель восстановления без регулярных бэкапов журнала. Такая база растёт молча и годами, а падает в тот день, когда на диске кончилось место. ACTIVE_TRANSACTION - это авария прямо сейчас, и у неё есть виновник с именем.

 

Почему это чаще всего бьёт именно по tempdb

В 9002 у пользователей 1С почти всегда фигурирует tempdb, и это не совпадение.

Во-первых, каждое ПОМЕСТИТЬ в пакетном запросе - это реальная таблица в tempdb. Сортировки и соединения, которым не хватило памяти, тоже уезжают туда.

Во-вторых, и это главное: в режиме управляемых блокировок платформа включает READ COMMITTED SNAPSHOT. Версии изменяемых строк копятся в tempdb и не чистятся, пока жива хоть одна старая транзакция. Одна забытая транзакция на четверть суток - и хранилище версий растёт всё это время, а вместе с ним журнал tempdb.

Отсюда неприятное следствие: авария в tempdb может быть вызвана транзакцией в совсем другой базе на том же сервере. Искать виновника внутри базы, где сработала ошибка, бесполезно.

 

Как найти держателя, не имея доступа к СУБД

Это самая полезная часть, и она мало кому известна.

Идентификатор транзакции в журнале регистрации 1С выглядит так:

21.08.2026 8:41:07 (2166970)

Момент старта транзакции записан прямо в идентификаторе. Конец берётся по последней записи этой же транзакции. Отсюда получается длительность, а вместе с ней - пользователь, компьютер, приложение и список объектов, которые транзакция трогала.

Работает это даже тогда, когда события "Транзакция. Начало" и "Транзакция. Завершение" в настройках журнала выключены: поле Транзакция заполняется у любой записи, сделанной внутри транзакции. То есть транзакция видна по своим следам, даже если о её старте никто не писал.

На реальном журнале из 46 616 записей группировка по этому полю дала 12 252 транзакции, и самые длинные всплыли сразу: 1 630 минут и 1 331 минута. Это не "долго", это сутки с лишним. Обе принадлежали фоновым сеансам одного приложения, и обе были живы в момент разбора.

Дальше вопрос закрывается: у транзакции есть имя пользователя, компьютер и приложение. Идёте в консоль кластера 1С, находите сеанс, завершаете его штатно.

 

Штатно, а не KILL

Соблазн большой: админ видит SPID, делает KILL, журнал освобождается. Так делать не надо, и вот почему.

KILL на стороне СУБД откатывает транзакцию, но сеанс 1С об этом не знает. Он остаётся в подвешенном состоянии, и дальше поведение зависит от того, что этот сеанс делал: от безобидного "пользователь получил ошибку и переоткрыл документ" до заблокированных объектов, которые придётся снимать руками.

Правильный порядок такой:

  1. по имени пользователя и компьютеру находите сеанс в консоли кластера 1С;
  2. смотрите, что это: клиент, фоновое задание, регламентное задание;
  3. завершаете сеанс средствами 1С;
  4. и только если сеанс уже не отвечает - разговариваете с админом про KILL.

Откат при этом всё равно займёт время, сопоставимое с временем работы транзакции. Транзакция, которая писала сутки, будет откатываться не мгновенно, и это нормально. Хуже другое: пока идёт откат, журнал не освобождается, и люди продолжают получать 9002. Поэтому "убить и забыть" не работает, надо дождаться.

 

Что действительно уменьшит файл журнала

Тут два разных вопроса, которые постоянно путают.

Освободить место внутри журнала - это про причину. Если LOG_BACKUP - сделать бэкап журнала (и завести регламент, иначе повторится). Если ACTIVE_TRANSACTION - закрыть транзакцию. Пока причина жива, ничего не поможет.

Уменьшить сам файл на диске - это SHRINK, и он лечит только последствие. Причём лечит плохо: журнал, ужатый в ноль, тут же начинает расти обратно автоприростом, а рост журнала - это блокирующая операция, она останавливает запись, пока не выделит место. Кусками по 64 МБ на журнале в несколько десятков гигабайт - это сотни и тысячи таких остановок.

Практический вывод: SHRINK уместен один раз, после разовой аварии, чтобы вернуть диск. Как регулярная мера - вредная привычка. Постоянное решение это либо бэкапы журнала, либо разумный потолок размера, чтобы база упиралась в понятную ошибку, а не съедала общий диск.

 

Отдельный сюжет: безлимитный журнал

В настройках файла журнала часто стоит "без ограничения". Выглядит удобно, работает как мина.

Журнал на общем диске без потолка однажды съедает всё свободное место, и падает при этом не только 1С, а всё, что живёт на этом диске. Разница между "журнал упёрся в свой лимит" и "на диске кончилось место" - только в том, где чинить. В первом случае у вас понятная ошибка и работающий сервер, во втором - тихая катастрофа с непредсказуемым списком пострадавших.

 

Та же болезнь у PostgreSQL

У PostgreSQL журнала транзакций в терминологии MS SQL нет, но механика та же: растёт каталог pg_wal, и причины ровно те четыре, что и у ACTIVE_TRANSACTION с LOG_BACKUP, только называются иначе.

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

archive_command, который начал падать - диск архива кончился, сеть до хранилища легла, права протухли - вторая причина: WAL не удаляется, пока не архивирован, а архивация не идёт, значит он копится бесконечно.

Третья и четвёртая причины зеркалят ACTIVE_TRANSACTION. Долгая транзакция держит горизонт xmin, и сервер не может почистить WAL и старые версии строк, пока она жива. Подвисшая prepared-транзакция (двухфазный commit, который начали и не завершили) держит горизонт так же цепко, только в обычном списке активных запросов её не видно - это отдельная сущность в системном каталоге, а не сессия.

Разбор в обработке идёт тем же принципом, что и для MS SQL: не голые числа, а вердикт по каждой причине - чинить, внимание, норма - и что чинить в первую очередь.

Профилактика та же идея, что и с безлимитным журналом MS SQL: не ждать аварии, а смотреть заранее. pg_replication_slots показывает, какой слот неактивен и сколько WAL под него скопилось. Слот сам не удаляется никогда, даже если подписчик отвалился месяц назад - его снимают руками, и это единственная строка, которая часто решает всю проблему без единой минуты простоя.

Как это выглядит собранным вместе

Мы сложили всё перечисленное в обработку: Журнал транзакций переполнен: кто держит и что делать.

Она снимает со стороны 1С то, что доступно платформе: самые длинные транзакции с пользователем, компьютером и объектами, ошибки СУБД из журнала регистрации, фоновые и регламентные задания, сеансы, режим блокировок базы. Это одна кнопка и минута времени, доступ к серверу баз данных не нужен.

Для стороны СУБД она печатает готовый скрипт администратору. Не "посмотри там что-нибудь", а конкретный текст, который человек выполняет в SSMS или psql и возвращает результат обратно в обработку. Результат читать глазами не надо: он заканчивается блоком "Итог", а обработка разбирает его в вердикты - чинить, внимание, норма - и сортирует так, что сначала идёт то, что чинить. У каждой строки написано, что это значит и чем грозит.

Скриптов восемь: пять для MS SQL и три для PostgreSQL, потому что у PostgreSQL та же болезнь называется иначе - раздувшийся pg_wal, слоты репликации, зависшие prepared-транзакции, долгий xmin.

К СУБД обработка не подключается принципиально и ничего не меняет: ни в базе, ни в настройках сервера. Скрипт, который уменьшает файл журнала, команды печатает, а не выполняет - решение остаётся за человеком.

 

Что забрать из статьи, даже если обработка не нужна

  1. 9002 - это не "мало места", это "журнал нельзя очистить". Первый вопрос всегда log_reuse_wait_desc, а не размер диска.
  2. LOG_BACKUP и ACTIVE_TRANSACTION - разные болезни. Первая лечится регламентом бэкапов, вторая поиском виновника.
  3. Держателя видно из 1С. Момент старта транзакции лежит прямо в её идентификаторе в журнале регистрации, и по нему считается длительность без всякого доступа к СУБД.
  4. Завершать - средствами 1С, KILL только как крайняя мера, и всё равно ждать отката.
  5. SHRINK - не лечение, а разовая уборка после аварии.
  6. Безлимитный журнал на общем диске превращает локальную проблему в общую.

Вступайте в нашу телеграмм-группу Инфостарт

журнал транзакций ошибка 9002 transaction log is full tempdb log_reuse_wait_desc длинная транзакция SHRINK MS SQL PostgreSQL pg_wal

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Администрирование СУБД Системный администратор Программист Бесплатно (free)

5,5 тысячи пользователей в единой базе 1С, розница в режиме 24/7 и SLA 99,98% – в таких условиях любая авария быстро превращается в очереди на кассах, потерю денег и давление со стороны бизнеса. Показываем, как выстроить процесс аварийно-восстановительных работ: от первых алертов и базового скрининга системы до подключения команды, проверки гипотез и дебрифа после инцидента. Разбираем, как метрики, дашборды, техжурнал, Zabbix, Prometheus, Grafana, Telegram-боты и скрипты помогают не гадать, а быстро находить причину проблемы. На реальных авариях объясняем, почему «быстро» не должно означать «рискованно», как работа над ошибками снижает панику и почему каждая авария может сделать систему надежнее.

11.08.2026    1748    jul.dolganova    8    

21

Администрирование СУБД Пароли Системный администратор 1С 8.3 1С:Розница 2 1С:Управление производственным предприятием Абонемент ($m)

Пароль пользователя СУБД лежит в 1CV8Clst.lst обратимо: кто читает папку srvinfo - достаёт пароли SQL всех баз кластера, минуя права 1С. Обработка показывает, у каких баз пароль извлекается, помечает слабые и выдаёт план защиты. К СУБД не подключается, ничего не пишет - только читает файл.

10 стартмани

06.08.2026    782    13    nedomolkov.ivan    0    

7

Администрирование СУБД Системный администратор 1С 8.3 Бесплатно (free)

Прогнал набор диагностических скриптов на двух рабочих базах: боевой с 580 сеансами и малонагруженной. Разбираю пять находок: статистика 97-дневной давности, 598 запросов со сканами, журнал транзакций в 73 % от данных, tempdb в один файл и 81 % ожиданий на параллелизме, который чинить не надо. Плюс три грабли, из-за которых самописный диагностический скрипт падает на чужом сервере. Семь рабочих скриптов внутри, копируются в SSMS как есть.

05.08.2026    1102    nedomolkov.ivan    8    

7

Администрирование СУБД Журнал регистрации Системный администратор Программист 1С 8.3 Бесплатно (free)

Журнал регистрации на нагруженной базе перестаёт открываться: файлы растут на гигабайты в день, просмотр виснет, история недоступна. Рассказываю, как мы вынесли журнал трёх продуктивных баз в ClickHouse: 35 млрд событий, поиск всех ошибок за сутки — 0,11 секунды, привычная форма журнала для пользователей и падение числа ошибок в проде в 23 раза за полгода. Архитектура, схема таблицы, грабли интеграции и все цифры с прода.

04.08.2026    1367    nedomolkov.ivan    0    

8

Администрирование СУБД 1С 8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

База 1С:ERP размером 646 Гб, полное маскирование за 5 часов - без создания промежуточной незащищенной копии. Разбираем бесплатный pg_anon на сквозном примере с реального продуктива.

27.07.2026    2587    Tantor    16    

13

HighLoad оптимизация Администрирование СУБД Программист Россия Бесплатно (free)

Если вы работаете с 1С на PostgreSQL и жалуетесь на тормоза — скорее всего, дело в join predicate pushdown, которого в стандартном PostgreSQL нет. В MS SQL Server этот механизм работает «из коробки», и при миграции именно запросы к виртуальным таблицам 1С бьют по производительности сильнее всего. В этой статье — реальный кейс от Postgres Professional с разбором плана выполнения, ручным экспериментом и доработкой планировщика СУБД, которая ускорила запросы от 22 до 54 000 раз.

16.06.2026    8966    postgres_professional    13    

12

HighLoad оптимизация Администрирование СУБД Системный администратор Программист 1С:Предприятие 8 Бесплатно (free)

Вышел релиз СУБД Tantor Postgres 18, и мы хотим рассказать о его новых возможностях для работы с приложениями на платформе "1С:Предприятие". В обзоре разберем улучшения планировщика, по традиции коснемся работы временных таблиц и не обойдем вниманием вспомогательные утилиты, которые упрощают поиск и диагностику проблем в высоконагруженных системах. За каждым пунктом - реальные запросы 1С, реальные рабочие базы и сотни часов тестирования!

16.06.2026    3464    Tantor    7    

10

Администрирование СУБД Системный администратор Программист 1С:Предприятие 8 Россия Бесплатно (free)

База 1С за несколько лет эксплуатации разрослась, - стала большой, медленно работает, требует много места и времени для копирования и прочего обслуживания. Нужна ли обязательно свертка или можно обойтись более «мягкими» средствами. Делюсь своим опытном как для новых конфигураций, так и для старых УПП, УТ 10…

01.06.2026    8171    2ncom    30    

11
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. redfred 24.08.26 12:19 Сейчас в теме
Зачем изначально ограничивать рост лога?
2. nedomolkov.ivan 152 24.08.26 12:35 Сейчас в теме
Чтобы авария была локальной и понятной, а не общей. Без потолка журнал растёт, пока не кончится место на диске - а на этом диске обычно живут ещё tempdb, другие базы, иногда сама ОС. Упадёт всё сразу, и непонятно, с чего начинать. С потолком вы получаете конкретную ошибку 9002 у конкретной базы: сервер жив, соседи не пострадали, сразу ясно, что чинить и где. Правда, сам лимит надо продумать - слишком тесный будет упираться на ровном месте, а без бэкапов журнала (LOG_BACKUP) он всё равно упрётся, просто раньше.
3. redfred 24.08.26 13:44 Сейчас в теме
(2) Всё равно непонятно. Есть же базовый мониторинг, который алертит по свободному месту (есть же, правда?). Если, условно, пришел варнинг, что 20% свободного осталось - пошли и расследовали кто виновник, не дожидаясь пока в 0 ушло. А так выходит, что смотреть надо постфактум, когда уже упало.
4. nedomolkov.ivan 152 24.08.26 13:53 Сейчас в теме
(3)
то 20% свободного осталось - пошли и расследовали кто виновник, не дожидаясь пока в 0 ушло. А так выходит, что смотр


Мониторинг ловит медленный рост в рабочее время, тут спора нет. Потолок про другой сценарий: зависшая транзакция или ночной пересчёт съедают эти 20% за пару часов. Варнинг прилетел в 3 ночи, прочитали его в 9, а диск кончился в 5. И даже успев сесть за расследование, вы рост не остановили: пока ищете виновника, лог пишется дальше, а убьёте держателя - место освободится только когда доедет *, у долгой транзакции это часы.

Так что смотреть постфактум не предлагаю, мониторинг нужен. Потолок - страховка на случай, когда на алерт никто не успел: стоит ноль и срабатывает сам, даже когда никто не смотрит. Ну и про "есть же, правда?" - статья как раз для контор, где ответ чаще нет, свой мониторинг места там обычно появляется после первой такой аварии. Если у вас дежурный встаёт по алерту ночью - согласен, вам потолок мало что добавит.
Для отправки сообщения требуется регистрация/авторизация