Chap 7. Tablespace 와 Data file 관리하기


 1. Tablespace  

- Oracle 내에서 데이터가 논리적으로 저장되는 공간이다. 이 공간은 메모리 상에서 생성되며, 모든 작업 데이터는 이 곳에 존재하여야 한다.

- Oracle 내부에서는 data block, extend, segment, tablespace 라는 논리적인 개념으로 데이터를 관리한다.

- Oracle 에서 data를 저장하는 가장 최소 단위가 data block 이며, data block 이 모여서 extend 가 되고, extend 가 모여서 segment, 그리고 segment 가 모여서 tablespace 가 된다.

- 디스크의 물리적인 data file (.dbf 같은) 은 tablespace 와 대응된다.


 2. Tablespace 의 종류   

1) SYSTEM tablespace

- 데이터 dictionary 들이 저장되어 있는 곳이다. 아래와 같은 중요한 내용들이 담겨져 있다.

a) Database 의 논리적인 구조와 물리적인 구조 정보들

b) 객체의 정의와 공간 사용 정보들

c) 제약조건에 관련된 정보들

d) 사용자에 관련된 정보들

e) Role, Privilege 등에 관련된 정보들

f) 감사 및 보안등에 관련된 정보들

- Oracle 서버의 모든 정보들을 담고 있는 중요한 곳이므로 이 tablespace 의 소유자인 SYS 계정 역시 이 안의 데이터들을 바꾸지 못하고 조회만 가능하다. 

- Oracle 에서는 dictionary 종류가 너무 많기 때문에 아래처럼 4개의 카테고리로 분류한다. 

 

Static Dictionary

(Instance 가 OPEN 일 경우만 조회 가능.)

  USER_XXX

  해당 사용자가 생성한 내용만 볼 수 있는 Dictionary 이다. 

  예) USER_TABLES : 해당 사용자가 생성한 테이블만 볼 수 있음.

  ALL_XXX

  권한만 있다면 볼수 있는 Dictionary 이다. 

  예) ALL_TABLES : 접근 가능한 모든 테이블 내역을 볼 수 있음.

  DBA_XXX

  DB 에 생성되어 있는 모든 내용을 다 볼 수 있는 Dictionary 이다.

  예) DBA_TABLES : DB의 모든 테이블 내역을 볼 수 있음.

Dynamic Dictionary

(Instance 가 NOMOUNT  상태일 때 부터 조회 가능)

  v$xxxx

  실시간으로 변경되는 내용을 조회해 볼 수 있다. 

  v$~ 로 시작하는 것들은 모두 Dynamic 이다. 

 


2) SYSAUX tablespace

- Oracle 10g 버전부터 새로 등장했다. 주로 서버의 성능 튜닝을 위한 데이터 들이 저장되어 있다. 


3) Undo tablespace

- 사용자가 DML 을 수행할 경우 원본 데이터를 저장해 두는 tablespace 이다. 

- 사용자가 생성/관리 할 수 있다. 

- Undo tablespace 의 사용 목적

** Transaction Rollback : 사용자가 rollback 을 할 경우 이 곳에 저장된 undo data를 사용해서 rollback 을 수행,

** Read Consistency (CR) : 아직 transaction 이 끝나지 않은 데이터는 변경 전 데이터로 보여줍니다. 즉, 

A 라는 사용자가 DB에서 장동건을 원빈으로 변경하기 위해 update 문을 수행 했을 경우, 

일단 DB buffer cache 에 장동건을 불러다 놓고 -> 변경내용들을 Redo log buffer 에 기록 -> Undo segment 에 원본 데이터인 장동건 기록 -> DB buffer cache 에 업데이트 되는 데이터 원빈을 저장, Lock 이 설정된다. 

commit 이나 rollback 이 아직 안된 상태에서, 사용자 B가 장동건을 조회하려고 하면, 현재 DB buffer cahce 에는 원빈이 저장된 채 lock 이 걸린 상태이므로, Undo segment 에서 장동건을 불러다가 다시 DB buffer cache 에 올려두고 사용자에서 제공한다. 이 과정을 CR 작업이라 한다. 

** Transaction Recovery (Instance Recovery) : 운영중이던 DB 가 비정상적으로 종료되었을 때 roll forward 와 roll backward 작업을 수행 할 때 undo data가 사용됨. 


- Undo tablespace 관리 방법

## 현재 상태 조회하기 

SQL> show parameter undo;


NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

undo_management     string AUTO

undo_retention     integer 900

 

undo_tablespace     string UNDOTBS1


## 신규  undo tablespace 생성하기 

SQL> create undo tablespace undo01 datafile '/app/oracle/oradata/testdb/undo01.dbf' size 10M autoextend on;

Tablespace created.


SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;


TABLESPACE   MB FILE_NAME

---------- ---------- --------------------------------------------------

USERS    5 /app/oracle/oradata/testdb/users01.dbf

UNDOTBS1   95 /app/oracle/oradata/testdb/undotbs01.dbf

SYSAUX  510 /app/oracle/oradata/testdb/sysaux01.dbf

SYSTEM  700 /app/oracle/oradata/testdb/system01.dbf

EXAMPLE       345.625 /app/oracle/oradata/testdb/example01.dbf

UNDO01   10 /app/oracle/oradata/testdb/undo01.dbf


 

6 rows selected.


## undo tablespace 변경하기 

SQL> alter system set undo_tablespace=undo01;


System altered.


SQL> show parameter undo;


NAME     TYPE VALUE

------------------------------------ ----------- ------------------------------

undo_management     string AUTO

undo_retention     integer 900

 

undo_tablespace     string UNDO01


- Undo segment 할당 원리

Undo Tablespace 의 특징 중 하나는 undo data file 의 크기는 증가만 되고 줄어들지는 않는다. 

이유인 즉, 

Undo tablespace 안에 undo segment 4개가 할당되어 각각 A, B, C, D 사용자에 의해 사용되고 있다고 가정하고, 새로운 E 사용자가 신규로 접속해서 DML 문장을 수행할 경우, E server process 는 undo segment 를 확보하게 된다. 

이 때 무조건 새로운 공간을 할당 받는게 아니라, 기존에 만들어져 있던 segment 중에서 transaction 이 완료 된 것이 있는지 없는지를 확인 한 후 (즉, commit 이나 rollback 을 한 사용자가 있는지 없는지 확인) 만약 A라는 사용자가 commit 을 수행해서 transaction 이 끝났다면, A가 쓰고 있던 공간을 덮어쓰게 된다. 

하지만, 덮어쓸 수 있는 공간이 없다면, 그냥 새로운 공간을 하나 만들게 된다. 

이런 식으로 계속 undo segment 가 늘어나면서 undo tablespace 가 늘어나게 되고, 모든 사용자가 commit 을 해서 transaction 이 완료 되었다고 하더라도, undo segment 안에 undo data는 지워지지 않는다. 

그래서 undo data file 의 크기는 증가만 될 뿐이다.


- Undo 관련 주요 parameter 

** UNDO_RETENTION : commit 수행 후에도 해당 undo segment 내의 데이터를 다른 서버 프로세스가 덮어 쓰지 못하도록 막아주는 시간. 하지만 Undo Segment 의 여분이 있을 경우에만 적용된다. 

** UNDO_RETENTION_GUARANTEE : guarantee 로 설정하면 무조건 undo retention 을 지켜줌. (기본 값은 noguarantee) 


- Snapshot too old (ORA-0155)  에러 및 줄이는 방법

Undo_retention 부분이 잘못되면 나오는 에러가 Snapshot too old 라는 에러이다. 이 에러의 발생 원인은 위의 undo tablespace 의 사용목적중 CR 부분과 관계가 있다. 

예를 들어, 

A라는 사용자가 emp 테이블에서 장동건 이라는 사원을 원빈으로 변경한다고 하면, 일단 장동건을 DB buffer cache 에 올리고, Redo log buffer 에 변경 내용 기록하고, Undo segment 을 할당해서 원본 데이터인 장동건을 기록할 것이다. 그리고 나서 DB buffer cache 에 원빈으로 변경 된 내용이 lock 이 걸린 상태가 될 것이다. 

이 때 B라는 사용자가 장동건을 emp 테이블에서 꺼내오려고 한다면, DB buffer cache 가 아닌 Undo segment 에서 장동건을 가져다가  B 사용자에게 보여주게 된다. 이게 CR 과정이라고 하였다. 

하지만 만약! 

B 사용자가 장동건을 undo segment 에서 꺼내려는데 A 사용자가 commit 을 날리고, 그 상황에서 새로운 DML 문장이 실행되서 새로운 데이터가 이 장동건이라는 undo segment 부분을 덮어 써 버렸다면 어떻게 될까? 

B 사용자는 undo segment 장동건이라는 사원을 찾지 못하고 에러를 발생 할 것이다. 

이 에러가 바로 ORA-0155 Snapshot too old 라는 에러이다. 


이 에러를 줄이는 방법으로는, 

** UNDO_RETENTION 을 셋업할 수 있다. 하지만 이 역시 commit 이 많이 발생하면 그 만큼 undo segment 가 덮어써 지는 경우가 늘어나고 이렇게 되면 또 다시 Snapshot too old 에러가 늘어날 수 있으므로, 불필요한 commit 은 자제한다. 

** Oracle 10g 버전 부터는 이 에러를 줄이기 위해 undo retention 을 자동으로 관리하는 기능이 제공된다. 


4) Temporary tablespace

- 임시자료를 저장하는 tablespace 로 DB 가 재시작되면 들어있던 내용은 모두 사라진다. 

- 정렬작업 등을 수행할 때 PGA 공간이 부족하면 이곳을 이용하므로, 정렬작업이 크게 일어나는 작업 전에 임시 tablespace 를 크게 만들어주고 작업하는 것이 성능향상에 도움이 된다. 


- Temporary tablespace 관리

## 기존 temporary tablespace 조회

SQL> select file_id, tablespace_name, bytes/1024/1024 MB, file_name from dba_temp_files;


   FILE_ID TABLESPACE      MB FILE_NAME

---------- ---------- ---------- --------------------------------------------------

 

1 TEMP      29 /app/oracle/oradata/testdb/temp01.dbf


## 신규 temporary tablespace 생성

SQL> select file_id, tablespace_name, bytes/1024/1024 MB, file_name from dba_temp_files;


   FILE_ID TABLESPACE      MB FILE_NAME

---------- ---------- ---------- --------------------------------------------------

1 TEMP      29 /app/oracle/oradata/testdb/temp01.dbf


SQL> 

SQL> create temporary tablespace temp2 tempfile '/app/oracle/oradata/testdb/temp02.dbf' size 10M;


Tablespace created.


SQL> select file_id, tablespace_name, bytes/1024/1024 MB, file_name from dba_temp_files;


   FILE_ID TABLESPACE      MB FILE_NAME

---------- ---------- ---------- --------------------------------------------------

1 TEMP      29 /app/oracle/oradata/testdb/temp01.dbf

 

2 TEMP2      10 /app/oracle/oradata/testdb/temp02.dbf



## Default temporary tablespace 변경하기

SQL> select * from database_properties where property_name like 'DEFAULT%';


PROPERTY_NAME       PROPERTY_V DESCRIPTION

------------------------------ ---------- --------------------------------------------------

DEFAULT_TEMP_TABLESPACE        TEMP  Name of default temporary tablespace

DEFAULT_PERMANENT_TABLESPACE   USERS  Name of default permanent tablespace

DEFAULT_EDITION       ORA$BASE   Name of the database default edition

 

DEFAULT_TBS_TYPE       SMALLFILE  Default tablespace type


SQL> alter database default temporary tablespace temp2;


Database altered.


SQL> select * from database_properties where property_name like 'DEFAULT%';


PROPERTY_NAME       PROPERTY_V DESCRIPTION

------------------------------ ---------- --------------------------------------------------

DEFAULT_TEMP_TABLESPACE        TEMP2  Name of default temporary tablespace

DEFAULT_PERMANENT_TABLESPACE   USERS  Name of default permanent tablespace

DEFAULT_EDITION       ORA$BASE   Name of the database default edition

 

DEFAULT_TBS_TYPE       SMALLFILE  Default tablespace type


## Temporary tablespace 크기 변경하기

SQL> alter database tempfile '/app/oracle/oradata/testdb/temp02.dbf' resize 100M;

 

Database altered.


## Temporary tablespace 삭제하기

SQL> drop tablespace temp;


Tablespace dropped.


SQL> select file_id, tablespace_name, bytes/1024/1024 MB, file_name from dba_temp_files;


   FILE_ID TABLESPACE      MB FILE_NAME

---------- ---------- ---------- --------------------------------------------------

 

2 TEMP2     100 /app/oracle/oradata/testdb/temp02.dbf


- Temporary tablespace group 개념 (11g 부터 새로나온 기능)

Oracle DB 접속 시 여러명의 사용자가 동시에 같은 계정을 (예, scott) 사용해서 접속 할 수가 있는데, 이렇게 동시에 접속해서 order by 같은 정렬작업을 한꺼번에 한다고 하면 PGA 가 부족할 경우 scott schema 의 temporary tablespace 를 사용할 것이다. 

이럴 경우 temporary tablespace 가 하나밖에 없을 경우 작업 속도는 늦어 질 수 있다.

11g 에서는 이 부분을 해결하기 위해 temporary tablespace group 이라는 개념을 도입했다. 

temporary tablespace 를 여러 개 만든 후 group 으로 묶고 특정 schema 에게 이 group 을 지정해 주면 하나의 schema  로 여러명이 사용한다 하더라도 성능향상에 도움이 될 수있다. 


Temporary tablespace group 사용 방법

## Temporary tablespace group 생성

SQL> create temporary tablespace temp_scott1 tempfile '/app/oracle/oradata/testdb/temp_scott01.dbf' size 10M tablespace group temp_scott_group;


 

Tablespace created.


SQL> select file_id, tablespace_name, bytes/1024/1024 MB, file_name from dba_temp_files;


   FILE_ID TABLESPACE_NAME MB FILE_NAME

---------- -------------------- ---------- --------------------------------------------------

