0.서론
오라클 DB를 startup 하면 parameter file을 거쳐 control file의 정보를 읽는다.
컨트롤 파일에서 에서 디비 정상종료인지 비정상종료인지 확인한다.
비정상종료이면 인스턴스 리커버리를 한다.
컨트롤 파일의 어떤 부분을 보고 정상여부를 확인을 하는가?
 
 
 
1. 오라클이 시작되는 단계
 
- nomount 단계
  서버프로세스가 파라미터파일을 PGA로 읽어 들여 해당 파라미터파일에서 지정한 대로
  인스턴스를 생성하는 단계
 
 
- mount 단계
  파라미터파일에서 지정해 준 컨트롤 파일을 읽어서 장애를 복구하거나 유지관리 작업등을 하는 단계
 
① 컨트롤파일 헤더정보를 검증해서 컨트롤파일끼리 이상이없는지 확인
   이상없으면 MountID를 계산해서 컨트롤파일에 저장
② 파라미터파일의 Database name 과
   컨트롤파일의 DB name 이 동일한지 검사
③ 이상없으면 alert log file에 "Successful mount of redo Thread"라는 메시지 기록
   
데이터 파일을 읽지 않는다. mount 단계에서는 컨트롤 파일까지의 정보만검사한다.
 
※ 참고
파라미터 파일 db_name 부분과 컨트롤파일 DB Name을 비교해서같으면 정상
→ 같으면 다른 컴의 컨트롤 파일을 가지고 와서 Mount단계까지 올릴수 있다.
 
Ex)
회사에서 스토리지가 망가져서 다 날아갔다.
데이터파일만 백업되고 나머지 파일들은 없는 상태.
VMware에 DB이름이 같은 DB를 설치하고 컨트롤 파일만 가지고 와서 쓰면 Mount까지 올라간다.
이것을 이용해서 데이터 파일에 맞게 컨트롤 파일 다시 만들면 된다.
 
 
 
- open 단계
  데이터파일 헤더부분의 정보와 컨트롤파일의 정보를 비교 장애유무 판단.
  사용되는정보 : Checkpoint SCN
 
  
 
2. 컨트롤파일
 
※ 참고 : 이후 설명들은 만들어진 dump파일을 보시면 있습니다.
컨트롤파일 덤프떠서 내용 확인해 보기

SQL> oradebug setmypid;
SQL> oradebug dump controlf 3;  → 3번째 블락까지 덤프떠라
저장경로 : /home/oracle/admin/testdb/udump/
udump]$ vi testdb_ora_19226.trc


 
 
① 컨트롤 파일에 적혀있는 체크포인트 종류
 
Checkpoint - scn : 모든 데이터파일들이 같다. (지역번호)
                 - cnt : 파일 마다 다르다. (뒷번호)
 
※ 모든 테이터파일의 Checkpoint 정보는 같다.
→ 모든 DB의 DATA FILE #1은 system01.dbf
 
 

startup → pfile → control - checkSCN
                         data - checkSCN
                         두 정보가 같아야 DB올라온다.


 
- Low SCN 과 Next SCN
  redo log file 1,2,3 에 자료가 1~100, 101~200, 201~(Current중) 인 상황
  Low SCN : 첫 SCN
  Next SCN : 다음파일에 쓰일 SCN




 
② 체크포인트 설명
Checkpoint cnt : 파일마다 다르다.
Checkpoint scn : 모든파일들 같다.
Stop scn :  DB 정상 종료여부 검사
 
 
 
checkpoint scn : 현재까지 저장 완료된 SCN
stop scn : 신규로추가되는 데이터의 마지막 scn
                 신규로 추가되는 scn은 현재 작업 중이기 때문에 몇 번까지 들어올지 모른다.
                 그래서 오라클은 DB가 open된 상태면 stop scn을 무한대 ffff로 설정해두고,
                 DB가 종료나 offline 되면 checkpoint 를 발생시켜 checkpoint scn과 stop scn을 동일하게 만들고 해당 데이터파일을 닫게된다.
                 이 과정에서 비정상 적으로 DB가 종료 된다면(shutdown abort)
                 checkpoint scn과 stop scn의 값을 동기화 시키지 못한 상태에서 종료가 되어 버린다.
 



 
