The transaction log for database 'tempdb' is full: разбираем ошибку 9002 без паники

14.08.26

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

Посреди рабочего дня пользователи 1С ловят «Ошибку СУБД: The transaction log for database 'tempdb' is full due to ACTIVE_TRANSACTION». Разбираем ошибку 9002 по частям: что именно переполнилось, как за 5 минут найти виновную транзакцию тремя командами, кого чаще всего ловим на базах от десятков гигабайт до терабайт и какая профилактика избавляет от повторов: настройка tempdb, короткие транзакции, дисциплина УНИЧТОЖИТЬ и мониторинг.

Посреди рабочего дня у пользователей 1С выпадает окно «Ошибка СУБД», работа встаёт, а в тексте — что-то про tempdb и транзакции. Разберём, что именно сломалось, как потушить пожар за пять минут и что сделать, чтобы он не повторялся. Без паники и без «перезагрузите сервер».

 

Симптом

Ошибка СУБД:
Microsoft SQL Server Native Client 11.0: The transaction log for database 'tempdb'
is full due to 'ACTIVE_TRANSACTION' and the holdup lsn is (61800:856:252).
HRESULT=80040E14, SQLSrvr: SQLSTATE=42000, state=4, Severity=11, native=9002, line=1

Выглядит страшно, но в сообщении уже есть весь диагноз, если читать его по частям:

  • The transaction log for database 'tempdb' is full — заполнился журнал транзакций служебной базы tempdb. Не данные, не диск с вашей рабочей базой — именно журнал tempdb.
  • due to 'ACTIVE_TRANSACTION' — журнал не может очиститься, потому что какая-то транзакция всё ещё активна и держит его хвост. SQL Server не имеет права затереть журнальные записи, пока транзакция, которой они могут понадобиться для отката, не завершилась.
  • holdup lsn — номер журнальной записи (Log Sequence Number), в которую упёрлась очистка. По сути — координаты «виновника».
  • native=9002 — код ошибки SQL Server «журнал переполнен». Запомните его: по нему проще всего искать и мониторить.

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

 

Почему это касается каждой базы 1С

tempdb — общая рабочая площадка SQL Server, и 1С пользуется ею гораздо интенсивнее, чем кажется:

  • Временные таблицы запросов. Каждый ПОМЕСТИТЬ в пакетном запросе — это таблица в tempdb. Тяжёлый отчёт на 15 пакетов может создать десяток таблиц и держать их до конца выполнения.
  • Сортировки и соединения. Когда серверу не хватает памяти на ORDER BY или JOIN, он сбрасывает промежуточные данные в tempdb.
  • Версии строк. Это главный неочевидный пункт. В режиме управляемых блокировок (стандарт для современных конфигураций) 1С включает на базе READ COMMITTED SNAPSHOT — и SQL Server начинает хранить версии изменяемых строк в tempdb, в version store. Пока жива хоть одна длинная транзакция, version store не очищается и растёт.
  • Реструктуризация и обновления. Обновление конфигурации на большой таблице — это тоже гигабайты во временном пространстве.

Поэтому «переполнился журнал tempdb» почти всегда означает не «диск маленький», а «в системе есть длинная транзакция, которую что-то породило». Диск — следствие.

 

Первая помощь: пять минут на диагноз

Всё ниже — скрипты диагностики для администратора СУБД, они только читают служебную информацию.

Шаг 1. Убедиться, что дело в журнале, и посмотреть его заполненность:

DBCC SQLPERF(LOGSPACE);

В строке tempdb будет процент занятости журнала. 90+ — вы по адресу.

Шаг 2. Спросить у tempdb, что мешает очистке журнала:

SELECT name, log_reuse_wait_desc
FROM sys.databases
WHERE name = 'tempdb';

Если видите ACTIVE_TRANSACTION — подтверждение диагноза из окна ошибки.

Шаг 3. Найти самую старую активную транзакцию:

DBCC OPENTRAN('tempdb');

Получите SPID сессии и время старта транзакции. Часто время старта говорит само за себя: транзакция живёт 40 минут — а «нормальные» транзакции 1С живут секунды.

Шаг 4. Понять, кто это:

SELECT s.session_id, s.host_name, s.program_name, s.login_name,
       t.transaction_id, at.transaction_begin_time,
       r.status, r.command, r.wait_type, r.total_elapsed_time / 1000 AS sec
FROM sys.dm_tran_session_transactions t
JOIN sys.dm_tran_active_transactions at ON at.transaction_id = t.transaction_id
JOIN sys.dm_exec_sessions s ON s.session_id = t.session_id
LEFT JOIN sys.dm_exec_requests r ON r.session_id = s.session_id
ORDER BY at.transaction_begin_time;

