/oracle>ps -ef |grep ora_ | sort
  oracle 3035324       1   2 09:17:01      -  1:56 ora_p000_SID 
  oracle 3162554       1   0   Aug 09      - 79:05 ora_mman_SID
  oracle 3235916       1   2 09:17:01      -  1:58 ora_p003_SID 
  oracle 3260664       1   0 09:17:01      -  0:55 ora_p007_SID 
  oracle 3322148       1   6 09:17:01      -  1:57 ora_p002_SID 
  oracle 3363190       1   1 09:17:01      -  1:55 ora_p001_SID 
  oracle 3523008       1   0 09:17:01      -  0:53 ora_p006_SID 
  oracle 3789048       1   0 09:17:01      -  0:56 ora_p005_SID 
  oracle 4227120 4100588   0 09:25:29  pts/5  0:00 grep ora_
  oracle 4345864       1   0   Aug 09      - 11:48 ora_arc0_SID 
  oracle 4370548       1   3   Sep 25      - 65:44 ora_j000_SID
  oracle 4382828       1   0 09:17:01      -  0:55 ora_p004_SID 
  oracle 4538568       1   0   Aug 09      -  0:06 ora_s000_SID 
  oracle 4575314       1 111   Aug 09      - 11929:31 ora_pmon_SID 
  oracle 4640950       1   0 09:10:51      -  0:00 ora_j003_SID 
  oracle 4657256       1   0   Aug 09      - 130:00 ora_mmnl_SID 
  oracle 4747466       1   0   Aug 09      - 41:08 ora_mmon_SID 
  oracle 4833430       1   0   Aug 09      - 12:44 ora_cjq0_SID 
  oracle 4862174       1   0   Aug 09      -  0:11 ora_reco_SID
  oracle 4890774       1   0   Aug 09      - 44:39 ora_smon_SID 
  oracle 4902992       1   0   Aug 09      - 45:36 ora_ckpt_SID 
  oracle 4931766       1   3   Aug 09      - 1322:01 ora_lgwr_SID 
  oracle 4939910       1   0   Aug 09      - 74:27 ora_dbw3_SID 
  oracle 4985182       1   0 09:05:51      -  0:01 ora_j002_SID 
  oracle 5050588       1   1   Aug 09      - 75:52 ora_dbw2_SIDA
  oracle 5083328       1   0   Aug 09      -  3:16 ora_psp0_SID 
  oracle 5157280       1   0   Aug 09      -  0:03 ora_d000_SID 
  oracle 5374404       1   0   Aug 09      - 13:39 ora_arc1_SID 
  oracle 5423472       1   0   Aug 09      - 78:26 ora_dbw0_SID 
  oracle 5431770       1   0   Aug 09      - 76:49 ora_dbw1_SID

1. 증후
ORA-01578 or alert 에 corrupt message

2. 일반적인 Error Message
- ORA-01578 - Physical Structual damage

Error:  ORA-1578
Text:   ORACLE data block corrupted (file # %s, block # %s)
-------------------------------------------------------------------------------
Cause:  The data block indicated was corrupted, mostly due to software
        errors.
Action: Try to restore the segment containing the block indicated. This
        may involve dropping the segment and recreating it. If there
        is a trace file, report the errors in it to your ORACLE
        representative.
       
        SQL> SELECT  segment_name ,  segment_type ,  owner , tablespace_name
             FROM  sys.dba_extents
             WHERE  file_id = &bad_file_id
            AND  &bad_block_id BETWEEN block_id and block_id + blocks -1
        dbv utility, export, Rman 을 통해서 분석 가능    
        주로 )  Index 관련 nologging 후 recover 를 통해서 발생
             EX) 8i Live Database -> Archive 전송 -> Standby Database 환경
                 No Logging Operation =========> Standby database recover
                 ==> Standby Database Activate 시에 Nologging 작업을 한
                 block 이 corrupt 로 발견된다.
 
- ORA-08103 - Logical Corrupt Error

