어떤 session 이 rollback segment 를 잡고 비정상 작동 시 해당 rollback segment 를 찾아 이를 drop 후 재생성 해주어야 한다.
1. 해당 session 이 잡고 있었던 rollback segment 찾기
이때 rollback segment 를 offline 해도 pending offline 상태로 빠지므로 DB의 재기동이 필요하다.
DB 재기동 후
select * from v$rollstat;
을 보면 XACTS 의 수가 1이상이면서 writes 수가 0인것이 있다.
이는 session 이 잡고 있으면서 rollback 혹은 commit을 하지 못한 상태이다.
이를 Offline Drop 하여야 한다.
select segment_name, writes,xacts from v$rollstat, dba_rollback_segs
where usn = segment_id;
2. init 파일 수정 후 drop 시행
rollback_segments = (rbs01,rbs02,rbs03,rbs05,rbs06)
# 해당 rollback segment 삭제
_offline_rollback_segments = (rbs04,rbs07)
# 삭제할 rollback segment 를 DB 기동시 offline으로 setting
3. init 파일 수정 후 DB 재기동 하면 해당 rollback segment 가 offline으로 setting 되어 있다.
이를 Drop 하고 재생성한다.
Drop rollback segment rbs04;
Create rollback segment rbs04 tablespace RBS storage (……);
4. init 파일을 원상복구하고 DB 재기동을 수행한다.
* truncate table 시 도중 cancel로 인하여 위와 같은 상황 발생시는 해당 table을 drop 해 주어야 한다.
이때 trace file을 보면 해당 table이 나타나므로 이를 먼저 drop 하고 위의 작업을 수행해야 한다.