В верхних строках — самые старые транзакции. По host_name и program_name видно, это сеанс 1С, фоновое задание или чей-то Management Studio. Сопоставить SPID с конкретным сеансом 1С можно через консоль кластера: у сеанса отображается «Соединение с СУБД» — тот самый номер.

Шаг 5. Решение по ситуации. Вариантов три, в порядке предпочтения:

  1. Дождаться завершения, если процесс легитимный и близок к финалу (например, закрытие месяца на последней стадии). Иногда правильное действие — ничего не трогать 10 минут.
  2. Штатно завершить сеанс 1С — через консоль кластера. Транзакция откатится, журнал освободится.
  3. Крайняя мера для администратора — завершить сессию на стороне SQL Server. Помните: откат длинной транзакции может занять сравнимое с её жизнью время, и на время отката журнал всё ещё нужен.

Если журнал упёрся в потолок физически (стоит ограничение размера или кончился диск) — временно расширьте файл журнала или ограничение, чтобы система ожила, и только потом разбирайтесь с виновником. Расширять на пару гигабайт, а не «до бесконечности»: безлимитный журнал на общем диске однажды съест его весь.

 

Кто обычно оказывается виновником (наша статистика разборов)

По опыту расследований на базах от десятков гигабайт до нескольких терабайт, виновники распределяются примерно так:

  1. Самописная обработка с транзакцией на весь объём. «Обработать 500 000 строк в одной транзакции, чтобы было атомарно». Атомарно — будет; работать — не будет. Разбивайте на порции: тысяча документов — тысяча коротких транзакций.
  2. Тяжёлый отчёт в рабочее время. Пакетный запрос с десятком временных таблиц, каждая на миллионы строк. Сам по себе он не держит транзакцию часами, но параллельно с очередью проведения устраивает в tempdb тесноту, и первым падает самый невезучий.
  3. Фоновое задание, которое «зависло» в ожидании блокировки. Транзакция открыта, задание ждёт ресурс, журнал копится. Здесь лечится не журнал, а причина ожидания.
  4. Регламентные операции СУБД в неудачное окно — перестроение индексов поверх рабочего дня.

 

Профилактика: чтобы не повторялось

1. Настройте tempdb — и различайте, что чем лечится

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

На 9002 влияет ровно один файл — журнал tempdb:

  • начальный размер журнала — по реальному профилю нагрузки, а не 8 МБ по умолчанию. Если после каждой перезагрузки tempdb «разгоняется» автоприростами заново — задайте стартовый размер равным типичному рабочему;
  • автоприрост фиксированным шагом (например, 512 МБ), не процентами;
  • свободное место на томе, куда этому журналу расти: ноль свободного места — та же 9002, сколько ни настраивай остальное.

Файлы данных — это про другую ошибку. Несколько файлов одинакового размера (стартово — по числу ядер, но не больше 8) и пропорциональное заполнение снимают конкуренцию за служебные страницы (ожидания PAGELATCH) и переполнение самих файлов данных, то есть ошибку 1105. К заполнению журнала они отношения не имеют.

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

2. Уберите длинные транзакции в коде 1С

  • Порционная обработка вместо «всё в одной транзакции». Правило простое: транзакция должна жить секунды.
  • Не выполняйте в транзакции то, что может ждать: запросы к внешним сервисам, интерактивные вопросы пользователю, обращения к файлам.
  • Проверьте фоновые задания: любое из них, открыв транзакцию и встав в очередь за блокировкой, превращается в того самого держателя журнала.

3. Наведите порядок во временных таблицах пакетных запросов

Каждая временная таблица, созданная через ПОМЕСТИТЬ и не уничтоженная до конца пакета, живёт в tempdb всё время выполнения запроса. В длинных отчётных пакетах это гигабайты, которые держатся зря: таблица нужна была в третьем пакете, а место занимает до пятнадцатого. Лечится дисциплиной УНИЧТОЖИТЬ: ставить его сразу после последнего использования таблицы. Вручную это муторно — для авторасстановки мы выложили обработку «Авто-УНИЧТОЖИТЬ: оптимизатор временных таблиц в пакетных запросах»: она разбирает пакет, находит место последнего использования каждой таблицы и расставляет УНИЧТОЖИТЬ сама.