1 TEMP_SCOTT1 10 /app/oracle/oradata/testdb/temp_scott01.dbf

 

2 TEMP2       100 /app/oracle/oradata/testdb/temp02.dbf


## 이미 존재하는 temporary tablespace 를 group 에 추가 (TEMP_SCOTT2 를 하나 더 만들자)

SQL> create temporary tablespace temp_scott2 tempfile '/app/oracle/oradata/testdb/temp_scott02.dbf' size 10M;


Tablespace created.


SQL> select file_id, tablespace_name, bytes/1024/1024 MB, file_name from dba_temp_files;


   FILE_ID TABLESPACE_NAME MB FILE_NAME

---------- -------------------- ---------- --------------------------------------------------

1 TEMP_SCOTT1 10 /app/oracle/oradata/testdb/temp_scott01.dbf

2 TEMP2       100 /app/oracle/oradata/testdb/temp02.dbf

 

3 TEMP_SCOTT2 10 /app/oracle/oradata/testdb/temp_scott02.dbf


SQL> alter tablespace temp_scott2 tablespace group temp_scott_group;


 

Tablespace altered.


## group 조회

SQL> select * from dba_tablespace_groups;


GROUP_NAME       TABLESPACE_NAME

------------------------------ --------------------

TEMP_SCOTT_GROUP       TEMP_SCOTT1

 

TEMP_SCOTT_GROUP       TEMP_SCOTT2


## 사용자 할당 (scott 에게 할당한다고 하자)

SQL> alter user scott temporary tablespace temp_scott_group;


 

User altered.


## default temporary tablespace 로 지정하기

SQL> alter database default temporary tablespace temp_scott_group;


 

Database altered.


## group 에서 탈퇴하기

SQL> alter tablespace temp_scott2 tablespace group '';


Tablespace altered.


SQL> select * from dba_tablespace_groups;


GROUP_NAME       TABLESPACE_NAME

------------------------------ --------------------

 

TEMP_SCOTT_GROUP       TEMP_SCOTT1


5) 일반 tablespace

- 관리자가 필요에 의해 만드는 tablespace 이다. 가장 일반적이다. 

- 일반 tablespace 관리

## 생성

SQL> create tablespace haksa datafile '/app/oracle/oradata/testdb/haksa01.dbf' size 1M;


Tablespace created.


## 조회

SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;


TABLESPACE_NAME     MB FILE_NAME

-------------------- ---------- --------------------------------------------------

USERS      5 /app/oracle/oradata/testdb/users01.dbf

UNDOTBS1     95 /app/oracle/oradata/testdb/undotbs01.dbf

SYSAUX    510 /app/oracle/oradata/testdb/sysaux01.dbf

SYSTEM    700 /app/oracle/oradata/testdb/system01.dbf

EXAMPLE 345.625 /app/oracle/oradata/testdb/example01.dbf

UNDO01     10 /app/oracle/oradata/testdb/undo01.dbf

HAKSA      1 /app/oracle/oradata/testdb/haksa01.dbf


 

7 rows selected.


## 각 data file 의 실제 사용량 확인 방법

SQL> select distinct d.file_id file#, d.tablespace_name ts_name, d.bytes/1024/1024 MB, d.bytes/8192 total_blocks, sum(e.blocks) used_blocks, to_char( nvl( round( sum(e.blocks)/(d.bytes/8192), 4 ), 0 )*100, '09.99') || '%' pct_used from dba_extents e, dba_data_files d where d.file_id=e.file_id(+) group by d.file_id, d.tablespace_name, d.bytes order by 1,2;

FILE# TS_NAME MB TOTAL_BLOCKS USED_BLOCKS PCT_USED

----- ---------- ---------- ------------ ----------- ----------

    1 SYSTEM 700   89600       89232  99.59%

    2 SYSAUX 510   65280       61792  94.66%

    3 UNDOTBS1 95   12160 2480  20.39%

    4 USERS  5     640 392  61.25%

    5 EXAMPLE    345.625   44240       39568  89.44%

    6 UNDO01 10    1280 488  38.13%

    7 HAKSA  1     128      00.00%


 

7 rows selected.


- Tablespace 용량 관리하기

haksa tablespace 에 iphak table 을 만들고 일부로 가득차게 해서 장애를 만들어 본 후, 아래의 3가지 방법으로 장애 처리를 해보겠다. 

## haksa tablespace 조회

SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;


TABLESPACE   MB FILE_NAME

---------- ---------- --------------------------------------------------

USERS    5 /app/oracle/oradata/testdb/users01.dbf

UNDOTBS1   95 /app/oracle/oradata/testdb/undotbs01.dbf

SYSAUX  510 /app/oracle/oradata/testdb/sysaux01.dbf

SYSTEM  700 /app/oracle/oradata/testdb/system01.dbf

EXAMPLE       345.625 /app/oracle/oradata/testdb/example01.dbf

UNDO01   10 /app/oracle/oradata/testdb/undo01.dbf

 

HAKSA    1 /app/oracle/oradata/testdb/haksa01.dbf


## iphak table 생성

SQL> create table scott.iphak (studno number) tablespace haksa;


Table created.


## 장애 발생

SQL> !vi ts_insert.sql

begin

for i in 1..5000000 loop

insert into scott.iphak values (i);

end loop;

commit;

end;

 

/


그리고 나서 일반 vi 처럼 :wq! 저장. 


SQL> @ts_insert


begin

*

ERROR at line 1:dy

ORA-01653: unable to extend table SCOTT.IPHAK by 8 in tablespace HAKSA

 

ORA-06512: at line 3

==> 설정되어 있는 tablespace 용량이 너무 작을 떄 나오는 error 이다. 아래와 같은 3가지 방법으로 복구 가능한다. 


## 복구 방법 1  - 수동으로 tablespace 에 data file 추가 하는 방법

SQL> alter tablespace haksa add datafile '/app/oracle/oradata/testdb/haksa02.dbf' size 20M;


Tablespace altered.


SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;


TABLESPACE   MB FILE_NAME

---------- ---------- --------------------------------------------------

USERS    5 /app/oracle/oradata/testdb/users01.dbf

UNDOTBS1   95 /app/oracle/oradata/testdb/undotbs01.dbf

SYSAUX  510 /app/oracle/oradata/testdb/sysaux01.dbf

SYSTEM  700 /app/oracle/oradata/testdb/system01.dbf

EXAMPLE       345.625 /app/oracle/oradata/testdb/example01.dbf

UNDO01   10 /app/oracle/oradata/testdb/undo01.dbf

HAKSA    1 /app/oracle/oradata/testdb/haksa01.dbf

HAKSA   20 /app/oracle/oradata/testdb/haksa02.dbf


 

8 rows selected.


## 복구 방법 2 - Data file 크기 수동 증가시키기

SQL> alter database datafile '/app/oracle/oradata/testdb/haksa01.dbf' resize 20M;


Database altered.


SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;


TABLESPACE   MB FILE_NAME

---------- ---------- --------------------------------------------------

USERS    5 /app/oracle/oradata/testdb/users01.dbf

UNDOTBS1   95 /app/oracle/oradata/testdb/undotbs01.dbf

SYSAUX  510 /app/oracle/oradata/testdb/sysaux01.dbf

SYSTEM  700 /app/oracle/oradata/testdb/system01.dbf

EXAMPLE       345.625 /app/oracle/oradata/testdb/example01.dbf

UNDO01   10 /app/oracle/oradata/testdb/undo01.dbf

HAKSA   20 /app/oracle/oradata/testdb/haksa01.dbf

HAKSA   20 /app/oracle/oradata/testdb/haksa02.dbf


 

8 rows selected.


## 복구 방법 3 - Data file 크기 자동 증가시키기

SQL> alter database datafile '/app/oracle/oradata/testdb/haksa01.dbf' autoextend on;

SQL> select tablespace_name, bytes/1024/1024 MB, file_name, autoextensible "Auto", online_status from dba_data_files;


TABLESPACE   MB FILE_NAME Aut ONLINE_

---------- ---------- -------------------------------------------------- --- -------

USERS    5 /app/oracle/oradata/testdb/users01.dbf YES ONLINE

UNDOTBS1   95 /app/oracle/oradata/testdb/undotbs01.dbf YES ONLINE

SYSAUX  510 /app/oracle/oradata/testdb/sysaux01.dbf YES ONLINE

SYSTEM  700 /app/oracle/oradata/testdb/system01.dbf YES SYSTEM

EXAMPLE       345.625 /app/oracle/oradata/testdb/example01.dbf YES ONLINE

UNDO01   10 /app/oracle/oradata/testdb/undo01.dbf YES ONLINE

HAKSA   20 /app/oracle/oradata/testdb/haksa01.dbf YES ONLINE

HAKSA   20 /app/oracle/oradata/testdb/haksa02.dbf NO  ONLINE


8 rows selected.


SQL> alter database datafile '/app/oracle/oradata/testdb/haksa02.dbf' autoextend on;    


Database altered.


SQL> select tablespace_name, bytes/1024/1024 MB, file_name, autoextensible "Auto", online_status from dba_data_files;


TABLESPACE   MB FILE_NAME Aut ONLINE_

---------- ---------- -------------------------------------------------- --- -------

USERS    5 /app/oracle/oradata/testdb/users01.dbf YES ONLINE

UNDOTBS1   95 /app/oracle/oradata/testdb/undotbs01.dbf YES ONLINE

SYSAUX  510 /app/oracle/oradata/testdb/sysaux01.dbf YES ONLINE

SYSTEM  700 /app/oracle/oradata/testdb/system01.dbf YES SYSTEM

EXAMPLE       345.625 /app/oracle/oradata/testdb/example01.dbf YES ONLINE

UNDO01   10 /app/oracle/oradata/testdb/undo01.dbf YES ONLINE

HAKSA   20 /app/oracle/oradata/testdb/haksa01.dbf YES ONLINE

HAKSA   20 /app/oracle/oradata/testdb/haksa02.dbf YES ONLINE


 

8 rows selected.


## autoextend 되는지 테스트 하기 (loop insert DML 을 다시 수행해본다.)

SQL> @ts_insert


PL/SQL procedure successfully completed.


SQL> select tablespace_name, bytes/1024/1024 MB, file_name, autoextensible "Auto", online_status from dba_data_files;


TABLESPACE   MB FILE_NAME Aut ONLINE_

---------- ---------- -------------------------------------------------- --- -------

USERS    5 /app/oracle/oradata/testdb/users01.dbf YES ONLINE

UNDOTBS1   95 /app/oracle/oradata/testdb/undotbs01.dbf YES ONLINE

SYSAUX  510 /app/oracle/oradata/testdb/sysaux01.dbf YES ONLINE

SYSTEM  700 /app/oracle/oradata/testdb/system01.dbf YES SYSTEM

EXAMPLE       345.625 /app/oracle/oradata/testdb/example01.dbf YES ONLINE

UNDO01 349.5 /app/oracle/oradata/testdb/undo01.dbf YES ONLINE

HAKSA      34.1875 /app/oracle/oradata/testdb/haksa01.dbf YES ONLINE

HAKSA      33.1875 /app/oracle/oradata/testdb/haksa02.dbf YES ONLINE


8 rows selected.


==> haksa01, 02 data file 의 크기가 20M 에서 34 M 정도로 자동으로 증가한 것이 확인 될 것이다.


- Tablespace Offline Mode

Tablespace offline 한다는 것은 해당 tablespace 만 shutdown 한다는 의미이다. 

Tablespace offline 에는 3가지 mode 가 있다. 

** Normal Mode : tablespace 에 아무런 문제가 없을 때 하는 정상적인 방법이다.

** Temporary Mode : 현재 Offline 시키고자 하는 tablespace 의 data file 이 하나라도 이상이 생기게 되면 쓰는 방법이다. 

** Immediate Mode : archive log mode 일 경우에만 사용 가능하다. 이 옵션은 Data file 에 장애가 나서 데이터를 내려 쓰지 못하는 상황에서 쓴다. 


- Tablespace offline 방법

## Tablespace 전체를 offline 할 때

SQL> alter tablespace haksa offline;


 

Tablespace altered.


## Tablespace 상태 조회

SQL> select file#, name, status from v$datafile;


FILE# NAME STATUS

----- -------------------------------------------------- -------

    1 /app/oracle/oradata/testdb/system01.dbf SYSTEM

    2 /app/oracle/oradata/testdb/sysaux01.dbf ONLINE

    3 /app/oracle/oradata/testdb/undotbs01.dbf ONLINE

    4 /app/oracle/oradata/testdb/users01.dbf ONLINE

    5 /app/oracle/oradata/testdb/example01.dbf ONLINE

    6 /app/oracle/oradata/testdb/undo01.dbf ONLINE

    7 /app/oracle/oradata/testdb/haksa01.dbf OFFLINE

    8 /app/oracle/oradata/testdb/haksa02.dbf OFFLINE


8 rows selected.


## Tablespace 전체 online

SQL> alter tablespace haksa online;


Tablespace altered.


SQL> select file#, name, status from v$datafile;


FILE# NAME STATUS

----- -------------------------------------------------- -------

    1 /app/oracle/oradata/testdb/system01.dbf SYSTEM

    2 /app/oracle/oradata/testdb/sysaux01.dbf ONLINE

    3 /app/oracle/oradata/testdb/undotbs01.dbf ONLINE

    4 /app/oracle/oradata/testdb/users01.dbf ONLINE

    5 /app/oracle/oradata/testdb/example01.dbf ONLINE

    6 /app/oracle/oradata/testdb/undo01.dbf ONLINE

    7 /app/oracle/oradata/testdb/haksa01.dbf ONLINE

    8 /app/oracle/oradata/testdb/haksa02.dbf ONLINE


8 rows selected.


## 특정 data file 만 offline 시키기

SQL> alter database datafile '/app/oracle/oradata/testdb/haksa01.dbf' offline;

alter database datafile '/app/oracle/oradata/testdb/haksa01.dbf' offline

*

ERROR at line 1:

ORA-01145: offline immediate disallowed unless media recovery enabled

===> 이 명령어는 DB 가 archive log mode 일 때만 가능하다. no archive log mode 라면 drop을 적어주어야 한다. 


