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

★★★오라클 10g RAC_rawdevices 설치 - clusterware 설치 & 패치★★★

 

===========================================================================================================================

 

<clusterware 설치>

 

1. clusterware 디렉토리로 이동하여 runInstaller를 실행한다.

$ cd /home/oracle/pkg/clusterware

$ ./runInstaller

 

./runInstaller를 실행시키면 아래 화면이 실행된다.

▲다음 

 

▲환경변수에 입력을 해놨기때문에 자동으로 입력되어 있다. 다음을 누른다. 

 

▲경로에 db로 되어있는것을 crs 고친다. 다음을 누른다. 

 

▲모두 성공함이 뜨면 다음을 누른다.

교체 공간이 부족합니다 라는 에러가 떴었는데, SWAP 이 부족하면 이 에러가 생길 수 있다.

▼ 해결책

이미 운영 중인 시스템에서 사용하고 있는 스왑공간이 부족(그럴 이유는 없겠지만, 거의...그러나간혹 오라클설치하려니 스왑 공간이 부족하다. 괜히 늘려주고 싶다.)하여 스왑영역을 확보하기 위해서는, 파티션을 재구성하여 스왑파티션을 설정하거나 스왑파일을만드는 방법이 있습니다. 그러나, 파티션을 다시 구성하기 위해서는 여유있는파티션이 있어야 하며, 번거롭고, 많은 작업이 필요하므로, 스왑파일을 만들어서 스왑영역을 확보하는 방법에 대해 찾다가 알게 되었습니다.

256MB의 스왑파일을 만들어 보겠습니다. 먼저 스왑파일을 만들 공간을 설 정합니다.

다음과 같은 명령을 내리면 /boot 디렉토리 밑에 256MB짜리 NULL 파일이 만들어 집니다.

/dev/zero는 Null byte의 source를 뜻하며 생 성하고자 하는 swap파일의 명칭은 편의상 swapfile로 하였습니다. 

#dd if=/dev/zero of=/boot/swapfile bs=1024 count=262144  만든 파일이 스왑파일로 작동할 수 있도록 설정을 합니다. v0 옵션은 old 스 타일이고, v1은 new 스타일입니다.

#mkswap -v1 /boot/swapfile 

활성화를 시킵니다.

#swapon /boot/swapfile free명령으로 스왑영역이 늘어난 것을 확인할 수 있습니다.

#free  부팅 시 스왑공간이 활성화되게 하려면 /etc/fstab 파일에 아래 한 줄을 추가 합니다.

/boot/swapfile swap swap defaults  1  1

 

 

▲빨간 표시의 추가를 누른다. 

▲위의 사진처럼 넣어주고 확인을 누른다. 다음을 누른다. 

▲eth0만 선택하고 편집을 누른다 

▲공용을 선택하고 확인을 누른다. 다음을 누른다. 

▲위의 사진처럼 넣어주고 다음을 누른다. <= ocr디스크 설정 

▲위의 사진처럼 넣어주고 다음을 누른다. <= vote 디스크 설정 

▲설치 

▲설치도중 위와 같은 창이 뜨는데 새 터미널을 열어서 root 계정으로 전환하고

node1 - orainstRoot.sh <= 위 창의 1번에 해당

node2 - orainstRoot.sh

node1 - root.sh <= 위 창의 2번에 해당

node2 - root.sh

순서로 실행을 시킨다.

실행 후 아직 확인을 누르면 안된다. 아래의 작업을 하고 확인을 누른다.

node2 - root.sh를 실행하면 마지막 스크립트에서 vip관련 에러가 발생한다. 에러가 발생하면 node2에서 vipca를 실행한다.

 

(node 2 에서)

$ su -
# vipca
vipca를 실행하면 아래 화면이 실행된다. 

▲다음을 누른다. 

eth0만 선택하고 다음을 누른다. 

▲위 사진과 같이 vip관련 내용을 입력하고 다음을 누른다. 

▲완료를 누른다. 

▲설치가 완료되면 위 창이 뜨는데 확인을 누른다. 

▲종료를 누르고 node1에서 확인을 누르고 다음을 눌러 넘어간다 

▲모두 성공이 뜨면 다음을 누른다 

