Ошибка ORA-01555: snapshot too old — причины и решение в Oracle и 1С
- Длительные транзакции, пакетные обработки 1С, закрытие месяца или выгрузки данных аварийно прерываются с ошибкой
ORA-01555: snapshot too old: rollback segment number ... too small. - В alert.log фиксируются регулярные сообщения с указанием Query Duration и SQL ID.
- Вью
V$UNDOSTATфиксирует частые ненулевые значения в столбцеSSOLDERRCNT(Snapshot Too Old Error Count).
1. Анализ статистики UNDO и длительности проблемного запроса
Выполните запрос для определения пиковой длительности запросов и нехватки времени хранения undo-данных:
SELECT begin_time, end_time, undoblks, maxquerylen, ssolvercnt, ssolderrcnt
FROM v$undostat
ORDER BY begin_time DESC;2. Увеличение параметра UNDO_RETENTION
Установите значение параметра UNDO_RETENTION (в секундах) больше, чем максимальная длительность выполняемых транзакций/отчетов (например, 4 часа = 14400 сек):
ALTER SYSTEM SET undo_retention = 14400 SCOPE=BOTH;3. Включение режима гарантии хранения UNDO (RETENTION GUARANTEE)
По умолчанию Oracle может перезаписать unexpired undo-блоки при нехватке места в табличном пространстве. Включение гарантии запрещает перезапись:
ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;4. Расширение табличного пространства UNDO
Если табличное пространство заполнено, увеличьте datafile или включите авторасширение:
ALTER DATABASE DATAFILE '/u01/app/oracle/oradata/DB1/undotbs01.dbf'
AUTOEXTEND ON NEXT 512M MAXSIZE UNLIMITED;5. Оптимизация на стороне приложения (1С / PL/SQL)
- Исключите коммиты внутри курсорных циклов (
FETCH ... COMMIT), которые приводят к инвалидации снимка данных. - Для тяжелых запросов 1С оптимизируйте индексы, чтобы сократить время сканирования таблиц.
Частые вопросы (FAQ)
Почему возникает ошибка ORA-01555 при механизме Read Consistency?
Oracle обеспечивает согласованность чтения по состоянию на момент запуска запроса (SCN). Если параллельные транзакции изменили данные и зафиксировали их, а соответствующие блоки в UNDO были перезаписаны до завершения чтения, Oracle не может восстановить старую версию блока и генерирует ORA-01555.
Как параметр RETENTION GUARANTEE влияет на DML-операции?
При включенной гарантии, если место в UNDO табличном пространстве исчерпано, новые транзакции модификации данных будут падать с ошибкой ORA-30036 (unable to extend segment), защищая уже запущенные длительные запросы от ORA-01555.
Как рассчитать необходимый размер UNDO Tablespace?
Используйте формулу: Undo_Size = (Max_Query_Length * Undo_Blocks_Per_Second * Block_Size) + Overhead. На практике рекомендуется выделить не менее 32–64 ГБ для высоконагруженных баз 1С.
Может ли ORA-01555 возникнуть из-за задержек фиксации (Delayed Block Cleanout)?
Да, если массивные изменения в блоках не были очищены в момент коммита, следующий запрос полного сканирования таблицы попытается восстановить транзакционную информацию через UNDO и может упасть с ORA-01555.