SQL> alter database datafile '/app/oracle/oradata/testdb/haksa01.dbf' offline drop;


Database altered.


SQL> select file#, name, status from v$datafile;


FILE# NAME STATUS

----- -------------------------------------------------- -------

    1 /app/oracle/oradata/testdb/system01.dbf SYSTEM

    2 /app/oracle/oradata/testdb/sysaux01.dbf ONLINE

    3 /app/oracle/oradata/testdb/undotbs01.dbf ONLINE

    4 /app/oracle/oradata/testdb/users01.dbf ONLINE

    5 /app/oracle/oradata/testdb/example01.dbf ONLINE

    6 /app/oracle/oradata/testdb/undo01.dbf ONLINE

    7 /app/oracle/oradata/testdb/haksa01.dbf RECOVER

    8 /app/oracle/oradata/testdb/haksa02.dbf ONLINE


8 rows selected.

==> 7번 째 파일을 보면 RECOVER 상태가 되었다. no archive log mode 에서 data file 을 강제로 offline 시키면 저렇게 복구가 필요한 상태가 된다. 


## Tablespace offline 과 checkpoint 관계

SQL> alter tablespace example offline;


Tablespace altered.


SQL> select file#, name, status from v$datafile;


FILE# NAME STATUS

----- -------------------------------------------------- -------

    1 /app/oracle/oradata/testdb/system01.dbf SYSTEM

    2 /app/oracle/oradata/testdb/sysaux01.dbf ONLINE

    3 /app/oracle/oradata/testdb/undotbs01.dbf ONLINE

    4 /app/oracle/oradata/testdb/users01.dbf ONLINE

    5 /app/oracle/oradata/testdb/example01.dbf OFFLINE

    6 /app/oracle/oradata/testdb/undo01.dbf ONLINE

    7 /app/oracle/oradata/testdb/haksa01.dbf RECOVER

    8 /app/oracle/oradata/testdb/haksa02.dbf ONLINE


8 rows selected.


SQL> select a.file#, a.ts#, b.name, a.status, a.checkpoint_change# from v$datafile a, v$tablespace b where a.ts#=b.ts#;


FILE#     TS# NAME    STATUS  CHECKPOINT_CHANGE#

----- ---------- -------------------------------------------------- ------- ------------------

    1       0 SYSTEM                     SYSTEM 907205

    2       1 SYSAUX                     ONLINE         907205

    3       2 UNDOTBS1             ONLINE         907205

    4       4 USERS             ONLINE         907205

   5    6 EXAMPLE   OFFLINE   907926

    6       7 UNDO01                     ONLINE          907205

   7    12 HAKSA            RECOVER          907734

   8    12 HAKSA            ONLINE   907734


8 rows selected.

==> 위의 내용을 보면, EXAMPLE 과 HAKSA 만 CHECKPOINT_CHANGE# 다르나. 이 상태에서 example 을 online 시켜 보겠다. 


SQL> alter tablespace example online;


Tablespace altered.


SQL> select a.file#, a.ts#, b.name, a.status, a.checkpoint_change# from v$datafile a, v$tablespace b where a.ts#=b.ts#;


FILE#     TS# NAME    STATUS  CHECKPOINT_CHANGE#

----- ---------- -------------------------------------------------- ------- ------------------

    1        0 SYSTEM                      SYSTEM 907205

    2        1 SYSAUX                      ONLINE         907205

    3        2 UNDOTBS1             ONLINE         907205

    4        4 USERS             ONLINE         907205

   5     6 EXAMPLE    ONLINE   907926

    6        7 UNDO01                      ONLINE          907205

   7     12 HAKSA            RECOVER          907734

   8     12 HAKSA            ONLINE   907734


 

8 rows selected.

==> EXAMPLE 을 online 시켰음에도 불구하고 여전히 다르다. 이럴 경우엔 alter system checkpoint 로 수동으로 data file 동기화를 시켜야 한다. 

SQL> alter system checkpoint;


System altered.


SQL> select a.file#, a.ts#, b.name, a.status, a.checkpoint_change# from v$datafile a, v$tablespace b where a.ts#=b.ts#;


FILE#     TS# NAME    STATUS  CHECKPOINT_CHANGE#

----- ---------- -------------------------------------------------- ------- ------------------

    1       0 SYSTEM                     SYSTEM 908218

    2       1 SYSAUX                     ONLINE         908218

    3       2 UNDOTBS1             ONLINE         908218

    4       4 USERS             ONLINE         908218

   5     6 EXAMPLE    ONLINE  908218

    6       7 UNDO01                     ONLINE        908218

    7      12 HAKSA             RECOVER        907734

    8      12 HAKSA             ONLINE        908218


8 rows selected.

==> 이제 example 의 CHECKPOINT_CHANGE# 도 동일하다. 


## HAKSA tablespace 을 offline 시켜 보자.  (현재 data file 하나만 내려가 있는 상태이다.)

SQL> alter tablespace haksa offline;

alter tablespace haksa offline

*

ERROR at line 1:

ORA-01191: file 7 is already offline - cannot do a normal offline

 

ORA-01110: data file 7: '/app/oracle/oradata/testdb/haksa01.dbf'

==> 앞의 tablespace offline mode 에서 보았듯이, 하나의 data file 에 문제가 있는 경우, 정상적인 offline 방법으로는 내려가지 않는다. 이런 경우 temporary mode 를 사용하여야 한다. 


SQL> alter tablespace haksa offline temporary;


Tablespace altered.


SQL> select file#, name, status from v$datafile;                                                                       


FILE# NAME STATUS

----- -------------------------------------------------- -------

    1 /app/oracle/oradata/testdb/system01.dbf SYSTEM

    2 /app/oracle/oradata/testdb/sysaux01.dbf ONLINE

    3 /app/oracle/oradata/testdb/undotbs01.dbf ONLINE

    4 /app/oracle/oradata/testdb/users01.dbf ONLINE

    5 /app/oracle/oradata/testdb/example01.dbf ONLINE

    6 /app/oracle/oradata/testdb/undo01.dbf ONLINE

    7 /app/oracle/oradata/testdb/haksa01.dbf RECOVER

    8 /app/oracle/oradata/testdb/haksa02.dbf OFFLINE


8 rows selected.


SQL> recover tablespace haksa;

Media recovery complete.

SQL> 

SQL> alter tablespace haksa online;


Tablespace altered.


SQL> select a.file#, a.ts#, b.name, a.status, a.checkpoint_change# from v$datafile a, v$tablespace b where a.ts#=b.ts#;


FILE#     TS# NAME    STATUS  CHECKPOINT_CHANGE#

----- ---------- -------------------------------------------------- ------- ------------------

    1       0 SYSTEM    SYSTEM 908218

    2       1 SYSAUX    ONLINE 908218

    3       2 UNDOTBS1    ONLINE 908218

    4       4 USERS    ONLINE 908218

    5       6 EXAMPLE    ONLINE 908218

    6       7 UNDO01    ONLINE 908218

    7      12 HAKSA    ONLINE 908369

    8      12 HAKSA    ONLINE 908369


SQL> alter system checkpoint;


System altered.


SQL> select a.file#, a.ts#, b.name, a.status, a.checkpoint_change# from v$datafile a, v$tablespace b where a.ts#=b.ts#;


FILE#     TS# NAME    STATUS  CHECKPOINT_CHANGE#

----- ---------- -------------------------------------------------- ------- ------------------

    1       0 SYSTEM    SYSTEM 908393

    2       1 SYSAUX    ONLINE 908393

    3       2 UNDOTBS1    ONLINE 908393

    4       4 USERS    ONLINE 908393

    5       6 EXAMPLE    ONLINE 908393

    6       7 UNDO01    ONLINE 908393

    7      12 HAKSA    ONLINE 908393

    8      12 HAKSA    ONLINE 908393


8 rows selected.


- Data file 이동시키는 작업

** Offline 이 되는 tablespace 의 data file 이동 순서

1, 해당 Tablespace offline

2. Data file 을 대상 위치로 복사

3. Control file 내의 해당 Data file 위치 변경

4. 해당 Tablespace online 


** Offline 이 안되는 tablespace 의 data file 이동 순서

1. DB 종료 (shutdown)

2. DB 를 mount 상태로 startup

3. Data file 복사

4. Control file 의 내용 변경

5. DB open 


- 연습 1. HAKSA Tablespace 의 Data file 을 /app/oracle/disk1/haksa01.dbf,  /app/oracle/disk2/haksa02.dbf 로 이동해 보자 

## 1.  해당 Tablespace offline

SQL> alter tablespace haksa offline;


Tablespace altered.


SQL> select file#, name, status from v$datafile;


FILE# NAME STATUS

----- -------------------------------------------------- -------

    1 /app/oracle/oradata/testdb/system01.dbf SYSTEM

    2 /app/oracle/oradata/testdb/sysaux01.dbf ONLINE

    3 /app/oracle/oradata/testdb/undotbs01.dbf ONLINE

    4 /app/oracle/oradata/testdb/users01.dbf ONLINE

    5 /app/oracle/oradata/testdb/example01.dbf ONLINE

    6 /app/oracle/oradata/testdb/undo01.dbf ONLINE

    7 /app/oracle/oradata/testdb/haksa01.dbf OFFLINE

    8 /app/oracle/oradata/testdb/haksa02.dbf OFFLINE


 

8 rows selected.


## 2. Data file 을 대상 위치로 복사

SQL> !ls /app/oracle/disk1

ls: /app/oracle/disk1: No such file or directory

SQL> !mkdir /app/oracle/disk1

SQL> !ls /app/oracle/disk2

ls: /app/oracle/disk2: No such file or directory

SQL> !mkdir /app/oracle/disk2

 

SQL> !cp /app/oracle/oradata/testdb/haksa01.dbf /app/oracle/disk1/

SQL> !cp /app/oracle/oradata/testdb/haksa02.dbf /app/oracle/disk2/


## 3. Control file 내의 해당 Data file 위치 변경

SQL> select file#, name, status from v$datafile;


FILE# NAME STATUS

----- -------------------------------------------------- -------

    1 /app/oracle/oradata/testdb/system01.dbf SYSTEM

    2 /app/oracle/oradata/testdb/sysaux01.dbf ONLINE

    3 /app/oracle/oradata/testdb/undotbs01.dbf ONLINE

    4 /app/oracle/oradata/testdb/users01.dbf ONLINE

    5 /app/oracle/oradata/testdb/example01.dbf ONLINE

    6 /app/oracle/oradata/testdb/undo01.dbf ONLINE

    7 /app/oracle/oradata/testdb/haksa01.dbf OFFLINE

    8 /app/oracle/oradata/testdb/haksa02.dbf OFFLINE


8 rows selected.


SQL> alter tablespace haksa rename datafile '/app/oracle/oradata/testdb/haksa01.dbf' to '/app/oracle/disk1/haksa01.dbf';


Tablespace altered.


SQL> alter tablespace haksa rename datafile '/app/oracle/oradata/testdb/haksa02.dbf' to '/app/oracle/disk2/haksa02.dbf';


Tablespace altered.


SQL> select file#, name, status from v$datafile;


FILE# NAME STATUS

----- -------------------------------------------------- -------

    1 /app/oracle/oradata/testdb/system01.dbf SYSTEM

    2 /app/oracle/oradata/testdb/sysaux01.dbf ONLINE

    3 /app/oracle/oradata/testdb/undotbs01.dbf ONLINE

    4 /app/oracle/oradata/testdb/users01.dbf ONLINE

    5 /app/oracle/oradata/testdb/example01.dbf ONLINE

    6 /app/oracle/oradata/testdb/undo01.dbf ONLINE

    7 /app/oracle/disk1/haksa01.dbf OFFLINE

    8 /app/oracle/disk2/haksa02.dbf OFFLINE


 

8 rows selected.


## 4. 해당 Tablespace online

SQL> alter tablespace haksa online;


Tablespace altered.


SQL> select file#, name, status from v$datafile;


FILE# NAME STATUS

----- -------------------------------------------------- -------

    1 /app/oracle/oradata/testdb/system01.dbf SYSTEM

    2 /app/oracle/oradata/testdb/sysaux01.dbf ONLINE

    3 /app/oracle/oradata/testdb/undotbs01.dbf ONLINE

    4 /app/oracle/oradata/testdb/users01.dbf ONLINE

    5 /app/oracle/oradata/testdb/example01.dbf ONLINE

    6 /app/oracle/oradata/testdb/undo01.dbf ONLINE

    7 /app/oracle/disk1/haksa01.dbf ONLINE

    8 /app/oracle/disk2/haksa02.dbf ONLINE


 

8 rows selected.


- 연습 2, system01.dbf 파일을 /app/oracle/disk3/system01.dbf 로 이동시켜 보자

## 1. DB 종료

SQL> shutdown immediate;

Database closed.

Database dismounted.

 

ORACLE instance shut down.


## 2. MOUNT mode 로 DB open

SQL> startup mount;

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size    1344616 bytes

Variable Size  276827032 bytes

Database Buffers  138412032 bytes

Redo Buffers    6086656 bytes

Database mounted.

SQL> 

SQL> select status from v$instance;


STATUS

------------

 

MOUNTED


## 3. Data file 복사

SQL> !mkdir /app/oracle/disk3

 

SQL> !cp /app/oracle/oradata/testdb/system01.dbf /app/oracle/disk3/


## 4. Control file 의 내용변경

SQL> select file#, name, status from v$datafile;


FILE# NAME STATUS

----- -------------------------------------------------- -------

    1 /app/oracle/oradata/testdb/system01.dbf SYSTEM

    2 /app/oracle/oradata/testdb/sysaux01.dbf ONLINE

    3 /app/oracle/oradata/testdb/undotbs01.dbf ONLINE

    4 /app/oracle/oradata/testdb/users01.dbf ONLINE

    5 /app/oracle/oradata/testdb/example01.dbf ONLINE

    6 /app/oracle/oradata/testdb/undo01.dbf ONLINE

    7 /app/oracle/disk1/haksa01.dbf ONLINE

    8 /app/oracle/disk2/haksa02.dbf ONLINE