▲종료를 누른다.
===========================================================================================================================
<clusterware 패치>
1. pkg의 Disk1 디렉토리로 이동하여 runInstaller를 실행한다.
$ cd /home/oracle/pkg/Disk1
$ ./runInstaller
./runInstaller를 실행시키면 아래 화면이 실행된다. 

▲다음을 누른다. 

▲clusterware 설치 위에 패치를 덮어씌워야 하므로 clusterware 설치와 같은 경로를 넣어준다.

다음을 누른다. 

▲다음을 누른다 

▲모두 성공함이 뜨면 다음을 누른다. 

▲설치를 누른다. 

설치 종료가 되면 위와 같은 창이 뜨는데 새 터미널을 열어서 root 계정으로 전환하고

node1 - a 스크립트
node1 - b 스크립트
node2 - a 스크립트
node2 - b 스크립트
순서로 실행을 시킨다.
실행을 하고 종료를 누른다.

 

2. 제대로 되었는지 확인한다.
$ crs_stat -t 

▲이렇게 하면 clusterware 설치 & 패치가 완료되었다. 이어서 Oracle 엔진 설치 & 패치를 진행하면 된다. 

by 짱구를꼭말려 2013. 8. 23. 21:39

★★★오라클 10g RAC_rawdevices 설치 - 설치전 작업★★★  

 

 

1. ifconfig로 NAT로 잡힌 eth0과 eth1의 IP를 확인해서 종이에 적어둔다.

 

2. netstat -nr로 Gateway주소를 확인 후 종이에 적어둔다.

 

3. neat명령어로 네트워크 설정창을 열어 eth0과 eth1의 IP를 수동으로 바꿔 1번작업에서 적어둔 IP를 수동 IP에 넣는다.

 

▼4. DNS에서 호스트명과 기본 DNS를 아래 사진과 같이 넣는다. 

5. 설정이 끝나면 네트워크를 재시작해서 적용이 되게 한다.

# /etc/init.d/network restart

 

6. 핑이 가는지 확인한다.
# ping 168.126.63.1

 

▼7. 아래 사진과 같이 불필요한 서비스 데몬을 종료시킨다.

▼8. /etc/hosts파일에 아래 사진의 내용처럼 IP를 추가한다. 중요한것은 아래사진의 빨간 네모 자리의 rac1이름을 꼭 지워줘야 한다.

9. sysctl.conf파일에 아래 사진의 내용을 추가한다.

# vi /etc/sysctl.conf

kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 262144

 

▼10. limits.conf파일에 아래 사진의 내용을 추가한다.
# vi /etc/security/limits.conf

oracle soft nproc 2047
oracle hard nproc16384
oracle soft nofile 1024
oracle hard nofile65536

 

11. login파일에 내용을 추가한다.
# vi /etc/pam.d/login
session required pam_limits.so
12. modprobe.conf파일에 내용을 추가한다.
# vi /etc/modprobe.conf
options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180
13. 시스템 상태를 확인한다. <= 커널기반의 타이머를 사용하여 시스템 태스크 스케쥴러에 발생하는 딜레이를 정기적으로
# modprobe -v hangcheck-timer 점검하는 방식을 사용
14. rc.local파일에 내용을 추가한다.
# vi /etc/rc.local
/sbin/modprobe hangcheck-timer
rdate -s 203.248.240.140
15. 아래 사진의 rpm이 설치되었는지 확인한다.

16. id가 5000인 dba그룹의 oracle 사용자를 만든다.
# groupadd -g 5000 dba
# useradd -g dba oracle
# passwd oracle (비번은 본인이 알아서)

 

17. .bash_profile파일에 내용을 추가한다.
# vi .bash_profile
PATH=$PATH:$HOME/bin:/home/oracle/product/10g/crs/bin

 

▼18. 오라클 계정으로 .bash_profile파일에 아래 사진의 내용을 추가한다.
# su - oracle
# vi .bash_profile

export EDITOR=vi
export LD_ASSUME_KERNEL=2.4.19
export ORACLE_BASE=/home/oracle
export ORA_CRS_HOME=$ORACLE_BASE/product/10g/crs
export ORACLE_HOME=$ORACLE_BASE/product/10g/db
export ORACLE_SID=rac1
export LANG=ko_KR.eucKR
export ORACLE_TERM=xterm
export NLS_LANG=AMERICAN_AMERICA.KO16KSC5601
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib
export PATH=$PATH:$ORACLE_HOME/bin:/$ORA_CRS_HOME/bin
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

 

