본문 바로가기

DB/__Oracle

ORA-01555 caused by SQL statement below

상기 SQL이 약 Duration=XXXXXsec초 동안 수행되다가, snapshot too olde error로 해당 프로세스가 끝난겁니다. 이것은, undo와 관련된 것인데 XXXXX초 전의 데이터를 읽어야 하는데,  그 이후에 다른 프로그램에 의해 어떤 데이터가 변경되고, 변경된 이미지는 UNDO에 저장되었는데,  이 다른 프로그램이 commit을 하고, 이 undo를 다른 프로그램이 재사용 해버리면,  상기 SQL은... 12134초 전의 데이터를 읽지 못함니다... 그러므로 에러가 나죠. 

A : 상기 SQL을 수행하는 것.
B : A가 읽을 데이터를 변경하는것,
C : B가 사용한 undo를 재사용하는 것. 

시간 ------------------------------>
A    Select시작 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|| Error
B                      Data변경 ~~~~~~~~  Commit
                           undo 1번 사용. ------------ undo1번은 재사용 가능C                                                                                                        undo1번 재사용.

 해결방법은

 - 상기 SQL을 tuning : 12000초면.. 3시간이 넘게 도는 SQL입니다.  충분히 튜닝 가능함.

 - undo tablespace 증설 : undo 재사용확율을 줄여줍니다.

 - undo 관리를 개런티모드로..

 - 기타 여러가지 방법 있음... undo_retention 변경..등..

 

하지만 가장 좋은 것은 상기 SQL 튜닝하세요...

 어려운 문제는 '오라클 문제해결' 클럽으로 오세요