8 rows selected.


SQL> alter database rename file '/app/oracle/oradata/testdb/system01.dbf' to '/app/oracle/disk3/system01.dbf';


Database altered.


SQL> select file#, name, status from v$datafile;


FILE# NAME STATUS

----- -------------------------------------------------- -------

    1 /app/oracle/disk3/system01.dbf SYSTEM

    2 /app/oracle/oradata/testdb/sysaux01.dbf ONLINE

    3 /app/oracle/oradata/testdb/undotbs01.dbf ONLINE

    4 /app/oracle/oradata/testdb/users01.dbf ONLINE

    5 /app/oracle/oradata/testdb/example01.dbf ONLINE

    6 /app/oracle/oradata/testdb/undo01.dbf ONLINE

    7 /app/oracle/disk1/haksa01.dbf ONLINE

    8 /app/oracle/disk2/haksa02.dbf ONLINE


 

8 rows selected.


## 5. DB open

SQL> alter database open;


 

Database altered.


- 연습 3. Redo log file 을 아래와 같이 만들어 보자. (group 1, 2, 3)

/app/oracle/disk4/redo01_a.log, redo02_a.log, redo03_a.log 

/app/oracle/disk5/redo01_a.log, redo02_a.log, redo03_a.log

## 현재 Redo log 상태 확인

SQL> select a.group#, a.member, b.bytes/1024/1024 MB, b.archived, b.status from v$logfile a, v$log b where a.group#=b.group# order by 1, 2;


    GROUP# MEMBER      MB ARC STATUS

---------- -------------------------------------------------- ---------- --- ----------------

1 /app/oracle/oradata/testdb/redo01.log      50 NO  CURRENT

2 /app/oracle/oradata/testdb/redo02.log      50 NO  INACTIVE

 

3 /app/oracle/oradata/testdb/redo03.log      50 NO  INACTIVE


## DB 종료

SQL> shutdown immediate;

Database closed.

Database dismounted.

 

ORACLE instance shut down.


## Mount mode 로 DB open

SQL> startup mount;

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size    1344616 bytes

Variable Size  276827032 bytes

Database Buffers  138412032 bytes

Redo Buffers    6086656 bytes

 

Database mounted.


## Data file 복사

SQL> !mkdir /app/oracle/disk4

SQL> !mkdir /app/oracle/disk5

SQL> !cp /app/oracle/oradata/testdb/redo01.log /app/oracle/disk4/redo01_a.log

SQL> !cp /app/oracle/oradata/testdb/redo02.log /app/oracle/disk4/redo02_a.log

 

SQL> !cp /app/oracle/oradata/testdb/redo03.log /app/oracle/disk4/redo03_a.log


## Control file 내용 변경

SQL> alter database rename file '/app/oracle/oradata/testdb/redo01.log' to '/app/oracle/disk4/redo01_a.log';


Database altered.


SQL> alter database rename file '/app/oracle/oradata/testdb/redo02.log' to '/app/oracle/disk4/redo02_a.log';


 

Database altered.


SQL> alter database rename file '/app/oracle/oradata/testdb/redo03.log' to '/app/oracle/disk4/redo03_a.log';


Database altered.


## member 추가

SQL> select member from v$logfile;


MEMBER

--------------------------------------------------

/app/oracle/disk4/redo03_a.log

/app/oracle/disk4/redo02_a.log

/app/oracle/disk4/redo01_a.log


SQL> alter database add logfile member '/app/oracle/disk5/redo01_b.log' to group 1, '/app/oracle/disk5/redo02_b.log' to group 2, '/app/oracle/disk5/redo03_b.log' to group 3;


Database altered.


SQL> select member from v$logfile;


MEMBER

--------------------------------------------------

/app/oracle/disk4/redo03_a.log

/app/oracle/disk4/redo02_a.log

/app/oracle/disk4/redo01_a.log

/app/oracle/disk5/redo01_b.log

/app/oracle/disk5/redo02_b.log

/app/oracle/disk5/redo03_b.log


6 rows selected.


## DB Open

SQL> alter database open;


 

Database altered.


- 연습 4. Tablespace 삭제하기 

SQL> drop tablespace haksa;

drop tablespace haksa

*

ERROR at line 1:

ORA-01549: tablespace not empty, use INCLUDING CONTENTS option

==> table 이 하나라도 있다면 삭제 불가능.


SQL> drop tablespace haksa including contents and datafiles;


Tablespace dropped.


SQL> select tablespace_name, bytes/1024/1024 MB, file_name from dba_data_files;


TABLESPACE   MB FILE_NAME

---------- ---------- --------------------------------------------------

USERS    5 /app/oracle/oradata/testdb/users01.dbf

UNDOTBS1   95 /app/oracle/oradata/testdb/undotbs01.dbf

SYSAUX  520 /app/oracle/oradata/testdb/sysaux01.dbf

SYSTEM  700 /app/oracle/disk3/system01.dbf

EXAMPLE       345.625 /app/oracle/oradata/testdb/example01.dbf

UNDO01 349.5 /app/oracle/oradata/testdb/undo01.dbf


 

6 rows selected

by 짱구를꼭말려 2013. 9. 11. 21:03

Chap 6. Redo Log 관리하기

- Redo log buffer: 데이터의 변경이 생길 때 마다 장애를 대비해 변경되기 전과 후의 내용들 기록해 두는 메모리

- Redo log file데이터의 변경이 생길 때 마다 장애를 대비해 변경되기 전과 후의 내용들 기록해 두는 파일 (Redo log buffer 에서 내려쓰는 log 파일)


 1. Redo Log 의 생성/기록 원리  

사용자가 특정 데이터의 변경을 원하는 쿼리를 수행했다고 하면, 

STEP 1) 

서버 프로세스는 원하는 데이터 block 이 DB buffer cache 에 있는지 검사 한 후, 없으면 데이터 파일에서 원하는 데이터 block 을 복사해서 메모리 (DB buffer cache) 에 올려둔다. 

이 때, DB buffer cache 의 해당 block 을 다른 사용자가 사용하지 못하게 lock 을 설정해 두어야 하는데 이 과정을 page fix 라고 한다. 

또한, 변경되는 데이터의 모든 정보를 redo log 에 기록하기 위해 데이터 셋을 생성하는 데 이 데이터 셋을 Redo change Vector 이라고 한다. (PGA 에서 생성된다.) 


STEP 2) 

이렇게 PGA 상에서 만들어진 Change Vector 는 Redo log buffer 에 복사되는데, 서버 프로세스는 먼저 Redo log buffer 에 필요한 용량을 계산한다. 

그리고 Redo log buffer 에 복사하기 위해 번호표의 역활을 하는 Latch (래치) 를 획득해야 하는데 (공유된 자원을 사용할 시 순서를 정리해 주는 역활) , 우선 Redo copy latch 를 먼저 확보 한 후 다시 Redo Allocation latch 를 확보해야 한다.

Oracle 8i 버전까지는 이 Redo Allocation latch 는 하나 밖에 없어서 데이터의 변경이 많이 되는 서버일 경우 이 latch 를 확보하느라  속도 저하가 있었을 수 있다. 그래서 9i 버전 부터는 Redo log buffer 를 여러개의 공간으로 나누어서 각 공간별 Redo Allocation latch 를 할당해 주는 Shared Redo Strand  라는 기능이 도입 되었다. 


STEP 3) 

이렇게 해서 Redo log buffer 에 저장된  데이터가 아래와 같은 상황이 되면 LGWR 에 의해 Redo log file 에 내려써지게 된다.

1) 3초 마다

2) Redo log buffer 의 전체 크기의 1/3 이 찼겨나 1M가 넘을 경우

3) 사용자가 commit / rollback 수행했을 때 (Transaction 이 종료 되었을 때)

4) DBWR 이 LGWR에게 쓰기를 요청할 때


위와 같은 경우가 발생해서 Redo log file 에 내려쓰고 내려 쓴 내용들은 Redo log buffer 에서 삭제 (Flush) 되면서 Redo log buffer 에 새로운 공간을 확보하게 된다. 


 2. Redo Log File 구성   

1) Redo log file 의 구성

- Redo log file 은 group과 member라는 개념으로 관리 되는데, Oracle 7 버전 부터 장애에 대비해서 log file 을 여러 곳에 중복 저장하는 group이란 개념이 등장하였다. 

- 아래는 Oracle Group 과 Member 의 최소 / 권장 갯수이다. 

 

 

최 소 

권 장 

Group

 2

 3

 Member

 1

 2

 

- 최소 Member 는 1개 이지만, 만약 이 Member 가 삭제 되든지 장애가 발생하면 이 Group 의 log data는 모두 손실 되기 때문에 2개의 Member 를 권장한다. 하지만 이 Member 가 더 많아 진다면 안정적일 수는 있지만, 기록시간이 늘어나니 서버에 부하를 줄 수 있다. 

- 같은 group 의 member 의 크기는 모두 동일해야 한다. 

- 또한, 같은 Group 의 Member 는 절대 동일한 디스크에 함께 두는 것을 권장하지 않는다. 만약의 경우 디스크에 장애가 날 경우, 그 Group 전체가 손상 될 수 있기 때문이다. 


2) Redo log file 의 상태

 

 상 태

의 미 

Current 

   현재 LGWR 이 사용중인 Redo log file (삭제 불가능)

 Inactive

   Redo log file 의 내용이 모두 DB 파일에 저장이 되어 있는 상태 (삭제 가능)

 Active

   Redo log file 의 내용이 아직 DB buffer cache 에서 Data file 로 저장이 안되어 있는 상태

   (삭제 불가능)

 

- current 에서 active 로 변경하는 방법: log switch 발생 (alter system switch logfile; )

- active 에서 inactive 로 변경하는 방법: checkpoint 발생 (alter system checkpoint; )


3) Log switch / SCN / Commit / Checkpoint

- Log Switch

위의 Redo log 의 생성 원리에서 봤듯이, LGWR 은 commit 이 발생 했을 경우, Redo log buffer 의 내용을 Redo log file 에 내려 쓰게 된다. 이렇게 내려 쓰다가 현재 쓰고 있는 log file 이 가득 차게 되면, 다음 log file 로 넘어가게 되는데, 이 과정을 Log Switch 라고 한다


- SCN (System Commit Number)

Commit 이 발생 할때 Transaction 단위로 생성되는 고유 번호이다. 크게 SCN Base (4 bytes) + SCN Wrap(2 bytes) 로 구성되어 있다. 

이 번호를 가지고 장애 발생 시 복구도 하게 된다. 


- Commit

사용자가 commit 하게 되면 LGWR 이 해당 transaction 을 Redo Log File 에 기록하게 되는데, 이 때 4가지 방식이 있다. 

** WAIT : 변경 된 Transaction 이 Redo log file 에 기록될 때 까지 기다린다.

** NOWAIT : WAIT 과 반대, Redo Log file 에 기록될 때 까지 기다리지 않는다. 

** IMMEDIATE : Commit 요청이 들어오면 즉시 Redo Log file 에 기록한다. 

** BATCH : Commit 요청이 들어오면 일정시간 동안 모아서 Redo log file 에 기록한다. 


또한 commit 종류에는 동기식과 비동기식 commit 이 있는데, 

** 동기식 commmit :  순서대로 작업하는 것. 즉, commit 을 수행 할 떄 LGWR 이 Redo Log buffer 의 내용을 Redo log file 에 기록을 완료한 후에 다음 작업을 한다. 이 방법은 안정성은 좋지만 성능 면에서 떨어진다.

** 비동기식 commit : 아직 Redo log file 에 기록이 완료되지 않아도 다른 작업을 할 수 있게 해서 성능을 높이는 방식이다. (NOWAIT)  


- Checkpoint 

Commit 된 데이터를 어디까지 저장했는지 확인하기 위해서 만들어 놓은 개념이다. 

예를 들어, SCN 이 100번까지 commit 이 되었고, Checkpoint 정보가 90번 이라면 SCN 90 번 Transaction 까지는 데이터 파일에 저장이 되었다고 확인하는 것이다. 

Checkpoint 에는 아래와 같은 종류가 있다. 

** Database / Global Checkpoint : DB buffer cache 내에 있는 모든 저장 안된 Dirty buffer 들의 내용을 전부 데이터 파일로 저장하게 된다. 그리고 Checkpoint SCN (가장 큰 SCN 번호) 를 Control File 과 Data File Header 부분에 저장하게 된다. 

** Thread Checkpoint / Logical Checkpoint : Log Switch 가 발생하면 생기는 Checkpoint 이다. 해당 Thread 내의 저장되지 않은 모든 Dirty Buffer 들을 Data file 로 전부 내려쓴다. 

** Data file Checkpoint : 특정 데이터 파일에만 발생하는 Checkpoint 이다. 

** Mini Checkpoint : Drop Table 같이 특정한 DDL 발생시 특정 블록에만 발생하는 checkpoint 이다.

** Recovery Checkpoint : 데이터 파일에 장애가 발생 했을 때 백업된 데이터 파일 복원 후 Redo Change Vector 를 적용시키고 recovery 된 블록을 데이터 파일에 저장해야 하는데 이떄 발생하는 checkpoint 이다. 


- 위의 내용들의 더 자세한 설명을 위해 데이터 변경 작업을 예를 들어 보겠다. 

- A 를 B 로, C 를 D 로 각각 순서대로 update 한다고 가정하자. 변경 순서는 아래와 같을 것이다. 

STEP 1Redo Log buffer 에 A 에서 B 로 변경한다는 내용을 기록한다. 

STEP 2 - Undo log 에 원본 데이터인 A 를 기록하고, 

STEP 3 - 변경되는 값인 B 를 DB buffer Cache 에 올려둔다. 


------------> 이 상태에서 commit 이 수행되면, 

STEP 4 - LGWR 은 Redo Log File 에 Redo log buffer 에 있던 내용을 내려쓰고 (A->B 로 변경된다.), 다 내려쓰게 되면 commit 이 완료되면서 SCN (System Commit Number) 이 생성된다. (예를 들어, 1 번 이라 하자) 