19. root계정으로 돌아와 추가해줬던 하드의 파티션을 나눠준다. 빨강 화살표는 그냥 엔터치면 된다.
$ exit
# fdisk /dev/sdb

위 사진에서 8e는 LVM을 위한 설정이다.

 

20. 나머지 2개의 하드도 위와 같은 방식으로 파티션을 나눠준다.

 

21. 추가한 하드의 물리적 볼륨을 생성하고 확인한다.
# pvcreate /dev/sdb /dev/sdc /dev/sdd
# pvdisplay

 

22. 볼륨그룹을 생성하고 확인한다.
# vgcreate rac /dev/sdb /dev/sdc /dev/sdd
# vgdisplay

 

23. 볼륨그룹을 oracle에서 사용될 파일로 나눠 생성하고 확인한다.
lvcreate --name ocr1 --size 300 rac && lvcreate --name ocr2 --size 300 rac && lvcreate --name vote1 --size 300 rac && lvcreate --name vote2 --size 300 rac && lvcreate --name vote3 --size 300 rac && lvcreate --name system --size 600 rac && lvcreate --name sysaux --size 300 rac && lvcreate --name undotbs1 --size 200 rac && lvcreate --name undotbs2 --size 200 rac && lvcreate --name users --size 10 rac && lvcreate --name temp --size 100 rac && lvcreate --name control01 --size 100 rac && lvcreate --name control02 --size 100 rac && lvcreate --name control03 --size 100 rac && lvcreate --name redo01_a --size 50 rac && lvcreate --name redo01_b --size 50 rac && lvcreate --name redo02_a --size 50 rac && lvcreate --name redo02_b --size 50 rac && lvcreate --name redo03_a --size 50 rac && lvcreate --name redo03_b --size 50 rac && lvcreate --name redo04_a --size 50 rac && lvcreate --name redo04_b --size 50 rac && lvcreate --name spfile --size 50 rac (복사하세요)
# lvcreate --name ocr1 --size 300 rac
# lvcreate --name ocr2 --size 300 rac
# lvcreate --name vote1 --size 300 rac
# lvcreate --name vote2 --size 300 rac
# lvcreate --name vote3 --size 300 rac
# lvcreate --name system --size 600 rac
# lvcreate --name sysaux --size 300 rac
# lvcreate --name undotbs1 --size 200 rac
# lvcreate --name undotbs2 --size 200 rac
# lvcreate --name users --size 10 rac
# lvcreate --name temp --size 100 rac
# lvcreate --name control01 --size 100 rac
# lvcreate --name control02 --size 100 rac
# lvcreate --name control03 --size 100 rac
# lvcreate --name redo01_a --size 50 rac
# lvcreate --name redo01_b --size 50 rac
# lvcreate --name redo02_a --size 50 rac
# lvcreate --name redo02_b --size 50 rac
# lvcreate --name redo03_a --size 50 rac
# lvcreate --name redo03_b --size 50 rac
# lvcreate --name redo04_a --size 50 rac
# lvcreate --name redo04_b --size 50 rac
# lvcreate --name spfile --size 50 rac
# lvscan

 

24. rawdevices파일에 아래 사진의 내용을 추가한다. <= rawdevice는 OS가 하드디스크 관리를 안하고 어플리케이션이 관리를 한다.
# vi /etc/sysconfig/rawdevices 여기서 어플리케이션은 asm프로그램을 말한다. 여기서 추가내용은 내가 어떤
하드디스크를 rawdevices로 쓰겠다고 rawdevices 정보를 적어준것이다.
이 파일을 커널이 보고 적혀있는 디스크가 rawdevices임을 알고 신경을 안쓴다.