Error:  ORA 8103
Text:   object no longer exists
-------------------------------------------------------------------------------
Cause:  The object has been deleted by another user since the operation began.
Action: Remove references to the object.
        7.3.2.3 에서만 발견되는 Error
        SQL> analyze table .. validate structure cascade ; 로 분석
        SQL> SET ARRAY 1
        SQL> SELECT ROWID, LAST_COLUMN_OF_TABLE from TABLE;
             를 통해서 corrupt 발생한 rowid 발견
            
- ORA-600 [2662] - block corruption
        Data block 의 SCN 이 Current SCN 보다 앞설때 발생하며,
        결과적으로 Instance Filure 가 발생하고, Physical Corrupt 가 발생할
        가능성이 있다. 주로 DB Startup 시 발생...

3. Check Physical Corruption
  A. DBV Utility 를 통해서 Check
  한계점 :
   - Table 과 Index 간의 Mismatch 는 검색 불가 [ 논리적 Corrupt 검색 불가]
   - Undo/Redo 의 Logical Corrupt 검색 불가
  장점 :
  - File 에 대한 Access 가 가능하면 가능하다.
  - Database Online / Offline 과 무관하게 사용가능
  B. RMAN 을 통한 Check
  RMAN> BACKUP VALIDATE DATABASE ;
  RMAN> BACKUP VALIDATE DATAFILE 1;
  : RMAN 을 통해서 Backup 이 구현된 경우 Corrupt Checking Option 을 추가하여
  정기적인 Checking 이 가능
  C. Export Utility 를 통한 Check
  file=/dev/null 로 지정후 full 로 export 진행 하여 Database 전체 검색
  혹은 의심가는 Segment 에 대한 export 진행 하여 해당 Segment 검색
  한계점 :
  - 첫번째 Corruption 에서 Error 발생 - 그 다음에 존재하는 Corrupt Check 불가
  - Index 에 대한 Check 불가 [ Export 는 Table Full Scan ]
  - Data Dictionary 에 대한 검색 불가
  D.  Analyze 를 통한 Check
  SQL> Analyze table <OWNER.TABLE_NAME> VALIDATE STRUCTURE [CASCADE] ;
       Table + Index [ CASCADE ]
  SQL> Analyze index <OWNER.INDEX_NAME> VALIDATE STRUCTURE ;
       Index Only
  SQL> Analyze Table <OWNER.TABLE_NAME> VALIDATE STRUCTURE CASCADE INTO
       INVALID_ROWS ;
       Partition Table
   한계점 :
   1. 운영중 analyze ... validate structure 는 lock 이 발생 할 수 있어
      성능 문제를 유발 할 수 있다.
   2. Export 와 마찬가지로 첫번째 Corrupt 만 발견 가능

4. Corrupt Segment 판별      
    SQL> SELECT  segment_name ,  segment_type ,  owner , tablespace_name
             FROM  sys.dba_extents
             WHERE  file_id = &bad_file_id
            AND  &bad_block_id BETWEEN block_id and block_id + blocks -1
     - Index 면 Rebuild, Table 이면 ...

5. Oracle 문제인지 판별(?)
   관련 Oracle bug 를 찾아본다 ㅡ_ㅡ;

6. Restore / Recover
   Recovery 를 통해 해결이 가능. But 일반적으로 OS/Hardware 문제로
   해결이 Recovery 시 문제가 재발 가능

7. Restore / Recover 시 문제 재발은 무엇이 일으키는가 ?
   Data file, redo file 에 대한 Dump 후 trace 분석.

8. Corrupt Checking 을 위한 Oracle Parameter
   a. DB_BLOCK_CHECKING=TRUE
      TRUE - 모든 Block 에 대한 Checking, 1~10% Overhead 발생
      FALSE - System Tablespace Checking
   b. DB_BLOCK_CHECKSUM=TRUE
      DBwn ... Checksum...
      FALSE - System Tablespace Checking
      - Disks, Storage System, I/O System 에 의해 발생한 Corrupt만 Checking

Oracle Server
- Database + Instance = Oracle Server


Listener
- Oracle Server 의 구성요소는 아니다.
- Oracle Server 자체에 없는 기능인, 외부에서 접속을 위한 프로세스
- User process 가 접속을 시도할 때 올바른 접속인지 확인하고 서버프로세스와 직접연결을 해준다