그리고 이 commit SCN 정보도 같이 redo log file 에 변경되는 데이터와 함께 저장된다. (commit SCN) 


------------> 이 상태에서 현재 쓰고 있던 Redo log file 이 가득 차서 Log switch 가 발생하면, 

STEP 5 - CKPT (Checkpoint Process) 가 DBWR 에게 checkpoint 신호를 전달해 주고, DBWR 은 DB buffer cache 에 있던 내용들을 (B 로 변경 된 내용) Data file 로 내려 쓰게 된다. 또한, checkpoint 가 발생할 때 마지막 SCN 정보를 (여기서는 현재 1 이다.) Control file 과 Data file header 에 기록하게 된다. 


------------> 이 상태에서 C->D 로 update 하고 commit 을 했다고 하면, 

 STEP 6 - 앞의 step 1~ 4 까지 수행이 되면서, SCN 이 2 로 증가하고 (숫자는 예이다..) 업데이트 된 D 라는 데이터와  SCN 정보가 Redo log file 에 기록 될 것이다. 

즉, 현재까지는 Control file 과 Data file 의 SCN 은 1 이고, Redo log file 의 SCN 은 2이다. (아직 서로 다르다.)


------------> 만약, 이 상태에서 checkpoint 가 발생하기 전에 서버가 장애가 나서 종료되면? 

 STEP 7 - 서버를 다시 startup 할 때 Instance recovery 를 하게 될 텐데, 이 때 Oracle 은 Control file 에 있는 SCN 정보와 Redo log file 에 있는 SCN 정보를 비교할 것이다.  만약 이 정보가 다르다면, Oracle 은 문제가 있다고 판단하여 복구를 시작하게 된다. 


3. Redo log file 관리

1) 현재 로그 상태 확인하기 

set line 200
col group# for 999
col mb for 9999
col member for a45
col seq# for 999
col status for a8
col arc for a5  

select a.group#, a.member, b.bytes/1024/1024 MB, b.sequence# "SEQ#", b.status, b.archived "ARC", b.first_change# from v$logfile a, v$log b where a.group#=b.group# order by 1,2;  

 

SQL> @log  

GROUP# MEMBER                                                   MB SEQ# STATUS   ARC   FIRST_CHANGE#
------    --------------------------------------------- ----- ---- -------- ----- -------------     
1             /app/oracle/oradata/testdb/redo01.log        50    4 INACTIVE NO       821963     
2             /app/oracle/oradata/testdb/redo02.log        50    5 CURRENT  NO       841347     
3             /app/oracle/oradata/testdb/redo03.log        50    3 INACTIVE NO       809784

2) 신규 group 생성 및 member 추가

- 현재 group 3 까지 있으므로 4번을 생성해 본다

 

SQL> alter database add logfile group 4 '/app/oracle/oradata/testdb/redo04_a.log' size 5M;  

 

Database altered.  

 

SQL> @log  

 

GROUP# MEMBER                       MB SEQ# STATUS   ARC   FIRST_CHANGE#
------ --------------------------------------------- ----- ---- -------- ----- -------------     
1 /app/oracle/oradata/testdb/redo01.log        50    4 INACTIVE NO       821963     
2 /app/oracle/oradata/testdb/redo02.log        50    5 CURRENT  NO       841347     
3 /app/oracle/oradata/testdb/redo03.log        50    3 INACTIVE NO       809784     
4 /app/oracle/oradata/testdb/redo04_a.log       5    0 UNUSED   YES           0  

 

SQL> alter database add logfile member '/app/oracle/oradata/testdb/redo04_b.log' to group 4;  

 

Database altered.  

 

SQL> @log

  

GROUP# MEMBER                       MB SEQ# STATUS   ARC   FIRST_CHANGE#
------ --------------------------------------------- ----- ---- -------- ----- -------------     
1 /app/oracle/oradata/testdb/redo01.log        50    4 INACTIVE NO       821963     
2 /app/oracle/oradata/testdb/redo02.log        50    5 CURRENT  NO       841347     
3 /app/oracle/oradata/testdb/redo03.log        50    3 INACTIVE NO       809784     
4 /app/oracle/oradata/testdb/redo04_a.log       5    0 UNUSED   YES           0     
4 /app/oracle/oradata/testdb/redo04_b.log       5    0 UNUSED   YES           0

3) log switch 와 checkpoint 를 발생시켜 본다

SQL> @log  

 
GROUP# MEMBER                       MB SEQ# STATUS   ARC   FIRST_CHANGE#
------ --------------------------------------------- ----- ---- -------- ----- -------------     
1 /app/oracle/oradata/testdb/redo01.log        50    4 INACTIVE NO       821963     
2 /app/oracle/oradata/testdb/redo02.log        50    5 CURRENT  NO       841347     
3 /app/oracle/oradata/testdb/redo03.log        50    3 INACTIVE NO       809784     
4 /app/oracle/oradata/testdb/redo04_a.log       5    0 UNUSED   YES           0     
4 /app/oracle/oradata/testdb/redo04_b.log       5    0 UNUSED   YES           0  

 

-- 현재 current log 는 2번 group 이다.   

 

SQL> alter system switch logfile;

  

System altered.

  

SQL> @log  

 

GROUP# MEMBER                       MB SEQ# STATUS   ARC   FIRST_CHANGE#
------ --------------------------------------------- ----- ---- -------- ----- -------------     
1 /app/oracle/oradata/testdb/redo01.log        50    4 INACTIVE NO       821963     
2 /app/oracle/oradata/testdb/redo02.log        50    5 ACTIVE   NO       841347     
3 /app/oracle/oradata/testdb/redo03.log        50    3 INACTIVE NO       809784     
4 /app/oracle/oradata/testdb/redo04_a.log       5    6 CURRENT  NO       848254     
4 /app/oracle/oradata/testdb/redo04_b.log       5    6 CURRENT  NO       848254

  

-- log switch 가 일어나자 current group 이였던 2번이 active 로 변했고, 
-- 새로 생성한 4번 group 이 current 가 되었다.   

 

SQL> alter system checkpoint;

  

System altered.

  

SQL> @log

  

GROUP# MEMBER                       MB SEQ# STATUS   ARC   FIRST_CHANGE#
------ --------------------------------------------- ----- ---- -------- ----- -------------     
1 /app/oracle/oradata/testdb/redo01.log        50    4 INACTIVE NO       821963     
2 /app/oracle/oradata/testdb/redo02.log        50    5 INACTIVE NO       841347     
3 /app/oracle/oradata/testdb/redo03.log        50    3 INACTIVE NO       809784     
4 /app/oracle/oradata/testdb/redo04_a.log       5    6 CURRENT  NO       848254     
4 /app/oracle/oradata/testdb/redo04_b.log       5    6 CURRENT  NO       848254  

 

-- checkpoint 가 일어나자 active 였던 2번 group 이 inactive 가 되었다.

4) 기존 member 및 group 삭제

- 신규로 만들었던 group 4번을 삭제해 보자.

 

SQL> @log  

GROUP# MEMBER                       MB SEQ# STATUS   ARC   FIRST_CHANGE#

------ --------------------------------------------- ----- ---- -------- ----- -------------      1 /app/oracle/oradata/testdb/redo01.log        50    8 INACTIVE NO       848575      2 /app/oracle/oradata/testdb/redo02.log        50    9 INACTIVE NO       848580      3 /app/oracle/oradata/testdb/redo03.log        50    7 INACTIVE NO       848562      4 /app/oracle/oradata/testdb/redo04_a.log       5   10 CURRENT  NO       848587      4 /app/oracle/oradata/testdb/redo04_b.log       5   10 CURRENT  NO       848587  

 

SQL> alter database drop logfile group 4;

alter database drop logfile group 4

 

* ERROR at line 1:

ORA-01623: log 4 is current log for instance testdb (thread 1) - cannot drop

ORA-00312: online log 4 thread 1: '/app/oracle/oradata/testdb/redo04_a.log'

ORA-00312: online log 4 thread 1: '/app/oracle/oradata/testdb/redo04_b.log' 

 

------------------------------------------------------------------------

-- 위의 에러는 보면 current log 이기 때문에 삭제가 안된다. 

-- 위에서 current와 active log는 삭제가 안된다고 하였다.

-- 그러므로 inactive 상태로 만들어 주어야 한다.

------------------------------------------------------------------------

SQL> alter system switch logfile;  

 

System altered.  

 

 SQL> @log   GROUP# MEMBER                       MB SEQ# STATUS   ARC   FIRST_CHANGE# ------ --------------------------------------------- ----- ---- -------- ----- -------------      1 /app/oracle/oradata/testdb/redo01.log        50    8 INACTIVE NO       848575      2 /app/oracle/oradata/testdb/redo02.log        50    9 INACTIVE NO       848580      3 /app/oracle/oradata/testdb/redo03.log        50   11 CURRENT  NO       848665      4 /app/oracle/oradata/testdb/redo04_a.log       5   10 ACTIVE   NO       848587      4 /app/oracle/oradata/testdb/redo04_b.log       5   10 ACTIVE   NO       848587   SQL> alter system checkpoint;   System altered.  

 

SQL> @log  

 

GROUP# MEMBER                       MB SEQ# STATUS   ARC   FIRST_CHANGE#

------ --------------------------------------------- ----- ---- -------- ----- -------------      1 /app/oracle/oradata/testdb/redo01.log        50    8 INACTIVE NO       848575      2 /app/oracle/oradata/testdb/redo02.log        50    9 INACTIVE NO       848580      3 /app/oracle/oradata/testdb/redo03.log        50   11 CURRENT  NO       848665      4 /app/oracle/oradata/testdb/redo04_a.log       5   10 INACTIVE NO       848587      4 /app/oracle/oradata/testdb/redo04_b.log       5   10 INACTIVE NO       848587  

 

------------------------------------------------------------------------

-- 이제 group 4번이 inactive 가 되었다. 우선 member 부터 삭제해 본다 

------------------------------------------------------------------------

 

SQL> alter database drop logfile member '/app/oracle/oradata/testdb/redo04_b.log';  

 

Database altered.  

 

SQL> @log  

GROUP# MEMBER                       MB SEQ# STATUS   ARC   FIRST_CHANGE#

------ --------------------------------------------- ----- ---- -------- ----- -------------      1 /app/oracle/oradata/testdb/redo01.log        50    8 INACTIVE NO       848575      2 /app/oracle/oradata/testdb/redo02.log        50    9 INACTIVE NO       848580      3 /app/oracle/oradata/testdb/redo03.log        50   11 CURRENT  NO       848665      4 /app/oracle/oradata/testdb/redo04_a.log       5   10 INACTIVE NO       848587  

 

SQL> alter database drop logfile member '/app/oracle/oradata/testdb/redo04_a.log';

alter database drop logfile member '/app/oracle/oradata/testdb/redo04_a.log'

*

ERROR at line 1:

ORA-00361: cannot remove last log member /app/oracle/oradata/testdb/redo04_a.log for group 4  

 

------------------------------------------------------------------------

-- 위의 에러가 나는 이유는, 하나의 group 에는 최소 하나의 member 가 존재해야 하기 때문이다. 

-- 이럴경우, 전체 group 를 지워주면 된다.  

------------------------------------------------------------------------

 

SQL> alter database drop logfile group 4;  

 

Database altered.  

 

SQL> @log  

 

GROUP# MEMBER                       MB SEQ# STATUS   ARC   FIRST_CHANGE#

------ --------------------------------------------- ----- ---- -------- ----- -------------      1 /app/oracle/oradata/testdb/redo01.log        50    8 INACTIVE NO       848575      2 /app/oracle/oradata/testdb/redo02.log        50    9 INACTIVE NO       848580      3 /app/oracle/oradata/testdb/redo03.log        50   11 CURRENT  NO     848665

by 짱구를꼭말려 2013. 9. 10. 17:29

Chap 5. Control File 관리하기

 

- Control file 은 데이터베이스 전체의 정보를 지니고 있는 Oracle server Instance 를 open 할 때 두번 째 단계인 mount 단계로 가기 위해서 필요한 파일이다.(Instance open 순서: nomount -> mount -> open) 

- Binary file 이라서 사용자가 직접 수정할 수 없고, Server process 에게 변경을 요구하는 SQL 문장이나 DDL 문장을 수행해서 변경 할 수 있다. 


 1. Control file 다중화 하기   

 

1) spfile 일 경우

- 현재 운영중인 control file 의 경로를 확인 한 후, /home/oracle/disk[1-3]/control0[1-3].ctl 이렇게 3개의 파일로 다중화를 해보겠다. 

 

step1) 현재 상태 확인

SYS> select status from v$instance; 

 

STATUS
------------
OPEN 

 

SYS>  show parameter spfile;  

 

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
spfile                   string  /app/oracle/product/11g/dbs/spfiletestdb.ora

step2) 현재 control file 조회하기

SYS> select name from v$controlfile;

 

NAME
------------------------------------------------------------

/app/oracle/oradata/testdb/control01.ctl

/app/oracle/fast_recovery_area/testdb/control02.ctl

step3) spfile 내용 변경 후 instance 종료

SYS> alter system set control_files='/home/oracle/disk1/control01.ctl', '/home/oracle/disk2/control02.ctl', '/home/oracle/disk3/control03.ctl' scope=spfile;

 

System altered.  

 

SYS> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS>

 

step4) 대상 디렉토리 생성 후 파일 복사

SYS> !
[oracle@my ~]$ cd /home/oracle
[oracle@my ~]$ mkdir disk1 disk2 disk3
[oracle@my ~]$ cp /app/oracle/oradata/testdb/control01.ctl /home/oracle/disk1/control01.ctl
[oracle@my ~]$ cp /app/oracle/oradata/testdb/control01.ctl /home/oracle/disk2/control02.ctl
[oracle@my ~]$ cp /app/oracle/oradata/testdb/control01.ctl /home/oracle/disk3/control03.ctl
[oracle@my ~]$ exit
exit

step5) startup

SYS> startup
ORACLE instance started.  

 

Total System Global Area  422670336 bytes
Fixed Size          1344616 bytes
Variable Size         260049816 bytes
Database Buffers      155189248 bytes
Redo Buffers            6086656 bytes
Database mounted.
Database opened.
SYS> 
SYS> select name from v$controlfile; 

 

