Oracle 에서 SELECT 조 회 를 UNDO 로 돌아 가게 하 는 방법

12508 단어 undoreaddirty
Oracle 에서 더러 운 읽 기 (dirty read) 를 어떻게 실현 할 것 인 가 를 생각해 본 적 이 있 습 니까? Oracle 공식 문서 나 Asktom 에서 Oracle 은 더러 운 읽 기 를 실현 하지 않 는 다 고 언급 할 것 입 니 다. 항상 undo 가 데이터 블록 의 앞 미 러 (before image) 를 제공 하여 일치 성 Consistent 를 유지 합 니 다. 정상 적 인 경 로 를 통 해 우 리 는 Oracle 에서 조회 한 일치 성 을 파괴 하여 더러 운 읽 기 를 실현 할 수 없습니다.  정말 방법 이 없 는 것 입 니까?뿐만 아니 라 Oracle 은 고도 로 복잡 하고 통제 가능 한 RDBMS 로 서 아직도 많은 틈 을 낼 수 있다.  다음 숨겨 진 인자 2 개 를 소개 하 겠 습 니 다:offline_rollback_segments or _corrupted_rollback_segments 라 는 숨겨 진 매개 변 수 는 Oracle 데이터베이스 이상 회복 이나 ORA - 600 [4XXX] 문 제 를 해결 한 경험 이 있 는 학생 들 에 게 낯 설 지 않 을 것 입 니 다. 이 두 매개 변 수 는 Undo 에 Corruption 오류 가 있 을 때 문 제 를 무시 하 는 유력 한 도구 이기 때 문 입 니 다. 이 두 매개 변 수 는 실제 적 으로 얼마나 많은 인식 을 가지 고 있 습 니까?  우 리 는 다음 몇 가지 장면 에서 사용 할 수 있 습 니 다offline_rollback_segments 와corrupted_rollback_segments 이 두 개의 숨겨 진 인자:
  • 데이터베이스 강제로 열기 (FORCE OPEN DATABASE)
  • 일치 성 읽 기와 지연 블록 제거 제어 (consistent read & delayed block cleanut)
  • 어떤 rollback 세그먼트 스크롤 백 을 강제로 삭제 합 니 다
  •   그러나 주의: Oracle 전문가 의 건의 없 이 제품 환경 설정 이상 의 숨겨 진 매개 변 수 는 데이터 논리 오류 등 영향 을 미 칠 수 있 습 니 다!!  _offline_rollback_segments 와corrupted_rollback_segments 가 가 져 올 인 스 턴 스 행동 변화:
  • 이상 2 개 인자 가 열거 한 Undo Segments (취소 세그먼트 / 스크롤 백) 는 온라인 으로 사용 되 지 않 습 니 다
  • UNDO $데이터 사전 기본 표 에서 OFFLINE 의 기록 으로 나타 납 니 다
  • 인 스 턴 스 의 수명 주기 에 새로운 사무 에 사용 되 지 않 습 니 다
  • 매개 변수 에 열 거 된 Undo Segments 목록 의 활성 화 된 트 랜 잭 션 active transaction 은 스크롤 백 되 지 않 고 dead 로 표시 되 지 않 습 니 다. (모 르 는 SMON 기능 알 아 보기 (5): Recover Dead transaction)
  •   _OFFLINE_ROLLBACK_SEGMENTS (offline undo segment list) 숨겨 진 인자 (hidden parameter) 의 독특한 역할:
  • 인 스 턴 스 startup 이 시작 되 고 open database 단계 에서 읽 습 니 다OFFLINE_ROLLBACK_SEGMENTS 가 열거 한 Undo segments (취소 세그먼트 / 스크롤 백) 는 이 undo segments 에 접근 하 는 데 문제 가 발생 하면 alert. log 와 다른 TRACE 에 나타 나 지만 실제 startup 프로 세 스에 영향 을 주지 않 습 니 다.
  • 데이터 블록 을 조회 하여 활성 화 된 사 무 를 발견 하고 ITL 이 해당 하 는 undo segments 를 가리 키 면:
  • undo segments 의 transaction table 사무 표를 읽 으 면 트 랜 잭 션 이 제출 된 것 을 발견 하면 데이터 블록 을 제거 합 니 다
  • 읽 기 작업 이 commt 되 지 않 은 것 을 발견 하면 CR 블록 복사
  • 를 생 성 합 니 다.
  • 이 undo segments 를 읽 는 데 문제 가 있 으 면 (손 상 된 오류 일 수 있 습 니 다. missed 가 잃 어 버 렸 을 수도 있 습 니 다) 오류 가 발생 하여 alert. log 에 기록 하면 조회 가 이상 하 게 종 료 됩 니 다
  • 만약 에 DML 이 관련 데이터 블록 을 업데이트 하면 서비스 프로 세 스 가 활성 화 된 업 무 를 회복 하기 위해 순환 에 들 어가 대량의 CPU 를 소모 하 게 될 것 이다. 해결 방법 은 할 수 있 는 조회 작업 을 통 해 관련 표를 재 구축 하 는 것 이다
  • .
      _CORRUPTED_ROLLBACK_SEGMENTS (cor손 상 된 undo segment list) 는 인자 만 의 기능 을 숨 깁 니 다.
  • 인 스 턴 스 에서 startup 을 시작 하고 open database 를 시작 하 는 단계CORRUPTED_ROLLBACK_SEGMENTS 에 열 거 된 undo segments (취소 세그먼트 / 스크롤 백) 는 접근 하여 읽 지 않 습 니 다
  • 이 모든 것 을 가리 키 는 피CORRUPTED_ROLLBACK_SEGMENTS 가 열거 한 undo segments 의 업 무 는 모두 commt 를 제출 한 것 으로 여 겨 집 니 다. 이 undo segments 가 drop 되 었 을 때 와 유사 합 니 다.
  • 이 는 심각 한 논리 적 오류
  • 를 초래 할 것 이다.
  • 데이터 사전 에 활발 한 업무 가 있 으 면 더욱 나 빠 지고 데이터 사전 의 논리 적 오류 로 인해 데이터 베이스 관리 문제
  • boottstrap 이 핵심 대상 을 들 고 활발 한 업무 가 있 으 면 오류 ORA - 00704 를 무시 할 수 없습니다. boottstrap processfailure 오류 로 인해 데이터 베 이 스 를 강제로 열 수 없습니다 (졸작 Oracle 데이터 복구: ORA - 00600: [4000] ORA - 00704: boottstrap processfailure 오류 해결)
  • 진심으로 건의 용CORRUPTED_ROLLBACK_SEGMENTS 라 는 매개 변 수 는 데이터 베 이 스 를 열 고 데 이 터 를 내 보 내 고 데이터 베 이 스 를 재 구축 합 니 다. 이 매개 변 수 는 후유증 이 고 집 스 러 울 수 있 습 니 다
  • Oracle 회사 내부 에 TXChecker 라 는 도구 가 있어 문제 사 무 를 검사 할 수 있다
  •   자, 상기 두 개의 인 자 를 알 게 된 후에 다음 에 어떻게 통과 하 는 지 알 기 어렵 지 않 을 것 입 니 다CORRUPTED_ROLLBACK_SEGMENTS 숨겨 진 매개 변 수 는 SELECT 로 하여 금 UNDO 를 돌아 더러 운 독 서 를 실현 하 는 과정 을 조회 하 게 합 니 다. 
    SQL> alter system set event= '10513 trace name context forever, level 2' scope=spfile;
    
    System altered.
    
    SQL> alter system set "_in_memory_undo"=false scope=spfile;
    
    System altered.
    
    10513 level 2 event    SMON   rollback     dead transaction
    _in_memory_undo    in memory undo   
    
    SQL> startup force;
    ORACLE instance started.
    
    Total System Global Area 3140026368 bytes
    Fixed Size                  2232472 bytes
    Variable Size            1795166056 bytes
    Database Buffers         1325400064 bytes
    Redo Buffers               17227776 bytes
    Database mounted.
    Database opened.
    
    session A:
    
    SQL> conn maclean/maclean
    Connected.
    
    SQL> create table maclean tablespace users as select 1 t1 from dual connect by level exec dbms_stats.gather_table_stats('','MACLEAN');
    
    PL/SQL procedure successfully completed.
    
    SQL> set autotrace on;
    
    SQL> select sum(t1) from maclean;
    
       SUM(T1)
    ----------
           501
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1679547536
    
    ------------------------------------------------------------------------------
    | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |         |     1 |     3 |     3   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE    |         |     1 |     3 |            |          |
    |   2 |   TABLE ACCESS FULL| MACLEAN |   501 |  1503 |     3   (0)| 00:00:01 |
    ------------------------------------------------------------------------------
    
    Statistics
    ----------------------------------------------------------
              1  recursive calls
              0  db block gets
              3  consistent gets
              0  physical reads
              0  redo size
            515  bytes sent via SQL*Net to client
            492  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processe
    
               ,    current block,
            ,consistent gets  3 
    
    SQL> update maclean set t1=0;
    
    501 rows updated.
    
    SQL> alter system checkpoint;
    
    System altered.
    
      session A commit;
    
         session:
    
    SQL> conn maclean/maclean
    Connected.
    SQL>
    SQL> set autotrace on;
    SQL>  select sum(t1) from maclean;
    
       SUM(T1)
    ----------
           501
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1679547536
    
    ------------------------------------------------------------------------------
    | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |         |     1 |     3 |     3   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE    |         |     1 |     3 |            |          |
    |   2 |   TABLE ACCESS FULL| MACLEAN |   501 |  1503 |     3   (0)| 00:00:01 |
    ------------------------------------------------------------------------------
    
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
            505  consistent gets
              0  physical reads
            108  redo size
            515  bytes sent via SQL*Net to client
            492  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
    
                    undo  CR ,   consistent gets    505
    
    [oracle@vrh8 ~]$ ps -ef|grep LOCAL=YES |grep -v grep
    oracle    5841  5839  0 09:17 ?        00:00:00 oracleG10R25 (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
    
    [oracle@vrh8 ~]$ kill -9 5841
    
      session A   Server Process    ,   dead transaction     smon  
    
         select ktuxeusn,
                   to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') "Time",
                   ktuxesiz,
                   ktuxesta
              from x$ktuxe
             where ktuxecfl = 'DEAD';
    
      KTUXEUSN Time                   KTUXESIZ KTUXESTA
    ---------- -------------------- ---------- ----------------
             2 06-AUG-2012 09:20:45          7 ACTIVE
    
       1 active rollback segment
    
    SQL> conn maclean/maclean
    Connected.
    
    SQL> set autotrace on;
    
    SQL> select sum(t1) from maclean;
    
       SUM(T1)
    ----------
           501
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1679547536
    
    ------------------------------------------------------------------------------
    | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |         |     1 |     3 |     3   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE    |         |     1 |     3 |            |          |
    |   2 |   TABLE ACCESS FULL| MACLEAN |   501 |  1503 |     3   (0)| 00:00:01 |
    ------------------------------------------------------------------------------
    
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
            411  consistent gets
              0  physical reads
            108  redo size
            515  bytes sent via SQL*Net to client
            492  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
    
              kill      smon   dead transaction ,
                      undo       
    
        active rollback segment   
    
    SQL> select segment_name from dba_rollback_segs where segment_id=2;
    
    SEGMENT_NAME
    ------------------------------
    _SYSSMU2$
    
    SQL> alter system set "_corrupted_rollback_segments"='_SYSSMU2$'  scope=spfile;
    
    System altered.
    
      _corrupted_rollback_segments       2 rollback segment,         undo
    
    
    SQL> startup force;
    ORACLE instance started.
    
    Total System Global Area 3140026368 bytes
    Fixed Size                  2232472 bytes
    Variable Size            1795166056 bytes
    Database Buffers         1325400064 bytes
    Redo Buffers               17227776 bytes
    Database mounted.
    Database opened.
    
    SQL> conn maclean/maclean
    Connected.
    
    SQL> set autotrace on;
    
    SQL> select sum(t1) from maclean;
    
       SUM(T1)
    ----------
            94
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1679547536
    
    ------------------------------------------------------------------------------
    | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |         |     1 |     3 |     3   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE    |         |     1 |     3 |            |          |
    |   2 |   TABLE ACCESS FULL| MACLEAN |   501 |  1503 |     3   (0)| 00:00:01 |
    ------------------------------------------------------------------------------
    
    Statistics
    ----------------------------------------------------------
            228  recursive calls
              0  db block gets
             29  consistent gets
              5  physical reads
            116  redo size
            514  bytes sent via SQL*Net to client
            492  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              4  sorts (memory)
              0  sorts (disk)
              1  rows processed
    
    SQL> /
    
       SUM(T1)
    ----------
            94
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 1679547536
    
    ------------------------------------------------------------------------------
    | Id  | Operation          | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT   |         |     1 |     3 |     3   (0)| 00:00:01 |
    |   1 |  SORT AGGREGATE    |         |     1 |     3 |            |          |
    |   2 |   TABLE ACCESS FULL| MACLEAN |   501 |  1503 |     3   (0)| 00:00:01 |
    ------------------------------------------------------------------------------
    
    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
              3  consistent gets
              0  physical reads
              0  redo size
            514  bytes sent via SQL*Net to client
            492  bytes received via SQL*Net from client
              2  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
              1  rows processed
        consistent gets 가 3 으로 떨 어 지 는 것 을 볼 수 있 습 니 다. 서비스 프로 세 스 가 데이터 블록 을 읽 으 면 활성 화 된 업무 가 있 지만 ITL 이 가리 키 는 UNDO SEGMENTS 는corrupted_rollback_segments 목록 에 있 기 때문에 UNDO 를 돌아 갈 수 있 도록 COMMIT 가 제출 했다 고 직접 생각 합 니 다.여기 서 더러 운 독 서 를 실 현 했 습 니 다. 상기 방법 을 통 해 더러 운 독 서 는 제품 환경 에서 실제 수익 이 없 지만 (일부 데이터 베이스 소프트웨어 는 더러 운 독 서 를 허용 하여 통계 정보 수집 을 할 수 있 습 니 다) 일치 성 을 파괴 하고 인 스 턴 스 를 다시 시작 해 야 하 는 숨겨 진 파 라 메 터 를 설정 해 야 합 니 다. 참고 하 시기 바 랍 니 다.

    좋은 웹페이지 즐겨찾기