Database 구성 파일
Data File
- 테이블 뷰등 오브젝트들의 실제 값들을 갖고있는다.
- 디스크 I/O 를 줄이기 위하여 파일을 분할
- Backup 의 대상
- 다중화의 의미가 없다 (리도로그파일과 데이터백업파일을 다중화 하므로)

- 시스템용 파일
  SYSTEM file : Data Dictionary 들의 정보 포함하는 파일
  SYSAUX file : 10g에서 추가된 테이블스페이스용 파일.
- 비시스템용 파일
  UNDO file
  TEMP file
  USER file : 일반유저들이 사용하는 파일
< 관련 View >
V$DATAFILE
V$LOGFILE
V$CONTROLFILE
V$TEMPFILE

Redo Log FIle
- Online Redo Log File + Offline Redo Log File(Archived Redo Log File) [Archive Log Mode시]
- 모든 행위의 흔적을 코드화하여 저장 (원문그대로가 아니다)
- 백업된 파일의 시점 이후의 값을복원하기위해 사용된다
- 최소 2개이상의 파일(멤버)필요
- 안정성을 위해 2개 이상의 그룹으로 다중화의 대상이 된다.
- Online Redo Log File 의 집단을 Thread
< 관련 View >
V$LOG
V$THREAD
V$ARCHIVED_FILE

Control File
- Instance 와 연결된 파일(Data File, On/Offline Redo Log File)들의 위치등의 정보 포함
- 때문에 Control File 에러시 Startup 이 제대로되지 않는다. (치명적)
- Startup 시 ORACLE_HOME/dbs/매개변수 파일안에 Control File 의 위치를 참조한다
- 다중화의 대상
< 관련 View >
V$CONTROL_FILE


Instance
- 도구, 수단의 역할
- SGA
- BGP

cf.
 Instance 도 이름이 있고, Database 도 이름이 있으나 일반적으로같게 한다
.


SGA 구성
- Shared Pool
- Data Dictionary Cache (Row Cache) : Database Buffer Cache 에 블럭단위복사된 것중 사용되는 값을 Row 단위로 저장
- Library Cache : 파싱된 SQL 문들이 체인으로 연결디어 저장되어있음. (해시값으로 우선 체인을 택하고 이름으로 동일문장 존재여부 확인)
< 관련 View >
V$BH
V$SQLAREA

- Database Buffer Cache : Meta Data Buffer 와 User Data Buffer 이 존재
- Redo Log Buffer
< 관련 View >
V$SGA
V$SGASTAT


BGP (Background Process) 구성
- DBWn : Data Buffer Cache 의 내용을 내려쓴다
사용가능 메모리를 확보하기위해, 혹은 다양한 발생에 의해
Database Buffer Cache의 Dirty Buffer 를 Data FIle 로 내려쓴다
모아쓰기, 내려쓰기 지원

- LGWR : Redo Log Buffer 의 내용을 내려쓴다
사용가능 메모리를 확보하기위해, 혹은 다양한 발생에 의해
Redo Log Buffer 를 Redo Log File 에 기록한다
모아쓰기, 내려쓰기 지원

- CKPT : Control File 과 Data File 을 업데이트
Checkpoint 란 DBWR 가 Dirty Buffer 를 내려쓰는 행위 (CKPT라는 Process 명과는 다른 의미)
DBWR 이 내려쓰기를 수행해야 할 때를 알려준다
Control File 과 Data File 의 Header 에 표시

- PMON : 프로세스의 비정상 종료시 처리
- SMON : 에러가 났을 경우 인스턴스의 복구
- ARCn : Online Redo Log FIle 을 복사(백업)한다
cf.
필수 Process 의 경우 하나라도 Kill 당할 경우 강제 종료된다.


cf.
FGP (Foreground Process)= Server Process = Shadow Process


접속방법
- 내부접속
export ORACLE_SID=instance_name
sqlplus ID/PASSWD

- 외부접속
sqlplus ID/PASSWD@listener_addr/instance_name