NAME
------------------------------------------------------------

/home/oracle/disk1/control01.ctl
/home/oracle/disk2/control02.ctl
/home/oracle/disk3/control03.ctl

2) pfile 일 경우

- 우선 현재 pfile 로 설정이 되어 있지 않을 경우 (show parameter pfile 로 조회 했을 때 value 에 값이 나오는 경우), pfile 을 생성 한 후 spfile 을 삭제하고 instance 를 재시작 한 후 다중화 해보겠다. 그리고 새로운 디렉토리를 disk[4-6] 으로 변경해 보겠다. 

- 아래는 pfile 로의 변경 작업이다.

 

SYS> !ls -l $ORACLE_HOME/dbs/
total 24
-rw-rw---- 1 oracle oinstall 1544 Aug 19 19:47 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Aug 19 20:39 hc_testdb.dat
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-r----- 1 oracle oinstall   24 Aug 19 19:51 lkTESTDB
-rw-r----- 1 oracle oinstall 1536 Aug 19 19:54 orapwtestdb
-rw-r----- 1 oracle oinstall 2560 Aug 19 20:39 spfiletestdb.ora  

 

SYS> create pfile from spfile;  

 

File created. 

 

SYS> !ls -l $ORACLE_HOME/dbs/
total 28
-rw-rw---- 1 oracle oinstall 1544 Aug 19 19:47 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Aug 19 20:39 hc_testdb.dat
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-r--r-- 1 oracle oinstall  913 Aug 19 20:41 inittestdb.ora
-rw-r----- 1 oracle oinstall   24 Aug 19 19:51 lkTESTDB
-rw-r----- 1 oracle oinstall 1536 Aug 19 19:54 orapwtestdb
-rw-r----- 1 oracle oinstall 2560 Aug 19 20:39 spfiletestdb.ora  

 

SYS> !rm -f $ORACLE_HOME/dbs/spfiletestdb.ora 

 

SYS> !ls -l $ORACLE_HOME/dbs/
total 24
-rw-rw---- 1 oracle oinstall 1544 Aug 19 19:47 hc_DBUA0.dat
-rw-rw---- 1 oracle oinstall 1544 Aug 19 20:39 hc_testdb.dat
-rw-r--r-- 1 oracle oinstall 2851 May 15  2009 init.ora
-rw-r--r-- 1 oracle oinstall  913 Aug 19 20:41 inittestdb.ora
-rw-r----- 1 oracle oinstall   24 Aug 19 19:51 lkTESTDB
-rw-r----- 1 oracle oinstall 1536 Aug 19 19:54 orapwtestdb  

 

SYS> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS> startup
ORACLE instance started.  

 

Total System Global Area  422670336 bytes
Fixed Size          1344616 bytes
Variable Size         260049816 bytes
Database Buffers      155189248 bytes
Redo Buffers            6086656 bytes
Database mounted.
Database opened.
SYS>            
SYS> show parameter pfile;  

NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
spfile                   string
SYS>


 

step1) 현재 사용중인 control file 조회하기

SYS> select name from v$controlfile;

NAME
------------------------------------------------------------
/home/oracle/disk1/control01.ctl
/home/oracle/disk2/control02.ctl
/home/oracle/disk3/control03.ctl

 

step2) instance 종료

SYS> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS>

step3) pfile 에서 control file 의 경로 수정

SYS> !vi $ORACLE_HOME/dbs/inittestdb.ora


*.control_files='/home/oracle/disk4/control01.ctl','/home/oracle/disk5/control02.ctl','/home/oracle/disk6/control03.ctl'

 

step4) 새로운 디렉토리 생성 후 control file 복사

SYS> !
[oracle@my ~]$ cd /home/oracle
[oracle@my ~]$ mkdir disk4 disk5 disk6
[oracle@my ~]$ cp /home/oracle/disk1/control01.ctl /home/oracle/disk4/control01.ctl
[oracle@my ~]$ cp /home/oracle/disk1/control01.ctl /home/oracle/disk5/control02.ctl
[oracle@my ~]$ cp /home/oracle/disk1/control01.ctl /home/oracle/disk6/control03.ctl
[oracle@my ~]$ exit
exit

step5) startup

SYS> startup
ORACLE instance started.  

Total System Global Area  422670336 bytes
Fixed Size          1344616 bytes
Variable Size         260049816 bytes
Database Buffers      155189248 bytes
Redo Buffers            6086656 bytes
Database mounted.
Database opened.
SYS> 
SYS> select name from v$controlfile;

  
NAME
------------------------------------------------------------

/home/oracle/disk4/control01.ctl
/home/oracle/disk5/control02.ctl
/home/oracle/disk6/control03.ctl  

 

SYS>

by 짱구를꼭말려 2013. 9. 9. 20:41

Chap 4. Oracle 시작하기와 종료하기

- Oracle 서버를 시작하는 단계는 Startup -> (Parameter file) -> NoMount -> (Control file) -> Mount -> (Redo log file, Data file) -> Open 


 1. Parameter File   

- 처음 Oracle server 를 Startup 하게 되면, 서버 프로세스가 가장 먼저 이 Parameter file 을 찾아서 읽는다. 


1) pfile (정적 Parameter ) 과  spfile (동적 Parameter )

 

 항목 / 파일

 pfile (정적 Parameter )

spfile (동적 Parameter )

기본 경로

$ORACLE_HOME/dbs

파일 이름 

initSID.ora 

spfileSID.ora 

 내용 변경

관리자 

서버 프로세스 

 파일 형태

 text

binary 


 

- 서버에 spfile 과 pfile 이 동시에 있을 경우는 spfile 내용 만 사용한다. 

- 만약 이 parameter file 이 삭제 될 경우, 원본 pfile 을 $ORACLE_HOME/dbs/initSID.ora 로 복사해서 복구 하면 된다. (원본 경로: $ORACLE_BASE/admin/SID/pfile/init.ora.xxxxxxx)

[oracle@my ~]$ cd $ORACLE_HOME/dbs
[oracle@my dbs]$ cp $ORACLE_BASE/admin/testdb/pfile/init.ora.5262013203842 nittestdb.ora

- 현재 spfile 을 사용하는지, pfile을 사용하는지 조회하는 방법


SQL> show parameter pfile;

   NAME                     TYPE    VALUE
------------------------------------ ----------- ------------------------------
spfile                   string  /app/oracle/product/11g/dbs/spfiletestdb.ora

위와 같이 VALUE 부분이 써져 있으면 SP파일이다.

Value 부분이 비어 있으면 P파일 이다.

 

2) Parameter 변경

- Oracle 9i 부터는 Dynamic SGA 기능으로 재부팅 없이 Parameter 값들을 바로 적용 시킬 수 있다. 아래 문장은 DB Cache size 를 30M 으로 변경하는 명령이다.

SYS> alter system set db_cache_size=30m scope=memory;

- 마지막의 scope 옵션은 3가지가 있다. 

 

 옵션

의미 

 Memory

  Spfile 의 내용은 변경하지 말고 현재 작동중인 instance 에만 적용 

  (재부팅 후 다시 원래의 spfile 의 설정으로 돌아감)

 Spfile

  현재 운영중인 Instance 에는 적용하지 않고 Spfile 의 내용만 변경

  (즉, 재부팅 후에 변경하겠다.)

Both 

  위의 2가지 모두를 적용한다는 의미로, 운영중인 instance 에도 적용하고, 

  재부팅 후에도 적용한다는 의미이다. (Default 값이다.) 

 


 2. Instance Open 하기   

- Oracle 의 시작 단계는 nomont -> mount -> open 으로 3 단계가 있으며, DBA 가 원하는 단계까지만 지정해서 Instance 를 시작할 수 있다. 원하는 단계 후에 나머지 단계를 진행하려면 alter database 라는 명령어를 사용해야 한다.

 

< Nomount 단계 까지만 시작한 후 나머지 단계 진행하기 >
SQL> startup nomount;
ORACLE instance started.

Total System Global Area  422670336 bytes
Fixed Size          1344616 bytes
Variable Size         268438424 bytes
Database Buffers      146800640 bytes
Redo Buffers            6086656 bytes
SQL> 
SQL> alter database mount;
Database altered.
SQL> alter database open;
Database altered.
SQL>   

 

< 읽기 전용인 상태로 open 하기 >

SQL> startup mount;
ORACLE instance started.  

Total System Global Area  422670336 bytes
Fixed Size          1344616 bytes
Variable Size         268438424 bytes
Database Buffers      146800640 bytes
Redo Buffers            6086656 bytes
Database mounted.
SQL> 
SQL> alter database open read only;
Database altered.
SQL>   

< Restricted mode (제한 모드) 로 open 하기 >

SQL> startup restrict;
ORACLE instance started.  

Total System Global Area  422670336 bytes
Fixed Size          1344616 bytes
Variable Size         268438424 bytes
Database Buffers      146800640 bytes
Redo Buffers            6086656 bytes
Database mounted.
Database opened.
SQL>

 

 3. Instance 종료하기    

- shutdown 에는 아래와 같이 4가지 옵션이 있다. 


1) shutdown normal 

- 종료 전에 접속되어 있던 사용자들이 모두 스스로 접속을 종료할 때까지 기다렸다가 종료한다. 


2) shutdown transactional

- 사용자가 수행중인 Transaction 이 끝난 시점 (commit, rollback) 에 강제로 접속을 종료한다. 즉, 사용자가 업데이트를 수행한 후 commit 이나 rollback 을 하지 않으면 Instance 를 종료할 수 없다. 


3) shutdown immediate 

- 사용자의 행동에 상관없이 즉시 접속을 강제 종료 하지만, 종료 되는 시점까지 사용자가 수행한 작업을 모두 처리하고 정상적으로 instance 를 종료한다. 즉, commit 이 완료된 데이터는 data file 로 저장해 주고, commit 이 안된 작업들은 모두 rollback 처리 해준다. 


4) shutdown abort

- 무조건 강제 종료이다. 아무 작업도 하지 않는다. 즉, 비정상 종료, Instance Crash 라고 부른다. 

- 다시 startup 될 때 SMON 이 Instance recovery 를 수행해서 복구 한다.

 

by 짱구를꼭말려 2013. 9. 8. 15:28

Chap 3. Oracle background process

- 아래의 5개의 Background process 는 필수 process 이다. 즉, 이 5개 중 하나라도 문제가 되면 장애다!


 1. DBWR (Database Writer)  

- Database buffer cache 에 변경 저장되어 있는 내용을 데이터 파일로 저장하는 역활.

- DBWR 이 작동하는 경우 , 

   * Checkpoint 신호가 발생 했을 때, 

   * Dirty buffer 가 임계값을 지났을 때 (40%)

   * Time out 이 발생 했을 때 (3초)  


 2. LGWR (Log Writer) 

- data 변경의 원리 및 변경 값 조회 (CR: Consistent Read)

만약 A 라는 사용자가 홍길동을 일지매로 변경하려고 한다면, 

1) 어떻게 변경 되는 지 Redo log buffer 에 기록하고, (홍길동 -> 일지매)  

2) 원래의 데이를 undo log 에 기록하고 (홍길동)

3) DB buffer cache (메모리) 에 변경되는 값을 기록하고 (일지매)

4) A 사용자가 commit 을 하게 되면 LGWR 은 Redo log buffer 에 기록되어진 내용들을 Redo log file 에 내려 쓴다. (아직 DBWR 이 실행하기 전 상태 - 즉, Data file 에는 변경 된 값이 없는 상태이다.)

5) 이 때, B 사용자가 원래의 값인 홍길동을 조회하려고 select 를 한다면, DB cache 에서 바로 불러오는 것이 아닌 (이미 해당 블록에는 일지매로 변경되어 있기 때문에) Undo log 에 있는 원래의 값을 DB cache 로 불러와서 select 를 한다. 이게 바로 CR (Consistent Read) 이다.


- LGWR 이 작동하는 경우, 

   * commit 이 발생 했을 때, 

   * Redo log buffer 가 1/3 이 찼을 때, 

   * Redo log buffer 에 변경량이 1M가 되었을 때, 

   * DBWR 이 내려 쓰기 전에,


 3. PMON (Process Monitor)  

- DB 서버는 정상적으로 켜진 상태에서 비정상적으로 종료된 프로세스가 있다면 (좀비 프로세스 같은..) 관련 복구 작업등을 하는 역활을 한다. (Transaction Table 의 내용 reset, 프로세스 lock 해제, 비정상 종료 프로세스의 Transaction ID 제거 등등)

- Instance 가 시작 될 때 해당 Instance 의 정보를 Listener 에 등록하고 관리하는 역활.


 4. SMON (System Monitor)  

- DB 서버가 완전히 커진 상태에서 (Instance Crash), Instance 를 시작 할때 Clean up 하는 역활 (Instance Recovery) 

- Instance Recovery 과정을 아래와 같은 예로 들어보면, 

### 상황

1) test 테이블에 A 를 입력

2) test 테이블에 B 를 입력

3) commit 수행 ( --> 위의 LGWR 에서 봤듯이, commit 을 했다고 해서 실제 Data file 에 저장이 되는 것이 아니라, 변경된 내용들을 Redo log file 에 내려쓰게 된다.)

4) test 테이블에 C 입력

5) 정전발생으로 DB 서버가 비정상 종료 됨.

- 위와 같은 상황에서 startup 을 수행하면 아래와 같은 순서로 recovery 가 된다. 

## Recovery 

1) Parameter file 을 읽어서 nomount 단계에서 instance 생성 

2) Mount 단계에서 control file 의 내용을 확인해서 Instance crash 확인

3) Redo log file 에서 위의 1~4 단계인 A, B 입력 -> commit -> C 입력 수행 (Roll Forward)

4) DB open 

