ORA-01555: слишком старый снимок: сегмент отката номер XX по имени "_SYSSMUXX$" слишком мал
By: Date: 23.12.2014 Categories: Errors,ORACLE

ORA-01555 — Причина ошибки — недостаточный размер сегмента отката.

Лечение:

Нужно обеспечить сохранность информации в UNDO на всё время пока выполняется запрос. Для этого нужно иметь достаточный размер параметра UNDO_RETENTION и достаточный размер табличного пространства UNDO.

Т.е. проще говоря, для того чтобы избежать возникновения ORA-01555 нужно увеличивать размер табличного пространства UNDO и параметр UNDO_RETENTION до тех пор пока операция не пройдет без ошибки.

Предварительная подготовка

1) Убедиться что UNDO управляется автоматически. Т.е. параметр БД UNDO_MANAGEMENT = AUTO.

Если не так, включить автоматическое управление (требуется перезапуск БД):

ALTER SYSTEM SET UNDO_MANAGEMENT=AUTO SCOPE=SPFILE;

После чего перезапустить БД.

2) Настройка табличного пространства UNDO

— Определить какого размера UNDO сейчас

SELECT SUM(a.bytes)/1024/1024 as "UNDO_SIZE_IN_MB"
FROM v$datafile a, v$tablespace b, dba_tablespaces c
WHERE c.contents = 'UNDO'
AND c.status = 'ONLINE'
AND c.tablespace_name = 'UNDO11' -- для RAC
AND b.name = c.tablespace_name
AND a.ts# = b.ts#;

— Табличное пространство UNDO состоит из одного файла???

— На диске где лежит файл табличного пространства UNDO еще есть свободное место??? Сколько его???

Здесь главное понять что файлы табличного пространства имеют достаточный размер (лучше сделать их авторасширяемыми) и их достаточное количество и на диске есть месть для авторасширения файлов.

3) Нужно определить наибольшее время выполнения SQL-запроса (т.е. время потраченное на выполнение самого долгого запроса).  Для этого есть несколько способов. Если ни один из способов не выявил большого времени выполнения запроса, тогда придется экспериментальным путем устанавливать этот параметр. Можно сразу установить заведомо большое значение, но при этом нужно помнить что чем больше UNDO_RETENTION тем до большего размера может вырасти табличное пространство UNDO и это может закончиться переполнением диска, на котором находятся файлы UNDO.

   3.1) Посмотрите alert.log на предмет наличия ошибки ORA-01555 в то время когда выполнялся экспорт. В сообщение об ошибке может быть указанно время в сек. Выполнения операции. Параметр UNDO_RETENTION нужно установить не менее чем это время, а лучше раза в два больше.

ORA-01555 caused by SQL statement below (SQL ID: 738wa64wpd5s2, Query Duration=224611 sec, SCN: 0x0a0e.44620301):

   3.2) Если в alert.log ничего нет, то можно попробовать определить оптимальный начальный UNDO_RETENTION. Выполнять под SYS.

— Покажет колл. секунд выполнения самого долгого запроса за последние 7 дней

SELECT MAX(MAXQUERYLEN) FROM V$UNDOSTAT;

Параметр UNDO_RETENTION нужно установить большим чем полученное значение (можно сделать в два раза больше, чтобы иметь запас). После выполнения запроса, если он не выполняется регулярно, лучше вернуть UNDO_RETENTION исходное значение, чтобы табличное пространство UNDO не разрасталось.

4) Чтобы уменьшить вероятность возникновения ORA-01555 нужно чтобы с БД во время экспорта вообще никто не работал (потому что другие сессии могут также увеличивать UNDO). Идеально если экспорт будет выполняться вообще один. Нужно учесть что с БД могут работать не только пользователи, но и службы и пакетные задания (bat\cmd). Т.е. на время экспорта лучше остановить все службы, все задания и т.п.