Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-14
제목 ROLLBACK SEGMENT의 NEED RECOVERY 상태 해결
ROLLBACK SEGMENT의 상태 해결
============================================

* 롤백세그먼트의 정보를 보여주는 dba_rollback_segs를 보면 status 컬럼이 있다.
일반적으로 이 컬럼은 online/offline 값을 갖지만 롤백 세그먼트가 손상된
경우에는 Needs Recovery 값을 갖게 된다.

* Needs Recovery 상태의 롤백 세그먼트는 Online/Offline 으로 변경하거나
init.Ora 화일의 Rollback_segments 라인에서 제거하는 것만으로는 문제가
해결되지 않는다.
Needs Recovery 상태가 생기는 이유는 롤백 과정에서 어떤 이유에서든 문제가
생겨서 실패하기 때문이다.
롤백은 사용자가 Rollback 명령을 내린 경우와 Shutdown Abort 후 Startup 시에
자동적으로 수행되는 Instance Recovery 시에 일어난다.

* 롤백이 일어나면 수정된 데이타 블럭에 기록된 결과는 취소되어야 하지만 해당
데이타 블럭에 접근이 불가능하여 롤백 작업을 하지 못하면 롤백 세그먼트의
상태가 Needs Recovery 상태로 되는 것이다.

* 데이타 블럭에 접근이 불가능한 경우로는 다음과 같은 예가 있다.

1. Tablespace나 데이타 화일이 Offline 이거나 없는 경우
2. 해당 데이타 블럭이 속한 Object가 손상된 경우
3. Rollback Segment의 데이타 블럭이 손상된 경우

* 이 문제를 해결하는 방법은 다음과 같다.

1. 모든 tablespace와 datafile이 online 상태인지를 확인한다.
이것은 DBA_DATA_FILES 와 DBA_TABLESPACES 의 STATUS 컬럼을 조회하면 알
수 있다.

2. 다음 문장을 init.ora 화일에 추가한다.
event = "10015 trace name context forever, level 10"
위의 Event는 롤백하는 트랜잭션과 Object에 관한 정보를 담은 Trace File을
생성시켜 준다.

3. 손상된 롤백 세그먼트를 init.ora 의 Rollback_segments 라인에서
삭제한다.

4. 데이타베이스를 Shutdown (가능한 Normal, Immediate를 사용하고, 안 될
경우 Abort를 사용하고 다시 Startup 한다.)

5. USER_DEMP_DEST에 지정된 디렉토리에 Trace 화일이 생성되었는지 확인한다.

6. Trace 화일을 보면 Error Recovery tx(#, #) Object # 와 같은 메세지가 있을
것이다.
여기서 tx(#, #)은 트랜잭션의 정보를 가리키고 Object # 는 DBA_OBJECTS의
OBJECT_ID 와 같다.

7. 다음의 Query를 이용하여 어떠한 Object에 대해서 Recovery 가 수행되는가를
확인한다.

select owner, object_name, object_type, status
from dba_objects
where object_id=;

8. 여기에서 출력된 object가 rollback segment의 정보를 이용하여 recovery
되어야 하는 object이므로 이 때 출력된 object를 drop 하여야만 한다.

9. init.ora 에서 삭제했던 롤백 세그먼트를 다시 Rollback_segments
라인에 넣고 Event를 삭제한 다음 데이타베이스를 Shutdown하고 Startup한다.
Comment
등록된 코멘트가 없습니다.