ⓐ 정상 종료라면 : Checkpoint = stop SCN

ⓑ 비정상 종료라면 :

   control file
   checkpointSCN - 100
   Stop Scn - fff

        : 비정상 종료됐음 → 인스턴스 리커버리가 시도된다.
 
※ 컨트롤파일안의 : Checkpoint scn와 Stop scn이 같으면 DB가 정상일까?
                    정상 종료된것은 확실하다. But 실제 데이터 파일 이상여부는 데이터파일과 직접 비교해야 알 수 있다.
 
 

Ex)
control file                          data file
checkpointSCN - 100                  90    → 컨트롤파일의 checkpoint scn은 100인데 데이터파일은 90이다.
Stop Scn - 100                                       이상있어서 redo log 파일 보러 가게 된다.

① 컨트롤파일의 checkpointSCN 과 Stop Scn 을 비교해보고
② 이상없으면 datafile찾아가서 CheckpointSCN 비교

 
 

 
 
★ 복구 원리 정리
 

1. Recover 명령어나 startup 명령어가 수행되면,
   control file 내의 data file records 부분의 checkpoint CNT 부분의 숫자부분을 먼저 체크한다
   → control file에는 모든 데이터파일의 checkpoint cnt 번호가 있다.
      mount단계에서 open단계로 넘어갈 때 control file cnt번호와 datafile cnt번호가 같은지 비교
      이상이 없이 비교가 끝나면 다음 단계를 진행한다.
 
2. 각 데이터 파일의 헤더에 있는 checkpoint SCN이 control file안에 있는 stop SCN 번호와 같은지 비교를 하게된다
   → 모두 일치하면 복구가 필요 없지만 다르다면 복구를 시도한다.
 
3. 복구가 필요한 상황(컨트롤파일의 checkpoint scn은 100인데 데이터파일은 90과 같은 경우)이면,
   컨트롤파일 안에 있는 LOGFILE RECORDS부분을 찾아가
   데이터파일에 부족한 SCN 부분을 Low scn을 확인하여 해당 redo log file을 찾아낸다.
   그리고 그 경로로 찾아가서 복구해야 하는 내용을 읽어서, 필요한 로그 파일을 순차적으로 적용시키게 된다.
 
4. 적당한 redo log file 을 찾게 되면 우선 가장 낮은 SCN 번호부터 Roll Forward하게 된다
 
5. roll forward가 끝나면 commit이 수행되지 않은 트랜잭션을 찾기 위해 undo$ 딕셔너리를 찾아본다
   거기서 active 한 undo segment 를 찾게 되고 commit안 된 데이터를  roll backward 하게된다.


 
 
 

☆ 꼭 기억하기
① 컨트롤파일의 SCN 정보와 데이터파일의 SCN정보 비교
② 차이나는 부분 Redo og file이나 archive log file에서찾아서 복구


 
 
 
★ Recovery 구분

Crash Recovery = Instance Recovery : 비정상적으로 DB종료시 startup시 자동적으로 복구
                                                                redo log file 만 이용
Media Recovery : file 삭제나 file fail등으로 Instance Recovery가 실패하면 수동으로 복구 해줘야 함
                           DBA가 수동으로 백업파일 복원 후 redo log file과 archive redo log file을 이용한다.


 
 
 

※ 원리 꼭 알기!!!!!!!
백업복구 명령어는 알아도, 원리를 몰라서
정형화된 장애는 고치는데, 돌발적인 장애는 못 고친다.
recover 했는데 왜 안될까? 똑같은 명령을 쳐도 안된다(전단계가 다름)
 
Posted by 딩구르
,