5) commit 이 안되었던 4번 C 입력 부분을 취소 (Roll Backward


 5. CKPT (Checkpoint Process)  

- DBWR 에게 Checkpoint 신호를 전달, Control File 과 Data file Header 에 해당 checkpoint 정보를 기록하는 역활을 한다.

by 짱구를꼭말려 2013. 9. 8. 13:16

Chap 2. SQL 문장의 실행 원리

- SQL 문장 실행의 전체적인 순서는 Parse (구문분석) -> Bind (값 치환) -> Execute (실행) -> Fetch (인출) 이다. (Select 문 기준)


 1. Select 문장의 실행 원리 


1) Parse (구문분석)

- 사용자가 SQL 문장을 실행하면, 아래의 순서로 구문분석을 하게 된다. 

Step1 - Syntax check (문법 검사)

키워드 검사라고도 하며, Oracle 에서 미리 정해놓은 키워드 부분을 검사한다. (Select, From, where 등등)


Step2 - Semantic Check (의미 검사)

테이블 이름, 컬럼 이름처럼 사용자 마다 다른 부분을 검사한다. 


Step3 - 권한 검사 

권한이 있는지 없는지를 검사한다. 


Step4 - 실행 계획 생성

위의 권한 검사까지 다 완료 되었다면, Shared Pool 이라는 곳의 Library Cache 를 검사해서 해당 SQL 문장이 이미 실행된 적이 있는지를 검사해서 실행 계획을 세운다. 이 과정을 좀 더 상세히 설명하자면, 

* SQL 문장을 ASCII 값 (숫자값) 으로 변경 후, 해당 숫자 값을 Hash 함수를 통해 특정 Hash value 를 얻는다. 

* 이렇게 해서 얻은 Hash value 값과 Shared Pool 의 Library Cache 에 있는 Hash value 들과 비교를 해서 동일한 값이 있는지 확인을 한다. (이런 Hash Value 들이 들어가 있는 곳을 Hash Bucket 이라고 한다.)

* Hash Bucket 을 읽어서 동일한 Hash Value 가 있다면, 이제 실제 내용을 찾아야 하는데, 실제 내용이 있는 곳을 커서 (Cursor) 라고 한다. Library Cache 안에 있는 커서를 공유커서라고 하는데, 주의할 사항은 같은 SQL 문장이라 하더라도 사용자가 다르거나 한다면, 다른 내용이라고 여겨져서 커서를 공유할 수 없다. 

* 즉, 실행 계획을 세울 때 이렇게 Library Cache 안에서 원하는 SQL 문과 실행 계획이 들어 있는 커서를 찾아야 하는데,  Library Cache 에는 아주 많은 SQL 문장과 실행 계획이 들어가기 때문에 일일히 실제 커서를 방문해서 해당 내용이 있는지 없는지를 검사하지는 못한다. 그래서 Oracle 에서는 어떤 커서에 어떤 데이터가 들어있는지를 List 를 통해서 관리하게 되는데 이걸 Hash List 라고 부른다. 결론적으로, Library Cache 안에서 원하는 SQL 문과 실행 계획이 들어 있는 커서를 찾기 위해서는 반드시 Hash List 를 읽어야 한다. 

============> 여기 까지의 과정을 Soft parse 또는, 커서 공유를 한다고 한다. Soft parse 의 장점은 SQL 수행 속도가 빨라진다는 데에 있다. 하지만 문제는, Hash List 는 1개 밖에 없기 때문에 여러명의 사용자가 SQL문을 수행 했을 경우, 동시에 이 List 를 읽으려면 문제가 발생 할 수 있다. 그래서 Library Cache 의 Hash List 를 순서대로 보기 위해서 Oracle 에서는 Library Cache Latch 를 가지게끔 정하고 있다. (순번표 같은...)


* 만약 원하는 실행 계획을 Hash List 에서 찾지 못한다면 (Soft parse 에서 실패한다면), 새로운 실행계획을 세워야 하는데, Oracle 에서는 이런 역활을 하는 것이 옵티마이져(Optimizer) 이다. Optimizer 는 Data Dictionary 를 참고해서 실행 계획을 생성한다. 

============> 이 단계를 Hard parse 라고 한다. 


2) Bind (값 치환)

- Parsing 작업 (구문분석) 이 끝나면 Bind 단계로 넘어가는데 이 단계를 예를 들어보면, 

- emp 테이블에서 사원 번호를 입력받아 100 명의 사원 정보를 출력 한다고 하면, 사원번호 값만 다르고 SQL 문장은 동일할 것이다. 이럴 경우, 100 개의 SQL 을 Parsing 해서 100 개의 실행 계획을 만드는 것 보다 1번만 parsing 해서 1 개의 실행 계획을 만들어서 사원번호만 바꿔서 100번 실행하는 것이 수행 속도가 훨씬 빠르다. 

- 이런 작업을 Bind 라 하며, 여기서 사용되어지는 사원번호를 Bind 변수라고 한다. 


3) Execute (실행)

- Parse 와 Bind 단계를 거친 후에 서버 프로세스는 해당 데이터를 가져오기 위해 Database Buffer Cache 를 먼저 확인한다. (Chap 1 의 SGA 구성요소 참고 - 사용자가 조회하거나 변경하려는 모든 데이터는 Database Buffer Cache 에 있어야 한다.) 

- 만약 원하는 데이터 블록이 Buffer cache 에 있다면 바로 다음 단계인 Fetch 를 진행하게 되고, 데이터 블록이 없다면 하드 디스크에서 필요한 블록을 찾아서 메모리 즉, Database buffer cache 로 복사해 온다. 

- 이런 과정을 Execute 라고 한다. 


4) Fetch (인출)

- Execute 단계 까지 완료 되면, 원하는 데이터 블록이 메모리 (Database buffer cache) 에 있게 될 것이다. 이 블록에서 사용자가 원하는 데이터만 골라내는 과정이 Fetch 이다. 


 2. Update 문장의 실행 원리  

- Select 문장과 1~3 단계인 parse -> bind -> execute 단계 까지는 동일하고 (fetch 단계는 없다), execute 단계에서 조금 다른 부분이 있다. 

- Execute 단계에서 원하는 데이터가 들어있는 블록을 Database buffer cache 로 가져 온 후 변경되는 데이터의 변경 내역을 Redo log buffer 에 먼저 기록한다. 

- 그 후에 Undo Segment 에 원본 이미지를 기록 한 후 Database buffer cache 의 내용을 변경한다. 

- Oracle 에서는 이렇게 데이터가 변경되는 것을 트랜잭션 (Transaction) 이라고 한다.

by 짱구를꼭말려 2013. 9. 8. 13:12

Chap 1. Oracle server 구조 

- Oracle 서버는 크게 인스턴스(Instance) 와 데이터베이스(Database) 로 나눌 수 있는데, Instance 는 메모리 / database 는 실제 파일이 저장되는 공간이라고 볼 수 있다. 메모리에 생성되는 Instance 는 다시 SGA (Systeam Global Area) 와 Background process 로 나눌 수 있다 


1. SGA (System Global Area) 생성 과정  

- SGA (Systeam Global Area) 는 모든 process 들이 공유해서 사용되는 공유 메모리 같은 개념이다. 

- 사용자가 Oracle 을 startup 할때 이 SQL 명령을 받은 최초의 Oracle process 가 초기화 파라미터 (pfile / spfile)에 적혀있는 설정 값들을 참고해서 OS Kernel 에게 공유메모리 (즉, SGA) 를 생성해 달라고 요청한다. 

- 요청을 받은 Kernel 은 OS Kernel 파라메터를 조회해서 (Linux 일 경우, /etc/sysctl.conf) 설정되어 있는 값들을 기반으로 공유 메모리(SGA) 를 만들게 되고, 세마포어 (Semaphore) 설정 값들을 기반으로 하여 SGA 관리를 시작한다.  


2. SGA 관리 (세마포어 설정 값을 이용한)  

- OS Kernel 은 RAM 의 일부를 Oracle 에게 할당해 준 뒤에도 (SGA 생성 후에도) 다른 server process 들이 해당 공간을 사용하지 못하게 관리를 해주는데, 이럴 때 사용되는 것이 세마포어 이다. 

- 세마포어에 관련된 주요 Kernel 파라메터는 아래와 같다. (Linux 를 기준으로 설명하겠다. /etc/sysctl.conf 파일)


1) kernel.sem 

Oracle 11g 를 Linux 에 설치하고 나서 /etc/sysctl.conf 에 아래와 같은 설정을 해주었었다. 

kernel.sem = 250 32000 100 128

이 4가지 숫자의 의미를 살펴보면, 

* SEMMSL (250) - 보통 서버에서 여러 개의 process들이 세마포어를 동시에 사용하기 때문에 세마포어 사용량이 많다. 그래서 세마포어를 여러개의 셋트로 묶어서 사용하는데, 이 때 하나의 세마포어 셋트 당 세마포어의 최대 갯수 이다. 

* SEMMNI (128) - 리눅스에서 설정 가능한 세마포어 셋트의 최대 갯수를 의미한다.

* SEMMNS (32000) - 리눅스에서 사용 가능한 세마포어의 최대 갯수를 의미한다. 즉, SEMMSL X SEMMNI 가 되거나 그 이상이 되어야 한다.

* SEMOPM (100) - 하나의 시스템 호출이 초당 호출 가능한 최대 세마포어 갯수를 의미한다.


시스템에서 어떻게 설정 되어 있는지 확인하려면 아래와 같은 명령어를 사용하면 된다.

[oracle@my ~]$ ipcs -ls
------ Semaphore Limits --------
max number of arrays = 128                             ## --> SEMMNI
max semaphores per array = 250                       ## --> SEMMSL
max semaphores system wide = 32000               ## --> SEMMNS
max ops per semop call = 100                          ## --> SEMOPM
semaphore max value = 32767

2) kernel.shmmax (SHMMAX)

보통 Kernel 이 응용 프로그램들에게 메모리를 할당 해 줄 때 큰 덩어리로 한꺼번에 주게 되는데, 이런 덩어리들을 세그먼트라고 하고, shmmax 변수는 Kernel 이 Oracle 에게 공유 메모리를 할당해 줄 때 주는 큰 덩어리의 사이즈를 의미한다. 

만약 Oracle 이 RAM 을 100MB 를 쓸 수 있는데 kernel.shmmax 값을 20MB 라고 지정을 해버리면, 이론적으로 100MB 의 메모리를 5개의 세그먼트로 나누어서 사용해야 한다. 이럴 경우 성능이 좋지 않을 것이다. 

또한, 값을 너무 크게 줘 버리면 메모리의 낭비가 너무 심해져서 이 또한 성능에 좋지 않다. 

일반적으로 shmmax 의 default 값은 32MB 이지만, Oracle SGA 로 사용하기에는 너무 양이 부족 하기 때문에 보통은 2G 로 준다. 

이 값을 변경하는 방법은 아래 처럼 3가지가 있다.

* 방법 1 > /proc 파일 시스템에 변경 사항을 직접 반영시켜 서버의 재부팅 없이 변경.

[root@chacha ~]# echo "2147483648" > /proc/sys/kernel/shmmax

* 방법 2 > sysctl 명령어를 사용하여 변경

[root@chacha ~]# sysctl -w kernel.shmmax=2147483648

* 방법 3 > /etc/sysctl.conf 를 변경 후 sysctl -p 로 변경 내용 적용


3) SHMMNI

공유 메모리 세그먼트의 최대 갯수를 의미하며, default 값은 4096 개 이다. 이미 충분한 값이므로 보통은 변경하지 않는다.


4) SHNALL 

공유 메모리의 최대 크기 (페이지 단위) 를 의미하며 최소한 ceil(shmmax/page_size) 보다 큰 값을 사용하길 권장한다. default size 는 2097152 bytes (2MB) 이며, 아래 명령으로 현재 설정 된 값을 볼 수 있다.

[root@chacha ~]# cat /proc/sys/kernel/shmall

2097152 


5) SHMMIN

단일 공유 메모리 세그먼트의 최소 크기 (byte) 를 의미한다. 


6) SHMSEG

1개의 process 에 부여 될 수 있는 공유 메모리 세그먼트의 최대 갯수를 의미한다. SHMMNI 와 다른 점은 SHMMNI 는 시스템 전체에서 사용 가능한 공유 메모리의 세그먼트의 최대 갯수 이고, SHMSEG는 1개의 process 에서 시용 가능한 공유 메모리 세그먼트의 최대 갯수이다. 


3. SGA 의 주요 구성 요소  

- SGA 구성 요소 중 Database Buffer cache, Redo Log Buffer, Shared Pool 은 중요한 요소들이다. 

1) Database Buffer Cache

- 실제 데이터의 조회와 변경 등의 작업이 일어나는 공간으로 사용자가 조회하거나 변경하려는 모든 데이터는 이 곳에 있어야만 한다. 즉, 파일에 저장되어 있는 어떤 데이터를 조회하거나 변경하려면, 해당 데이터가 있는 블록을 복사해서 이 곳으로 가져와서 작업을 진행한다는 의미이다. 이렇게 하는 이유는 디스크에서 작업하는 속도와 메모리에서 작업하는 속도를 비교했을 때 메모리가 훨씬 빠르기 때문이다.

- SGA 는 공유 메모리 이기 때문에 여러 명의 사용자가 한꺼번에 동일한 메모리 블록을 사용 할 수도 있는데, 이럴 경우 심각한 장애가 발생 할 수도 있다. 이런 장애를 막기 위해서는 어떤 메모리 블록이 비어있는지 아닌지를 관리해야 하는데, Oracle 에서는 database butter cache block 의 상태를 3가지로 나누어 두고 리스트를 통해 관리한다. 

* Pinned buffer - 현재 사용중인 블록을 의미한다. 즉, 다른 사용자는 사용할 수 없다.

* Dirty buffer - 메모리에서의 작업은 완료 되었지만 (메모리에서는 변경되었지만), 아직 파일에 적용이 안 된 상태의 블록을 의미한다. 이 상태 역시  다른 사용자가 사용할 수 없다.

* Free buffer - 현재 비어있는 상태의 블록을 의미한다. 즉, 사용할 수 있는 블록이다. 

- Oracle 에서는 이런 block 들을 상태를 관리하기 위해 LRU (Least Recently Used) list 라는 것을 만들어서 사용한다. (LRU 알고리즘은 가장 최근까지 많이 사용된 것은 지키고 가장 사용이 안 된 것은 버리는 알고리즘이다.)

