Q&A

  • 오라클에서
오라클 8i DB입니다.

데이터 삭제 작업을 하다보니 "롤백 세그멘트를 확장할 수 없다"

는 메세지를 접했는데.. 하드의 여유공간은 상당히 있습니다.

어떻게 해결해야 하는지 부탁드리겠습니다.


설정을 바꿔줘야 하는건지..바꾼다면 어디서 어떻게 해야하는건지.

아니면 제가 잘못 생각한 부분이 있으면 지적 부탁드립니다.

해결법이 우선입니다.
6  COMMENTS
  • Profile
    KDDG_ZZOM 2002.11.22 00:55
    1. 롤백 세그먼트 생성
    create tablespace KDM_ROLL
        datafile '/AIMS/DBF/kdm_roll.dbf' size 200M reuse autoextend on
        next 50M maxsize 300M;

    create rollback segment KDMS_ROLL
    tablespace KDM_ROLL
    storage( initial    200M
                next     50M
             maxextents  3);
            
    alter rollback segment KDMS_ROLL online;
    <참고> 1. 생성 후 오라클 shutdown  후 startup 시
              KDMS_ROLL은 offline으로 설정됨.
           2. 이를 항상 online으로 시작하게하려면,
              initSID.ora파일의 rollback_segments 에 kdms_roll을 추가.

    2. 롤백 세그먼트 삭제
    alter rollback segment kdms_roll offline;
    drop rollback segment kdms_roll;  
    drop tablespace kdm_roll;        
    <참고> 1. initSID.ora파일의 rollback_segments 에 kdms_roll을 추가하면
              삭제 후 오라클 shutdown 후 startup 시 기동되지 않음.
           2. 롤백 세그먼트 삭제 후 initSID.ora파일의
              rollback_segments 에 kdms_roll을 삭제.


    롤백 테이블스페이스를 늘려주는 방법인데...
    저도 해본지가 오래되어서... 걍 참고만하세요...
    아니면 오라클 홈페이지가셔서 한번찾아보세요...
    잘못하면 오라클이 부팅이 안될수도 있으니깐... 조심하세요...

    즐프하세요...^^
  • Profile
    김지엽 2002.11.21 23:26
    몇 번 에러인가요?
    혹시 1555번 에러인가요?
    (오라클 에러 관련해서는, 에러 번호를 같이 남겨 주시면 답변 받으시는데도 도움이 될 듯 합니다.)

    데이터베이스 삭제를 하다 보면.. 자연스레 많은 양의 롤백'할' 내용이 쌓이기 마련이죠. 오라클의 경우 입출력무결성보장 모드를 바꿔봐도 큰 차이는 없을것이고.. 이는 하드의 여유공간과는 직접 관련은 없는 것으로 압니다. 오라클 DB의 설정에 잡아놓은 리두 로그 공간을 다 잡아먹어서 못쓴다는 뜻이니까요.

    트랜잭션이 길게 늘어질 수록 발생확률이 높을테니깐, 삭제 작업 중간 중간에 commit을 때려주는게 도움이 될 거구요.

    오라클 8 대의 제품에서는, DB설정은 오라클 홈 디렉토리 및의 admin 디렉토리에서 찾으시면 됩니다. 대개..
    [홈디렉토리]/admin/[DB명]/pfile/init[DB명].ora 이런식으로 되어 있을겁니다.

    거기서 db_log_buffer 나 db_block_buffer 등을 변경해주시되.. 너무 크게 잡아주면 오히려 서버가 감당을 못하는 사태가 벌어질 수 있으니 적당히..
    (DB는 왠만하면 끄고 하셔야겠죠?)

    그리고  transactions_per_rollback_segment ..이런 옵션도 있고.. 거기 나오는 튜닝 옵션들 하나씩 읽어보면서 잘 생각해보시면 될겁니다.

    select * from v$parameter 해보시면 init.ora에서 발견할 수 있는 파라미터들이 나오는데.. issys_modifiable 필드에 deferred인가? 그놈 나오는 거 빼고는, 아마 DB를 멈춘채로 변경작업해야 할겁니다.
  • Profile
    돌아버려 2002.11.22 00:10
    ORA-01562: 롤백 세그먼트 10 수를 확장하는데 실패했습니다
    ORA-01628: 최대 확장영역 수 (121)가 RB9 롤백 세그먼트에 도달했습니다

    에러내용입니다.

    그리고 적어주신 정보 소중하게 보았습니다 ^^

    감사합니다.

    해결은 아직 ..;;
  • Profile
    머슴 2002.11.22 02:29
      
       지우는 자료가 전체 테이블의 전체 자료인경우에는  

       Delete 명령을 사용하시지 말고 TRUNCATE 명령을 사용하여

       지워 보세요...TRUNCATE 는 Rollback Segment를 정보를 만들지

       않고 삭제를 하고 바로 Commit됩니다.

       (아님 나누어서 지워보시던가요...)


    ROLLBACK SEGMENT 크기를 증가하여 재생성하는 방법
    ===============================================

    ROLLBACK SEGMENT 는 LONG TRANSACTION 을 수행하면 크게 되는 경우가 있다.
    확장된 ROLLBACK SEGMENT 는 줄어들지 않게 되므로(OPTIMAL을 지정하지 않는 경우)
    주기적으로 재생성하여 TABLESPACE의 FREE SPACE 영역을 확보한다.


    1. ROLLBACK SEGMENT 를 OFFLINE 시킨다.

    ROLLBACK SEGMENT 를 OFFLINE
    시키기 위해서는 그 ROLLBACK SEGMENT 가 INACTIVE 상태이여야 하므로 모든
    TRANSACTION 을 종료하고 ROLLBACK SEGMENT r01-r04를 OFFLINE 시켜야 한다.

      SELECT usn, xacts FROM V$ROLLSTAT;
      SELECT * FROM v$rollname;

      을 하여 OFFLINE하고자 하는 ROLLBACK SEGMENT의 XACTS 컬럼을 확인하여
      이 값이 0일때만 OFFLINE  하도록 한다.

      XACTS는 그 ROLLBACK SEGMENT를 현재 사용하고 있는 ACTIVE TRANSACTION의
      수이다.


          SQL> alter rollback segment r01 offline;
          SQL> alter rollback segment r02 offline;
                 ** r03 ~ r04 도 같은 방법으로 OFFLINE 함.                    

    2.  ROLLBACK SEGMENT를 DROP한다.

          SQL> drop rollback segment r01;
          SQL> drop rollback segment r02;
                ** r03 ~ r04 도 같은 방법으로 DROP 함.
                  
    3.  ROLLBACK SEGMENT 를 생성한다. SYSTEM ROLLBACK 이외에 모든 ROLLBACK
    SEGMENT 를 DROP 한 경우는 SYSTEM TABLESPACE 에 ROLLBACK SEGMENT 를 한 개
    이상 생성 후에 NON-SYSTEM TABLESPACE에 ROLLBACK SEGMENT를 생성해야 한다.

          SQL> create rollback segment r0;
          SQL> alter rollback segment r0 online;

          SQL> create rollback segment r01 tablespace rbs
                   storage(initial 512k next 512k minextents 2);

          SQL> create rollback segment r02 tablespace rbs
                   storage(initial 512k next 512k minextents 2);
                 ** r03 ~ r04 도 같은 방법으로 생성함.
                    

    RBS TABLESPACE도 재생성하여 datafile 크기도 증가시켜 다시 만들고자 한다면
    다음과 같이 한다.

    ----------------------------------------------------------------
    1. RBS TABLESPACE를 DROP 하기 위해서는 1-2 과 같이 ROLLBACK SEGMENT를
        전부 OFFLINE한다.
        ROLLBACK SEGMENT 를 OFFLINE할 수 있는 다른 방법은
          ORACLE_HOME/dbs/init<ORACLE_SID>.ora 화일의 rollback_segments=r01..
          부분을 #으로 COMMENT 처리하고 DB를 다시 startup 시키면 된다.

          SQL> drop rollback segment r01;
          SQL> drop rollback segment r02;
                 ** r03 ~ r04 도 같은 방법으로 DROP 함.

    2. RBS TABLESPACE를 DROP 한다.
        
        SQL> drop tablespace RBS including contents;
        SQL> ! rm /oracle/dbs/rbs<ORACLE_SID>.dbf

    3. RBS TABLESPACE 를 다시 생성한다.
        
        SQL> create tablespace  RBS datafile '/../oracle/dbs/rbsORA7.dbf'
             size 50M default storage(initial 512k next 512k);

    4. ROLLBACK SEGMENT r0, r01-r04 를 생성한다.
      
        SQL> create rollback segment r0;
        SQL> alter rollback segment r0 online;

        SQL> create rollback segment r01 tablespace RBS;
              ** r02 - r04 도 같은 방법으로 생성한다.

    5. 위에서 rollback_segments = parameter를 comment(#) 처리하였다면,
       다음과 같이 풀고 DB 를 다시 startup한다.
       만약 # 처리하지 않고 모두 offline 명령을 수행한 것이라면 이 작업은 필요없다.

        initSID.ora file 내에서
        rollback_segments=(r01,r02,r03,r04)

        svrmgrl
        SVRMGR> shutdown
        SVRMGR> startup
        
               




  • Profile
    돌아버려 2002.11.22 02:55
    먼저 답변 올려주신 두 분께 감사인사 드립니다.꾸벅~ ^^


    고생은 했지만

    덕분에 롤백 세그멘트에 대해 좀 더 공부하게된 계기가 됐내요.^^

    테이블 전데이터를 삭제하면 안되기에 Delete 문을 썼던건데

    워낙 방대하다보니 이런 문제가 생겼내요.

    버퍼값은 이미 Large 이상으로 잡혀있더군요.

    결국은 나누어서 하는것 밖에 없었습니다.

    (지금도 삭제중;;;; 쿼리한번 하는데 20분 걸리내요;)

    시간을 많이 잡아먹었습니다..


    두분 감사합니다.
  • Profile
    김지엽 2002.11.22 00:44
    말씀하신 문제에 대한 오라클 에러 설명은 이렇군요.
    01562, 00000, "failed to extend rollback segment number %s"
    Cause: Failure occurred when trying to extend rollback segment
    Action: This is normally followed by another error message that caused
             the failure. Shutdown, restart and then take appropriate action for
             the error the caused the failure. If starting up the system
             again doesn't solve the problem, it is possible that there is
             an active transaction in the rollback segment and the system
             can't roll it back for some reasons. Check the trace file
             generated by the PMON process for more information.
    01628, 00000, "max # extents (%s) reached for rollback segment %s"
    Cause:  Tried to extend rollback segment already at maxexents value
    Action: If maxextents storage parameter less than system allowable max,
              raise this value. Consider upping the pctincrease value as well.

    발생한 에러 내용으로 종합해 볼 때 롤백세그먼트 영역을 확장하려다 에러가 났는데, 그것은 허용된 롤백 세그먼트 블록의 최대에 도달했기 때문이라는 결론으로 지워질 수 있겠네요.

    제 생각으로는, init.ora파일의, 블록 설정이 min이나 midium에 있으면, 한 단계 높여보시는게 어떨까 싶구요..

    그와는 별도로, 수행하는 작업에서, commit없이 너무 오랫동안 트랜잭션을 끌지 마시고 최대한 주기적으로 commit을 수행해주시면 이런 에러가 안나지 않을까 싶네요.