Но не ждите от этого спасения журнала. УНИЧТОЖИТЬ внутри открытой транзакции не вернёт ни байта: усечение всё равно упирается в самую старую активную транзакцию, а сам DROP пишется в журнал — в fn_dblog на нём видно LOP_DELETE_ROWS. Это проверил замером redfred в комментариях, и наша первая версия про «только структуры распределения» оказалась неверной. Прямой выигрыш дисциплины УНИЧТОЖИТЬ — в файлах данных tempdb, то есть против той же 1105. На 9002 она действует лишь косвенно: короче пакет — короче транзакция — раньше сдвигается минимальная LSN.

4. Поставьте мониторинг, чтобы узнавать первым, а не от пользователей

  • Алерт на заполнение журнала tempdb (порог 70–80%).
  • Алерт на транзакции старше 5 минут — тот же запрос из шага 4, только по расписанию.
  • Ошибка 9002 в журнале SQL Server — повод для уведомления, даже если «само рассосалось»: в следующий раз может не рассосаться.

 

Чек-лист на стену

  1. Ошибка 9002 по tempdb = где-то длинная транзакция. Диск — следствие.
  2. DBCC SQLPERF(LOGSPACE) U94; log_reuse_wait_desc U94; DBCC OPENTRAN — три команды, пять минут, виновник найден.
  3. Завершать — штатно через консоль кластера; kill — крайняя мера; откат тоже занимает время.
  4. Профилактика: короткие транзакции — единственное, что реально лечит 9002. Журнал tempdb (размер, шаг прироста, место на томе) даёт запас времени; файлы данных и УНИЧТОЖИТЬ — это про соседнюю ошибку 1105. Мониторинг с алертами — чтобы узнать первым.

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

 

Другие наши инструменты диагностики 1С:

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

tempdb transaction log is full ACTIVE_TRANSACTION ошибка 9002 журнал транзакций ошибка СУБД MS SQL длинные транзакции DBCC OPENTRAN log_reuse_wait_desc version store временные таблицы УНИЧТОЖИТЬ производительность HighLoad администрирование СУБД мониторинг блокировки фоновые задания оптимизация

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

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

См. также

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

В рамках 18 релиза СУБД Tantor Postgres мы рассказывали об оптимизациях, которые помогают планировщику сделать более точный выбор между Nested Loop и Hash Join. В следующем релизе у нас планируются оптимизации, которые позволят ускорить выполнение как Nested Loop, так и Hash Join. Сегодня мы расскажем об одном из таких методов - фильтре Блума.

31.08.2026    5095    Tantor    3    

16

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

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

11.08.2026    2632    jul.dolganova    9    

23

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

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

10 стартмани

06.08.2026    1363    16    nedomolkov.ivan    0    

7

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

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

05.08.2026    1900    nedomolkov.ivan    8    

8

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

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

04.08.2026    2201    nedomolkov.ivan    0    

8

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

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

27.07.2026    3425    Tantor    16    

13

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

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

16.06.2026    10040    postgres_professional    13    

12

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

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

16.06.2026    4169    Tantor    7    

10
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. redfred 03.08.26 19:18 Сейчас в теме
Кажется, что настройка tempdb никак не должна сказаться на заполнености лог файла. Да и досрочное уничтожение временных таблиц тоже (а возможно даже только ускорит его рост, но это не точно, надо проверить)
2. nedomolkov.ivan 234 03.08.26 19:28 Сейчас в теме
(1) По обоим пунктам вы во многом правы, уточню границу.

Настройка tempdb: то, что обычно под ней понимают — количество файлов данных, пропорциональное заполнение, флаги — на лог не влияет никак, тут спорить не с чем. Влияет ровно один файл: сам лог tempdb. Начальный размер, шаг авторасширения (не 10 % и не 1 МБ) и свободное место на томе, куда он положен. В большинстве разборов 9002 по tempdb лог упирался именно в потолок на маленьком системном диске, а не в какую-то экзотику.

УНИЧТОЖИТЬ: внутри открытой транзакции оно не вернёт ни байта лога — усечение останавливается на самой старой активной транзакции, а сам DROP тоже пишется в лог. Так что «ускорит рост» — формально верно, на величину записи об освобождении страниц. Основной выигрыш от УНИЧТОЖИТЬ лежит в файлах данных tempdb и переиспользовании страниц, а это ошибка 1105, не 9002. На лог оно действует косвенно и только одним: короче пакет — короче транзакция — раньше сдвигается минимальная LSN, и чекпойнт может усечь лог.

В статье эти два механизма стоят рядом и читаются как один — тут вы поймали неточность, спасибо.
3. redfred 03.08.26 19:46 Сейчас в теме
(2)
Настройка tempdb: то, что обычно под ней понимают — количество файлов данных, пропорциональное заполнение, флаги — на лог не влияет никак, тут спорить не с чем.