Structure
- Storage
- Logical : Tablespace, Segment, Extents, Block
- Physical
- Database File : Control File, Data File, Offline Redo Log File
- Other Key File : Parameter FIle, Diagnostic File,
- Process
- User Process
- Server Process (Foreground Process)
- Background Process
- 기타 : Listener, iSQL*Plus, DBConsle
- Memory
- PGA
- SGA


Logical and Physical Database Structure


DATABASE : 하나의 단위로 취급된다
TABLESPACE : Container. 하나이상의 Data File 로 구성된다.
SEGMENT : 공간을 차지하는 Object (TABLE, INDEX..) cf. VIEW, SYNONYM Objec 이지만 Segment 는 아니다
EXTENT : 연속된 Block 의 집합
DATA BLOCK : 저장소 및 I/O 의 최소단위

< 관련 View >
DBA_TABLESPACES
DBA_FREE_SPACE // 사용가능한(사용되지않은) Extents
DBA_EXTENTS      // 사용한 Extents
DBA_SEGMENTS
DBA_DATA_FILES
DBA_TEMP_FILES

cf 1.
두개의 파일로 구성된 Tablespace를 만들고 어떤 작업도하지 않았을 경우 Segment 의 개수는 0, Extent 의 개수는 2개이다

cf 2.
PGA와 SGA 의 크기 설정은 작업의 종류에 따라 달라진다 (어느쪽이 크거나 작아야 할 필요가 없다)
예를들어, OLTP 와 OLAP 환경 의 시스템 셋팅은 서로 다를 것 이다.




Buffer
- Database Buffecr Cache 의 단위
<Buffer 의 종류>
FREE
: 한번도 쓴적이 없는 Buffer (FREE 와 CLEAN Buffer 를 합쳐서 사용하기도한다)
PINNED : 사용(R,W)하고 있는 Buffer (다른 사람이 사용 못하게 Lock 을 생성한다)
CLEAN : SELECT 의 내용을 담은 Buffer, 재사용 가능 (다른사람이 사용 할 수 있다), CR Buffer 도 포함
DIRTY : 읽은 후 수정된 Buffer, 원본과 내용이 다른 Buffer 재사용 불가능

cf 1.
SELECT : PINNED->CLEAN
Non-SELECT : PINNED->DIRTY->CLEAN

cf 2.
Fast Commit
확정짓고, 락을 푼 후 Redo Log 를 내려쓴다. 실제로 데이터가 내려쓰여지는 것은 아니다.

Commit 시 바로 Data File 에 내려쓰지 않고 Redo Log 를 우선수행하는 이유는 I/O를 줄이기 위해서다


Instance Recovery
  1. Startup
  2. ORACLE_SID 확인
  3. spfileSID.ora
  4. Instance 구성
  5. Control File Read
  6. Datafile, Redo log file read
  7. INSTANCE RECOVERY
  8. Open


SQL (SELECT) 문의 처리 방식
1. PARSE
- 동일문장찾기
SQL 문을 ASCII 값으로 변환 후
해싱함수를 적용하여 해시키값을 생성한다
해시키값이 같은 체인에 대하여 같은 해싱값들을 체이닝 한다 [라이브러리캐시에서 일어남]
이때 각 해시값들의 이름은 SELECT 문의경우 문장전체를, PROCEDURE 의 경우 프로시저의 이름을 사용한다
후에, 다음의 SQL 문이 사용될때 해시값을 이용해 같은 해시값이 존재하는지 검색한 후
같은 해시값이 존재한다면 다음단계로 이름을 비교하여 해당 SQL이 메모리에 존재하는지 판별한다.
이때 대소문자와 스페이스등을 다른문자로 취급하기떄문(ASCII 값이 다름) 다른문장으로 인식한다.
그러므로 코딩 규약을 지키는게 필요하다

- Syntax 검사
키워드의 오타검사

- Sementics 검사
권한, 객체유무 검사
이러한 검사를위해 오라클에 의한 Data Dictionary Cache 에 대하여 Recursive SQL 자동 발생
이때 자주 사용되는 Data Dictionary Table 의 경우 Database Buffer Cache에 블럭단위로 저장되고
검색의 내용에 해당하는 블럭은 Database Buffer Cache 에만 저장된다
또한 이 중 사용된 Data Dictionary Table 의 Row는 Dictionary Cache(Row Cache) 에 저장된다