/dev/raw/raw1 /dev/rac/ocr1
/dev/raw/raw2 /dev/rac/ocr2
/dev/raw/raw3 /dev/rac/vote1
/dev/raw/raw4 /dev/rac/vote2
/dev/raw/raw5 /dev/rac/vote3
/dev/raw/raw6 /dev/rac/system
/dev/raw/raw7 /dev/rac/sysaux
/dev/raw/raw8 /dev/rac/undotbs1
/dev/raw/raw9 /dev/rac/undotbs2
/dev/raw/raw10 /dev/rac/users
/dev/raw/raw11 /dev/rac/temp
/dev/raw/raw12 /dev/rac/control01
/dev/raw/raw13 /dev/rac/control02
/dev/raw/raw14 /dev/rac/control03
/dev/raw/raw15 /dev/rac/redo01_a
/dev/raw/raw16 /dev/rac/redo01_b
/dev/raw/raw17 /dev/rac/redo02_a
/dev/raw/raw18 /dev/rac/redo02_b
/dev/raw/raw19 /dev/rac/redo03_a
/dev/raw/raw20 /dev/rac/redo03_b
/dev/raw/raw21 /dev/rac/redo04_a
/dev/raw/raw22 /dev/rac/redo04_b
/dev/raw/raw23 /dev/rac/spfile
이거 그대로 써서 추가해준다.

 


25. rawdevices를 재시작하여 추가한 내용을 적용시킨다.
# /etc/init.d/rawdevices restart

 