- 또한 이 LRU List 의 효율성을 위해 LRU LRUW 리스트로 나누고 각각 세부적으로 메인/보조 리스트로 나누어서 관리를 한다. 이것을 합쳐서 Working Data Set 이라고 부른다. 

 

LRU

  [2] 메인 리스트

  Dirty list + Free list

  [1] 보조 리스트

  Free list

 LRUW

  메인 리스트

  Dirty list (변경된 buffer 들의 리스트)

  보조 리스트

  현재 DBWR에 의해 기록중인 buffer 들의 리스트

 

- 어떤 데이터를 파일로 부터 db buffer cache 로 가져와야 할 경우, 위의 표를 기준으로 설명을 하자면, 일단 비어있는 메모리 block 을 검사하기 위해 LRU 보조 리스트에서 ([1]) 비어 있는 block 을 먼저 조회하고, 비어 있는 block 이 없을 경우, LRU 메인 리스트에서 ([2]) 비어있는 영역을 검사한다. 10g 의 기준으로 약 40% 정도를 검사했는데도 비어있는 block 을 찾지 못할 경우는 scan 을 멈추고 Database Writer (DBWR) 에게 dirty buffer 를 내려 쓰라고 요청을 한다. 이렇게 해서 데이터 파일로 저장이 완료된 dirty buffer 는 상태가 다시 free buffer 로 바뀌면서 LRU 보조 리스트에 추가가 된다.  


2) Redo Log Buffer

- DDL이나 DML 이 실행될 경우 (즉, 데이터의 변경이 생길 경우) , 해당 변경 내용을 기록해 두는 역활을 한다. (장애시 복구 위해서)


3) Shared Pool

- 다른 사용자들과 어떤 대상을 공유하기 위해 만들어진 곳이다. 아래와 같이 여러개의 공간으로 나누어 진다. 

Library Cache - Soft parse 할 때 사용되고, 이미 수행되었던 SQL, PL/SQL 문장과 실행 계획등이 저장되어 있다.

* Data Dictionary Cache - 구문분석이나 옵티마이져가 실행계획을 세울 때 사용되는 주요 Dictionary 들이 row 단위로 cache 되어 있다. 

* Server Result Cache (11g 부터) - SQL 의 결과 값을 cache 해 두는 공간이다. 

* Reserved Pool - Shared pool 에 5KB (11g 기준) 가 넘는 오브젝트가 적재되어야 할 경우 사용하기 위해 예약된 공간.


4. Dynamic SGA   

- 보통 SGA 의 설정 값들을 변경하기 위해서는 8i 때 까지는 변경 후 서버를 꼭 재시작 해주어야 했는데, 9i 부터는 Dynamic SGA 가 나오면서 재시작 하지 않고 바로 적용이 가능하게 되었다. 예를 들어 DB buffer cache 크기를 100MB 로 변경한다고 하면, 

SYS> alter system set db_cache_size=100M; 

위의 명령어로 가능하다. 또한, 현재 사용중인 SGA 크기를 확인하려면 아래와 같이 조회하면 된다.

SYS> show sga;


5. PGA (Program Global Area)  

- SGA 가 공유 메모리라면, PGA 는 각 process 들이 개별적으로 사용하는 메모리 공간이다. 즉, 모든 server process 나 background process 들은 전부 각각의 PGA 를 가지고 있다. 

- 아래는 PGA 의 구성요소이다.

1) Private SQL Area 

SQL 문장 수행 시 bind 변수 값이나 Query 의 실행 상태정보, Query 를 수행하면서 임시로 정보를 저장해야 하는 경우 (ex, join ) 이 공간을 사용한다. Private SQL Area 는 Persistent Area 와 Runtime Area 로 구성이 된다. 

* Persistent Area - Bind 변수 값을 저장

* Runtime Area - SQL 문장을 수행하는 도중에 데이터르 임시로 저장해야 할 경우 사용.


2) SQL Work Area

Sort 관련 작업이나 Hash 관련 작업이 있을 경우 이 곳에서 작업을 수행한다.

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

[Oracle Admin] Chap 3. Oracle background process  (0) 2013.09.08
[Oracle Admin] Chap 2. SQL 문장의 실행 원리  (0) 2013.09.08
Archive/No Archive log mode  (0) 2013.08.02
Export, Import  (0) 2013.07.24
Table Space 및 DATA file 관리  (0) 2013.07.16
by 짱구를꼭말려 2013. 9. 8. 13:09

 DB (Database) 복구의 원리   백업과복구1 P.29~31

데이터의 복구 원리를 설명하기 전에 우선, 데이터가 저장되는 원리를 먼저 보자. 사용자가 A라는 데이터를 테이블에 입력한다고 하면,

- Redo log buffer 에 A 에 먼저 들어가고,

 

- 사용자가 commit 을 하면 Redo log buffer 에 A 가 Redo log file 에 SCN 과 함께 저장이 되고 (SCN 을 1이라고 가정한다. ) Redo log buffer 에서는 A 가 지워질 것이다.

 

- 이 때, log switch 같은 것이 발생해서 checkpoint  가 일어나면 DB buffer cache 에 있던 A 가 Data file 로 내려써 지게 되면서 CKPT (check point) 프로세스가 Data file 헤더와 Control file 헤더에 각각 동일한 SCN (여기서는 1) 을 기록하게 된다.

 

- 이 상태에서 DB backup 을 받고 (Data 파일에 SCN 이 1인 상태), 그 이후로 데이터 B, C 가 들어와서 SCN 이 2~3 으로 증가 후 Data/control file의 헤더에 이제 SCN 이 3인 상태가 되었다고 가정하자.

 

- 여기서 새로운 데이터 D와 E 가 들어와서 commit 이 발생, 그리고 LGWR 이 해당 데이터들을 Redo log file 내려써야 하는데, 빈 공간이 없다면 기존의 A, B 가 들어가 있는 공간 (inactive redo log file) 에 덮어 쓸 것이다. 그러면서 또 다시 checkpoint 가 일어나서 data/control header 에도 SCN 이 4->5 로 증가했다고 가정하자.

 


 

만약, 이 상황에서 예기치 않게 DB 서버에 장애가 생겨서 데이터 파일이 날아갔다고 하면, 기존에 backup 해 둔 데이터를 복사해 와서 (Restore) DB 를 Recover 해야한다.

 

하지만 위의 상황에서 backup data 에는 A 가 입력 되었을 때의 데이터, 즉, Data file 의 SCN 이 1 일때의 상태이고, 현재 Control file 의 SCN 이 5 번이다.

 

SCN 이 서로 다르므로 Recover 를 할 때는 2~5 번까지의 작업을 Redo log file 이나 Archive log file 을 뒤져서 Recover 를 해야하는데 (2~5 번 순서대로 하고, 만약 2번이 없으면 더 이상 진행되지 않는다.) Redo log 에서 SCN 2번이 저장되어 있는 부분을 (즉, 데이터 B 를 입력했던 부분) 데이터 D 가 덮어써 버렸으니, SCN 2번 부분을 복구 할 수 없게 된다.

 

이런 경우는 no archive log mode 라고 하고 Oracle 을 처음 설치하면 기본 모드이다.

 

이런 문제를 막기 위해서 Redo log file 에 덮어쓰기 전에 다른 곳으로 복사해 두고 덮어쓰는 방법을 쓸 수 있는데 이런 방법을 archive log mode 라고 한다.

 

 

 

 Archive log mode 로 변경하기

 

## 현재 log mode 조회

SYS> archive log list;

Database log mode       No Archive Mode

Automatic archival       Disabled

Archive destination       USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence     101

 

Current log sequence       103


## DB 종료

SYS> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

 


## Parameter file 변경

SYS> !vi $ORACLE_HOME/dbs/inittestdb.ora

log_archive_dest_1='location=/data/arc1'

log_archive_dest_2='location=/data/arc2'

 

log_archive_format=%s_%t_%r.arc

▲ 1과 2 폴더에는 같은 파일이 저장이 된다. 용량이 부족할 경우 1개만 사용하도록 하자


## mount 상태로 startup

SYS> startup mount;

ORACLE instance started.


Total System Global Area  422670336 bytes

Fixed Size    1344616 bytes

Variable Size  260049816 bytes

Database Buffers  155189248 bytes

Redo Buffers    6086656 bytes

 

Database mounted.


## archive log mode 경로 변경 내용 확인

SYS> archive log list;

Database log mode       No Archive Mode

Automatic archival       Disabled

Archive destination       /data/arc2

Oldest online log sequence     101

 

Current log sequence       103


## archive mode 로 변경하기

SYS> alter database archivelog;


Database altered.


SYS> archive log list;

Database log mode       Archive Mode

Automatic archival       Enabled

Archive destination       /data/arc2

Oldest online log sequence     101

Next log sequence to archive   103

 

Current log sequence       103


## DB open

SYS> alter database open;


 

Database altered.

 

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

[Oracle Admin] Chap 2. SQL 문장의 실행 원리  (0) 2013.09.08
[Oracle Admin] Chap 1. Oracle server 구조  (0) 2013.09.08
Export, Import  (0) 2013.07.24
Table Space 및 DATA file 관리  (0) 2013.07.16
불완전 복구(Incomplete Recovery)  (0) 2013.07.16
by 짱구를꼭말려 2013. 8. 2. 22:27

Tablespace 단위로 Export 한 후, Import 할 때 imp 프로그램이 Tablespace를 만들지는 않는다. 

직접 만들어 놓아야 한다.


 Export

Import 

계정,비밀번호,Default tablespace 가 같아야 한다. 


dmp 파일은 절대로 수정 및 저장 금지




Large Object loB(대용량 자료)


A(일반 칼럼)

B(일반 칼럼)

C(LOB)

 data

data 

Large data 


Select A,B from table 이라고 쳤을 경우 DB cache에 C도 같이 올라가게 된다.

그러면 많은 과부하가 걸리기 때문에 LOB 는 따로 관리를 하게 된다.

C 칼럼은 링크 형식으로 해놓고 따로 별개의 tablespace에 저장을 해 놓기 때문에, Export, Import 할 때에도 A,B 가 저장되어 있는 tablepsace 와 C 가 저장되어 있는 tablepsace 모두 준비를 해 놓고 Import 해야 한다.



by 짱구를꼭말려 2013. 7. 24. 12:34

테이블 스페이스 만들기

 

Create tablespace test(테이블스페이스 이름)

datafile '/app/oracle/oradata/testdb/test01.dbf' size 5M;

 

 

 

테이블 스페이스 및 연결된 데이터파일 조회

 

SQL> set line 200
SQL> col tablespace_name for a10
SQL> col file_name for a50
SQL> select tablespace_name,bytes/1024/1024 MB, file_name
2 from dba_data_files;

TABLESPACE MB FILE_NAME
--------------------------------------------------------------------------------
USERS 5 /app/oracle/oradata/testdb/users01.dbf
UNDOTBS1 90 /app/oracle/oradata/testdb/undotbs01.dbf
SYSAUX 520 /app/oracle/oradata/testdb/sysaux01.dbf
SYSTEM 2010 /app/oracle/disk3/system01.dbf
EXAMPLE 345.625 /app/oracle/oradata/testdb/example01.dbf
TS_WEBHARD 100 /app/oracle/oradata/testdb/ts_web01.dbf
TS_WEB_IDX 10 /app/oracle/oradata/testdb/ts_web_idx01.dbf

 

7 rows selected.

 

 

 

테이블 스페이스 삭제 및 연결된 데이터파일 삭제

 

SQL> drop tablespace test including contents and datafiles;

 

 

 

테이블 스페이스 오프라인으로 변경하기

 

SQL> alter tablespace test offline;

 

 

 

테이블 스페이스 복원 복구

 

SQL> recover tablespace test;

 

 

테이블이 어떤 테이블 스페이스에 들어 있는지 조회하기

 

SYS> select table_name, tablespace_name from all_all_tables where table_name='TT100';

(주의:Dictionary 는 대문자로 조회 해야 한다)

TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TT100                          EXAMPLE 

 

 

사용하고 있는 데이터 파일 조회

SQL> select name,file# from v$datafile;

NAME FILE#
------------------------------ ----------
/data/temp/system01.dbf 1
/data/temp/sysaux01.dbf 2
/data/temp/undotbs01.dbf 3
/data/temp/users01.dbf 4
/data/temp/example01.dbf 5
/data/temp/ts_web01.dbf 6
/data/temp/ts_web_idx01.dbf 7
/data/temp/test01.dbf 8

8 rows selected.


DB를 켠 상태로 데이터파일 사용중인 경로 바꾸기

SQL> alter database rename file '/app/oracle/disk3/system01.dbf'
2 to '/data/temp/system01.dbf';

 

Database altered.

 

Data File을 잃었을 때 DB를 끄지 않고 새로 생성하여 유지하기

(파일을 백업 하지 못했는데 복구가 필요할 때)

SQL> alter database create datafile '/app/oracle/oradata/testdb/test01.dbf'
2 as '/data/temp/test01.dbf';

 

Database altered.

 

변경된 상태 조회

SQL> select name from v$datafile;

NAME
--------------------------------------------------------------------------------
/data/temp/system01.dbf
/data/temp/sysaux01.dbf
/data/temp/undotbs01.dbf
/data/temp/users01.dbf
/data/temp/example01.dbf
/data/temp/ts_web01.dbf
/data/temp/ts_web_idx01.dbf
/data/temp/test01.dbf

8 rows selected.

 

DataFile 오프라인으로 변경하기

alter database datafile '/home/oracle/temp/test01.dbf' offline drop;

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

[Oracle Admin] Chap 2. SQL 문장의 실행 원리  (0) 2013.09.08
[Oracle Admin] Chap 1. Oracle server 구조  (0) 2013.09.08
Archive/No Archive log mode  (0) 2013.08.02
Export, Import  (0) 2013.07.24
불완전 복구(Incomplete Recovery)  (0) 2013.07.16
by 짱구를꼭말려 2013. 7. 16. 12:09
| 1 2 3 |