- Execution Plan
여러 경우의 실행 계획들의 Cost 를 산출하고
옵티마이저에 의해 Cost 가 가장낮은 실행 계획을 선택한다

2. EXECUTE
Memory(Logical) Read : Cache Hit
File(Physical) Read : Cache Miss

3. FETCH
SELECT 에서만 일어나는 작업
메모리(혹은 디스크)에 올려진 결과를 PGA 로 가져와서 정렬등의 작업을 수행


SQL (UPDATE,DELETE) 문의 처리 방식
- Undo Table : Rollback 과 읽기 일관성을 위한 영역
- Redo : 현재과정들을 백업해놓는것뿐이다
1. PARSE
SELECT 문의 PARSE 단계와 동일하다

2. EXECUTE
1. 변경될 Data Block 및 빈(여유)Undo Block 을 Database Buffer Cache(메모리) 로 Read
2. 읽어올린 Block 을 Row Level Lock 을 설정한다
3. PGA에 저장된 Change Vector 들을사용해서  Online Redo Log File 에 Redo Entry 를 만든다 (안전을위해)
4. Undo Data(Block) 에 변경될 내용 기록 (안전을위해)
5. User Data(Block) 수정
===> 결과 출력 : 1 Row Updated.
===> 업데이트 과정에서 조회된 변경데이터는 CR Block 을 조회한다.


cf.
WAL (Write Ahead Log)
1. 버퍼에서의 자료 변경전 항상 리도버퍼에 먼저 기록을하고
2. DBWR에의해 data file 로 내려쓰기 전에 LGWR 에 의해 항상 내려쓰여지므로
모든 데이터는 항상 로그기록을 먼저 남기게 된다


http://wiki.ex-em.com/index.php/Transaction
http://www.urbantree.wo.tc/46

오라클은 사용자가 요청한 데이터가 SGA의 버퍼 캐쉬에 존재하지 않을 경우 서버 프로세스가 데이터 파일로부터 해당 데이터 블록을 버퍼 캐쉬로 로드한다. 이를 Conventional Path I/O라 한다. Conventional Path I/O는 멀티 블록 I/O 방식과 싱글 블록 I/O 방식으로 나뉘어지게 된다. 멀티블록 I/O 방식은 한 번에 여러 개의 연속된 블록을 읽어 들이는 작업을 수행하는 I/O이며, 싱글블록 I/O 방식은 한 번에 하나의 블록만 읽어 들이는 작업을 수행하는 I/O 이다.

오라클에서는 Conventional Path I/O가 발생하게 되면 두 가지의 대기 이벤트를 통해 멀티 블록 I/O가 발생하였는지 싱글 블록 I/O가 발생하였는지를 알 수 있도록 하였다. 이 두 가지 대기 이벤트가 db file sequential read / db file scattered read 이벤트이다. 해당 이벤트들은 오라클에서 가장 보편적으로 발생하는 대기 이벤트이다. 데이터 파일에서 블록을 읽으려면 멀티 블록 I/O나 싱글 블록 I/O를 수행할 수 밖에 없기 때문이다.

db file sequential read 이벤트는 싱글블록 I/O와 함께 발생하는 대기 이벤트이다. 한 번의 싱글블록 I/O가 발생할 때마다 한 번의 db file sequential read 이벤트 대기가 발생한다. 싱글 블록 I/O는 파일로부터 하나의 블록을 읽는 모든 작업들에서 발생 가능하다. 보통 인덱스 스캔, ROWID에 의한 테이블 스캔, 컨트롤 파일(Control file), 파일 헤더(File header)를 읽을 때 발생한다.


http://wiki.ex-em.com/index.php/Db_file_sequential_read

'Database > Oracle' 카테고리의 다른 글

함수기반 (Function Based) 인덱스의 활용  (0) 2010.04.28
비-트리 인덱스(B-Tree Index)  (0) 2010.04.27
USER_CONS_COLUMNS  (0) 2010.04.22
DBA_USERS  (0) 2010.04.22
DBA_TABLESPACES  (0) 2010.04.22

+ Recent posts