При этом вы сами это всё рекомендуете под вывеской "Профилактика: чтобы не повторялось"

(2)
УНИЧТОЖИТЬ: внутри открытой транзакции оно не вернёт ни байта лога


Вот тут не уверен, всё же. Помнится, что это полностью логируемая операция и, соотв., дропнутые страницы должны уйти в лог. Но, повторюсь, надо проверять, в tempdb механизм может отличаться
4. nedomolkov.ivan 234 03.08.26 23:07 Сейчас в теме
(3) Первое принимаю целиком — это дефект статьи, а не спор. На 9002 из всей «Профилактики» работает ровно один пункт: сам лог tempdb — начальный размер, шаг роста фиксированным объёмом и свободное место на томе, куда он положен. Количество файлов данных, пропорциональное заполнение и флаги лечат конкуренцию за страницы распределения, то есть 1105 и ожидания PAGELATCH, к переполнению лога отношения не имеют. В разделе они стоят рядом без этой границы — поправлю в тексте.

Второе — по факту вы правы, страницы бесшумно не исчезают: DROP логируется. Расхождение у нас в объёме. tempdb всегда в SIMPLE и после рестарта не восстанавливается, накат не нужен, поэтому по ней пишется только undo-часть — то, чем можно откатить, без redo. От удаления временной таблицы в лог уходят изменения структур распределения (PFS/GAM/IAM), а не содержимое страниц: это на порядки меньше, чем стоил INSERT, который эти страницы заполнил. Плюс для таблиц крупнее 128 экстентов включается deferred drop — таблица отцепляется сразу, освобождение доделывает фоновая задача.

И то, ради чего УНИЧТОЖИТЬ вообще попало в статью: пока транзакция открыта, усечение упирается в её минимальную LSN, поэтому внутри неё лог не вернётся в любом случае — ни от DROP, ни от чекпойнта. Работает оно не «здесь», а тем, что укорачивает пакет и тем самым транзакцию.

Замеров именно на DROP большой временной таблицы я не делал — если будете проверять sys.fn_dblog в tempdb, интересно увидеть порядок цифры.
5. redfred 04.08.26 08:02 Сейчас в теме
(4)
На 9002 из всей «Профилактики» работает ровно один пункт: сам лог tempdb — начальный размер, шаг роста фиксированным объёмом и свободное место на томе, куда он положе


По большому счёту, это тоже не профилактика. Если непосредственно с запросами ничего не делать, то лог в любом случае будет точно так же заполняться


(4)
tempdb всегда в SIMPLE и после рестарта не восстанавливается, накат не нужен, поэтому по ней пишется только undo-часть — то, чем можно откатить, без redo


Лог - он не только для восстановления при рестарте. Для вложенных транзакций, например, может понадобиться. Попробовал сейчас по быстрому - при дропе временной таблицы в открытой транзакции fn_dblog вполне себе показывает LOP_DELETE_ROWS
6. nedomolkov.ivan 234 04.08.26 08:41 Сейчас в теме
(5) Оба раза ваша правда, и за замер отдельное спасибо.

По логу: LOP_DELETE_ROWS закрывает вопрос, моя версия про «только структуры распределения» неверна. Внутри открытой транзакции удаление обязано быть откатываемым — значит строки пишутся, и дешёвым DROP там не бывает. Проверять это было моё дело, а не ваше.

По профилактике тоже согласен по сути: начальный размер и шаг роста лога — это запас времени до падения, а не лечение. От повторов спасает ровно одно — ограничение длительности транзакции, всё остальное только отодвигает потолок. Раздел перепишу: разведу то, что реально лечит 9002, и то, что лечит 1105, а буфер назову буфером.
7. nedomolkov.ivan 234 04.08.26 16:14 Сейчас в теме
(5) Раздел «Профилактика» переписан, статья обновлена.

Что изменилось: настройки файлов данных tempdb (число файлов, пропорциональное заполнение) уехали туда, где им место — к ошибке 1105 и ожиданиям PAGELATCH; на 9002 оставлен только сам журнал: начальный размер, шаг прироста, свободное место на томе. Про УНИЧТОЖИТЬ написано прямо, что внутри открытой транзакции он журнал не освобождает — усечение упирается в старейшую активную транзакцию, а DROP сам пишется в лог, что вы и показали через fn_dblog. Размер журнала в чек-листе назван буфером, а не профилактикой.

Спасибо за замер — без него правка была бы косметической.
Для отправки сообщения требуется регистрация/авторизация