26. rawdevices의 권한을 바꿔준다. 113번줄을 수정하고 114번줄에 추가한다. <= asm을 오라클 사용자가 사용하기 때문에 권한을
# vi /etc/udev/permissions.d/50-udev.permissions oracle로 바꿔준다.
112번줄 ram*:root:disk:0660
113번줄 #raw/*:root:disk:0660
114번줄 raw/*:oracle:dba:0660

 

27. rawdevices를 다시 재시작한다.
# /etc/init.d/rawdevices restart

 

28. oracle, dba가 맞는지 퍼미션을 확인한다.
# ls -l /dev/raw

 

29. node1세팅이 완료되었다. 리눅스 종료 후 node2를 세팅한다.
# init 0

 

▼30. rac2 폴더를 생성 후 rac1.vmdk와 rac1.vmx파일을 rac2에 복사한다.

▼31. VMware에 복사한 가상머신을 추가하고 Edit virtual machine settings를 눌러 가상머신 이름을 rac2로 바꾸고 부팅한다.

 

32. 만약 추가한 하드의 저장을 rac1과 같은 폴더에 했다면 하드를 눌렀을때 아래 사진과 같은 창이 뜬다. 이럴경우 추가했던 하드 3개를

아래 remove로 모두 지운다. 그리고 아래의 사진과 같은 방식으로 다시 추가한다.

Add를 누른다.

▲Hard Disk를 선택 후 Next를 누른다.

▲Use an existing virtual disk를 선택하고 Next를 누른다.

▲Independent를 체크하고 Browse를 누른다

▲rac1에 있는 disk1폴더를 선택해서 추가한다. 나머지 하드도 똑같은 방식으로 추가한다.

 

▼33. 부팅을 하면 아래 사진의 창이 뜨는데 I copied it을 눌러야 한다.

파란색 화면에 회색 창이 뜨면 아무키나 눌러준다. 안눌러주면 그냥 지나가 버린다.

네트웍 카드 장치 삭제를 2번 해준다.

 

▲동적 IP주소 자동설정 사용에 체크하고 확인한다.

 

▼34. 부팅이 되면 root계정으로 로그인하고 터미널창에서 neat를 쳐서 수동IP로 설정해준다.
node2(rac2)의 IP는 node1의 hosts파일에 적어놓았던 IP를 넣어준다. node1 IP에 1씩 더해준것.

 

35. DNS에서 호스트명과 기본 DNS를 아래 사진과 같이 넣는다.

 

36. oracle 계정으로 바꿔서 .bash_profile의 ORACLE_SID=2로 수정한다.
# su - oracle
$ vi .bash_profile
export ORACLE_SID = rac2

 

37. 재부팅을 하고 node1도 부팅을 시킨다.
$ exit
# reboot

 

38
. oracle계정으로 로그인하고 _equivalence 설정을 한다. <= 이 작업은 rac1과 rac2가 서로 접속을 하는데 암호를 안묻도록 설정을
하는것이다. 암호가 들어있는 파일을 각 노드에서 서로의 암호를
가지고 있어서 암호를 안물어도 암호 파일을 보고 맞다는것을 안다.
node1, node2모두 실행한다.

▲빨강 화살표 부분은 그냥 엔터를 치고 넘어가면 된다.

 

39.
node1에서만 아래 작업을 실행한다.
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
$ ssh rac2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
         암호치는거 한번 나온다.
$ ssh rac2 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
         암호묻는거 한번 나온다.
$ scp ~/.ssh/authorized_keys rac2:~/.ssh/authorized_keys

 

40. 암호를 묻지 않는지
node1, node2 모두 점검한다. 처음 한번만 암호를 묻는다.
$ ssh rac1 date
$ ssh rac1-priv date
$ ssh rac2 date
$ ssh rac2-priv date

 

▼41. node1의 oracle 계정에 pkg 디렉토리를 만들어 설치에 필요한 clusterware, database, 패치파일을 WinSCP프로그램으로 옮긴다.
node2에는 pkg 디렉토리에10201_clusterware_linux32.zip파일만 옮긴다.

42. pkg디렉토리로 이동하여 압축을 풀어준다. node2의 clusterware압축도 풀어준다.
$ cd pkg
$ unzip 10201_clusterware_linux32.zip
$ unzip 10201_database_linux32.zip
$ unzip p6810189_10204_Linux-x86.zip

 

43. 압축 풀어준 clusterware의 rpm 디렉토리로 이동하여 rpm을 설치한다.
node1, node2 모두 설치한다.
$ su -
# cd /home/oracle/pkg/clusterware/rpm
# export CVUQDISK_GRP=dba
# rpm -Uvh cvuqdisk-1.0.1-1.rpm

 

44. oracle 계정으로 돌아와 clusterware의 cluvfy 디렉토리로 이동하여 아래의 내용을 실행한다. node1만 한다.
# exit
$ cd /home/oracle/pkg/clusterware/cluvfy
$ ./runcluvfy.sh stage -pre crsinst -n rac1,rac2 -verbose <= vip, oinstall, rpm 관련 에러 무시
$ ./runcluvfy.sh stage -post hwos -n rac1,rac2 -verbose <= vip 관련 에러 무시

 

이렇게 하면 설치전 작업을 끝마칠 수 있다. 이어서 바로 clusterware설치를 하면 된다.
by 짱구를꼭말려 2013. 8. 23. 16:46

★★★오라클 10g RAC_rawdevices 설치 - 리눅스 설치★★★

RHEL4-10g Rawdevice

 

1. VMware 세팅

▲Create a New Virtual Machine을 선택한다

 

▲Custom을 선택하고 Next를 누른다.

 

 

▲그대로 Next를 누른다

 

 

▲3번째 OS later를 선택하고 Next를 누른다.

 

▲리눅스 Red Hat Enterprise Linux4를 선택하고 Next를 누른다.

 

▲Name은 rac1으로 Location은 원하는 위치에 자신이 정하고 Next를 누른다.

 

▲그대로 Next를 누른다.

 

▲메모리는 컴퓨터 메모리의 절반정도 주고 Next를 누른다

 

▲두번째 자동으로 IP를 잡아주는 NAT를 선택하고 Next를 누른다.

 

▲그대로 Next를 누른다

 

▲Create a new virtual disk를 선택하고 Next를 누른다.

 

▲그대로 Next를 누른다

 

▲하드는 20GB를 주고 single file을 선택 후 Next를 누른다.

 

▲rac1.vmdk로 고치고 Next를 누른다. (다른이름이어도 상관은 없다.)

 

▲Finish를 누른다.

 

▲Edit virtual machine settings을 누른다.

 

▲Floppy, USB Controller, Sound Card등 필요없는 장치를 아래의 Remove로 제거하고 Add를 누른다.

 

▲Private망을 위한 Network Adapter를 추가하기위해 선택 후 Next를 누른다.

 

▲Host-only를 선택후 Finish를 누른다.

 

▲이번엔 하드를 추가하기 위해 Hard Disk를 선택 후 Next를 누른다.

 

▲Create a new virtual disk를 선택 후 Next를 누른다.

 

▲이번엔 SCSI 밑에 있는 Independent를 체크 한 다음 Next를 누른다.

 

용량은 10GB를 주고 Allocate all disk space now를 꼭 체크해줘야 한다. 체크를 안해주면 데이터베이스 생성 시 에러가 발생한다.

single file을 선택하고 Next를 누른다.

 

▲따로 storage폴더를 만들어 storage폴더를 경로로 하여 디스크 이름을 설정하고 Next를 누른다.

(같은 폴더에 저장하면 뒷부분에서 번거롭지만 작업을 따로 해주면 되는데 실무에서는 서버를 따로 3대를 놓고 하기때문에 같은 환경처럼

따로 폴더를 만들어서 해준다.)

 

위 사진처럼 하드가 추가되면 오른쪽에 Advanced를 누른다.

 

▲Virtual device node를 SCSI 1:0으로 해주고 Independent를 체크한 뒤 OK를 누른다.

 

▲위와 같은 방식으로 나머지 하드 디스크도 추가해 준다.

 

▲3개의 하드를 추가한 뒤 리눅스에 가상디스크를 올리기위해 rac1.vmx를 메모장으로 열어 편집한다.

 

▲빨강으로 표시한 내용을 각 위치에 추가하고 저장한다.

 

▲위 사진의 CD/DVD를 선택하고 Iso Image file에 RHEL4 1번 CD를 삽입하고 OK를 누른다.

Power On을 시켜 부팅한다.

 

▲그냥 엔터를 한번 쳐주면 화면이 넘어간다.

 

▲Skip을 선택하고 엔터를 친다.

 

▲Next를 누른다.

 

▲English를 선택하고 Next를 누른다.

 

▲U.S.English를 선택하고 Next를 누른다.

▲Manually partition with Disk Druid를 선택하고 Next를 누른다.

 

▲위 사진처럼 창이 하나 뜨는데 Yes를 누르고 넘어간다.

 

▲중간에 있는 New를 누른다.

 

▲빨간 표시에 있는 하드중에서 sda만 체크하고 나머지는 다 체크를 없애준다. 그리고 / 5000으로 용량 할당해주고 OK 누른다

 

▲10g 설치 할때 swap 을 1500 으로 하면 교체 용량이 부족 하다면서 어쩌구 저쩌구 나온다

2000 하자

 

▲마지막에 있는 /home의 용량은 빨간표시에 있는 3번째 Fill to maximum allowable size를 선택한다. 나머지 전부를 뜻한다.

 

▲네트워크에서 eth0, eth1 둘다 체크를 하고 manually를 rac1으로 적은 뒤 Next를 누른다.

 

▲방화벽은 No로 선택하고 SElinux도 사용안함 Disabled를 선택한 후 Next를 누른다.

 

▲방화벽을 진짜 사용안할꺼냐는 창이 뜨는데 Proceed를 누르고 넘어간다.

 

▲Korean에 체크를 해주고 위에 기본언어를 English에서 Korean으로 바꿔준 후 Next를 누른다.

 

▲Asia/Seoul을 찾아서 선택하거나 지도에서 한국을 찾아 선택하고 Next를 누른다.

 

▲수동패키지 Customize software packages to be installed를 선택하고 Next를 누른다.

 

▲Applications탭에서 Editors를 체크하고 Graphical Internet도 체크한다

 

▲Server탭에서 Web Server와 Windows File Server의 체크를 풀어준다

 

▲Development탭은 모두 체크를 해준다.

 

▲System탭에 System Tools는 체크를 하고 Printing Support는 체크를 풀어준다.

System Tools 오른쪽에 있는 Details를 누른다.

 

▲오라클 10g에서 요구하는 rpm인 sysstat에 체크를 하고 OK를 누르고 Next로 넘어간다.

 

▲Next를 누른다

 

▲Continue를 누른다. CD2,3,4로 바꿔주면서 설치한다.

 

▲완료되면 Reboot를 누른다.

 

▲다음을 누른다.

 

▲동의를 선택하고 다음을 누른다.

 

▲컴퓨터시간이 잘 맞춰저 있으면 다음을 누른다.

 

▲화면을 좀더 크게 보고싶으면 Configure를 눌러 1024X768을 추가한 뒤 해상도에서 선택하고 다음을 누른다.

 

▲계정을 만들지 말고 3번째를 선택하고 다음을 누른다.

 

▲나중에 완료할 예정을 선택하고 다음을 누른다.

 

▲그냥 다음을 누른다.

 

▲경고창이 하나 뜨는데 계속 진행을 누르고 넘어간다.

▲다음을 누른다.

 

▲다음을 누른다.

 

▲이렇게 하면 RHEL4 설치가 완료되었다. 이어서 설치전 작업을 진행하면 된다

 

 
by 짱구를꼭말려 2013. 8. 23. 12:44
| 1 2 3 4 |