Oracle Block

Oracle Block 개요

- Oracle에서의 최소 작업 단위

- 사용자가 입력한 데이터를 하드디스크에 저장하거나 읽어들 일 때 1건씩 처리하는 구조가 아닌, 가장 작은 단위인 block 단위로 작업

- DB_BLOCK_SIZE 파라미터로 block 사이즈 조절 가능, default8K (BUT, 생성 시 지정하면 바꿀 수 없음)

- create database 할 때 한 번 지정되면 그 값은 database를 재 생성하기 전에는 변경할 수 없다.

- SQL> show parameter db_block_size로 조회

- 2KB부터 4KB,8KB,16KB,32KB가 제공

- 짝수 SIZE 권장

- block 사이즈가 작다면 한 번에 담을 수 있는 데이터양이 작아져 disk I/O가 많아짐

- block 사이즈가 크면 데이터가 작을 경우 공간이 낭비될 수 있고 wait time이 많이 생길 수 있음

- Tablespace 생성 시 block size를 기존과 다르게 설정할 수 있으나 먼저 database buffer cache에도

해당 block 사이즈 만큼 공간을 미리 할당해두어야 설정 가능(권고 X) * memory1:1matching 해야 함 (p.224)

 

Oracle Data Block 상세구조

- 블록헤더(Header) : 일반적인 Block의 정보를 가지고 있습니다.

(Block의 위치, Segment의 형태), 85~100bytes정도

- Table Directory : 클러스터에 있는 테이블에 관한 정보를 가지고 있습니다.

- Row Directory : Block내의 Row관련 정보를 가지고 있습니다. Row마다 2byte

- Free Space : New Row InsertUpdate시 사용 합니다. PCTFREEPCTUSED

의해 결정 됩니다.

* 로우 마이그레이션(ROW MIGRATION) 발생 --> 많은 디스크 I/O 발생

(인접한 공간으로 이주)

- Row Data : 테이블 데이터와 인덱스 데이터를 포함 합니다.

 

 

PCTFREE

 

- 사용 가능한 Block 공간 중에서 데이터 행의 UPDATEblock의 여유 공간이

없어 다른 block에 저장될 것에 대비하여 확보해 놓은 영역

ex) "PCTFREE 20" 으로 설정을 하면, 데이터 블록의 20%를 사용 가능한 빈 영역으로 유지하여 각 블록에 있는 행을 갱신하는데

      사용한다는 의미

- PCTFREE의 기본 값은 10%

- INDEX값은 수정이 자주 발생하지 않으므로 PCTFREE5%정도가 적당

- 이 공간은 데이터가 insert 되지 않고 오로지 update만을 위해 남겨놓은 공간

- PCTFREE값이 도달된 후 블록 내에 남은 공간은 기존의 ROWUpdate되어 공간이 추가로 필요할 때 사용됨 

- 이 공간을 제외한 나머지 공간이 가득 차게 되면 이 block은 더 이상 빈 공간이 없는 Dirty Block 상태로 변경

- PCTFREEPCTUSED의 합이 100을 초과하지 않는 범위 내에서 0에서 99까지 값을 PCTFREE값으로 사용할 수 있음

(PCTFREE+PCTUSED <= 100)

 

1) PCTFREE가 적을 경우

- 기존 테이블 행 갱신에 의한 확장을 위해 적은 공간을 확보

- update가 빈번히 일어나는 경우 Row Migration이 자주 발생

- 많은 row가 한 block에 입력 가능

- 수정이 적은 세그먼트에 적합

 

2) PCTFREE가 클 경우

- 블록 당 적은 row가 입력, 즉 같은 row를 입력하기 위해서 많은 block이 필요

- update시 다른 block으로 이동할 필요가 없으므로 수정 수행 속도가 증가

- 자주 수정되는 세그먼트에 적합

 

create table pct_test1

(a number, b varchar2(10));

 

create table pct_test2

(a number, b varchar2(10))

PCTFREE 50;

 

--테이블 별 storage 옵션 확인

select owner, table_name, pct_free, pct_used, num_rows,blocks,chain_cnt

from dba_tables

where table_name like 'PCT_TEST%';

 

block내 빈 공간을 관리하는 과정

- 비어있는 block의 명단은 Free list에 다 기록되고, 빈 공간이 없는 blockDirty list에 기록되는데 데이터 1건 지울 때 마다

Free listDirty list를 업데이트 하는 경우 부하가 매우 큼

- block에 있는 row가 삭제되어서 사용량이 줄어들어도 즉시 이 block을 재사용하지 않고 특정 양이 빌 때까지 기다렸다 재사용 함

- 지워진 후 남은 용량이 얼마가 되어야 Free block이 되는지를 결정하는 파라미터가 PCTUSED

 

PCTUSED

 

- 계속해서 데이터가 지워져서 빈 공간이 생길 경우 Dirty block에서 Free block으로 변경되는 기준을 의미

- PCTUSED=40 : 데이터 블록의 사용영역이 40%보다 적어지지 않으면 새로운 행을 INSERT할 수 없음(PCTUSED의 기본 값은 40%)

- ASSM(Automatic Segment Space Management)일 경우 사용되지 않음 (default)

 

1) PCTUSED값이 적을 경우

- 블록이 재사용되는 일이 적어질 수 있으므로 처리 비용이 감소

- 데이터베이스에서 사용되지 않은 공간이 증가

2) PCTUSED값이 클 경우

- 블록이 재사용되는 일이 많아질 수 있으므로 처리 비용이 증가

- 공간 사용도를 향상

 

 

PCTFREE = 20 / PCTUSED = 40 일 경우

 

Row Chaining

- Row ChainingDB_BLOCK_SIZE보다 너무 큰 데이터가 들어왔을 경우, 혹은 남아 있는 block size보다 큰 데이터가

들어올 경우 인접한 다른 블록까지 데이터가 쓰여지는 것

- 이 데이터 블록은 원래 블록과 연결 되어짐

- Row Chaining은 블록이 하나의 I/O 작업과 동일한 양을 수행하기 위해 두 개의 I/O를 사용해야 하므로 성능상의 부하를 줌

- Row Chaining 현상을 줄이기 위해서는 block size를 크게 생성하는 것이 좋음

 

Row Migration

- UPDATErow에 저장된 Data의 양을 증가시켜 더 이상 그 블록에 저장될 수 없을 경우 새로운 Block으로

데이터를 완전히 옮기는데 이를 Row Migration 이라고 함

- Update시 공간이 부족할 때 발생하며, Data 행을 완전히 채울 수 있는 새로운 Block에 저장됨

- 원래 block에 신규 block의 포인터 주소를 남겨두어 이전 block으로 찾아오는 access도 신규 block을 찾아갈 수 있도록 함

- PCTFREE을 많이 주거나 reorg 등의 작업을 통해 줄일 수 있음 ( 향후 )

* PCTFREE를 그대로 가져 갈 것이라면 해당 테이블스페이스에 move,

PCTFREE값을 바꾸려면 TableSpace를 새로 생성 후 move

 

-- PCT_FREE_TEST를 위한 TEST TABLE 생성

-- PCTFREE 10(DEFAULT)

create table pct_test1

(a number, b varchar2(10));

 

-- PCTFREE 50으로 생성

create table pct_test2

(a number, b varchar2(10))

PCTFREE 50;

 

-- tablestorage 옵션 확인

select owner, table_name, pct_free, pct_used, num_rows, -- 실제 data 건수

blocks, -- 실제 block

chain_cnt, -- row_chain

last_analyzed -- 마지막 통계정보 갱신 날짜

from dba_tables

where 1=1

and table_name like 'PCT_TEST%' ;

 

-- 대용량 data insert

begin for i in 1..100000 loop

insert

into pct_test1

values(i,'AAAA');

end loop;

commit;

end;

/

 

begin for i in 1..100000 loop

insert

into pct_test2

values(i,'AAAA');

end loop;

commit;

end;

/

 

 

-- 통계정보 갱신 후 block수 재 확인

exec dbms_stats.gather_table_stats('SCOTT','PCT_TEST1');

exec dbms_stats.gather_table_stats('SCOTT','PCT_TEST2');

 

-- 대용량의 update 발생

update pct_test1

set b='AAAAAAAA';

commit;

 

update pct_test2

set b='AAAAAAAA';

commit;

 

-- 통계정보 갱신 후 update 후 달라지는 block 수 확인

exec dbms_stats.gather_table_stats('SCOTT','PCT_TEST1');

exec dbms_stats.gather_table_stats('SCOTT','PCT_TEST2');

 

-- 결론

-- pctfree10%인 경우 대량 update 발생 후 block 수가 현저히 증가

-- pctfree50%인 경우 updatepctfree로 할당한 공간에서

-- 충분히 수행했기때문에 block수가 그대로인 것을 확인할 수 있음

 

Extent

- Extent는 일정한 수의 연속된 oracle block

- 일정한 수라는 의미는 사용자가 지정한 값을 의미

- create table 옵션에 INITIAL EXTENT로 설정

- INITIAL EXTENT = 64K이면 DB_BLOCK_SIZE=8K일 경우 연속해서 8개의 block1개의 extent를 구성

- 10g 버전부터는 ASSM(Automatic Segment Space Management)이 기본이며, 이때 extent size64K

- Extent 값이 크면 대량 insert에 유용하며, 블록데이터들을 인접하게 생성할 수 있음 ( But, 공간을 많이 차지함 )

- create table로 생성시 64k로 생성됐으나 10g부터 default creation이 적용 되 0k로 생성됨

Extent 특징

- Object는 현재 할당된 모든 Extent가 이미 채워진 경우에만 새로운 Extent를 할당

- 새로운 ExtentNext Extent 크기만큼 할당(10g 이상부터는 64KB가 기본)

- Next Extent = Next * (1+Pctincrease/100)

- Free Extent를 할당하고 관리하는 방식은 DMTLMT로 나뉘게 된다

DMT(DINCTIONARY MANAGED TABLESPACE)

- 전통적인 방법으로 STORAGE절을 사용하여 EXTENT를 할당

- Oracle 9i 버전 이후 DICTIONARY MANAGED 방식의 사용을 권장하지 않음

(LOCALLY MANAGED TABLESPACE)

- CREATE TABLE절에 STORAGE를 모두 무시

- TABLESPACE 정한 UNIFORM SIZE 대로 EXTENT 할당

- Segment를 관리하는 방식에 따라 FLMASSM으로 나뉨

Extent 사용 이유

- 해당 테이블이 사용할 extent를 미리 할당함으로써 data file내 곳곳에 분산되어 저장되는 것을 피하기 위함

- 동일 tabledata가 곳곳의 block에 저장되어 있다면 이를 찾는 시간이 오래 걸려 전체적인 성능 저하 발생

 

create tablespace extent1

datafile '/home/oracle/oradata/testdb/extent01.dbf' SIZE 50M

EXTENT MANAGEMENT LOCAL -- 생략시 default

UNIFORM SIZE 1M; ====> LOCAL 이므로 테이블 생성시 STORAGE를 무시함

 

create table extent_test (a number, b varchar2(10)) tablespace extent1;

create table extent_test2 (a number, b varchar2(10)) tablespace extent1 storage ( INITIAL 64K NEXT 1M );

 

-- extent 할당 확인

select tablespace_name ,

segment_name ,

extent_id,

blocks,

bytes/1024 "extent_size(KB)"

from dba_extents

where segment_name like 'EXTENT%';

 

-- table storage 옵션 확인(PCT_FREE, PCT_USED)

select table_name, initial_extent/1024 "initial_extent(KB)",next_extent/1024 "next_extent(KB)"

from dba_tables

where table_name like 'EXTENT%';

   

===> LMT일땐 next_extent의 의미는 무의미 ( dba_tables View만 보고 판단 X )

 

-- tablereorg *CTASreorg

alter table emp move tablespace example;

 

-- table reorgindex unusable 상태로 변경되므로 rebuild 필요 ==> Rowid구조가 바뀌므로

select 'alter index '||owner||'.'||index_name||' rebuild;'

from dba_indexes

where status='UNUSABLE';

-- 결론

-- LMT 환경에서는 uniform size로 지정한 크기만큼

-- extent가 할당되고 따라서, 생성한 test12extent size가 똑같다

-- 또한 initial extent sizenext extent size가 동일하게 할당된다

 

FLM(Free List Management)

- Oracle 8i까지의 Segment 관리 기법

- SegmentFree Block들은 항상 freelist를 통해 관리 됨

- PCTUSED 아래로 채워진 block들이 freelist로 연결되어 있어서, insert가 필요하면

freelistsegment header에서부터 뒤지면서 블록내의 빈 공간에 insert를 하게 됨

- Undo, Redo 같은 파일들은 제외

 

ASSM(Automatic Segment Space Management)

- Oracle 9i부터는 PCTFREE, PCTUSED를 직접 지정하는 기존의 FLM 방법 대신 자동으로 관리하는 방법을 권장

- segment에 할당된 spacefreelist 대신 bitmap으로 관리

- ASSM 방법을 이용하여 space를 관리하게 되면 freelist를 타고 다음다음 blockaccess하는 대신 Tree구조의

bitmap 정보를 참고로 적당한 block들을 선택하기 때문에 space에 관한 성능이 훨씬 좋아짐

- ASSM 방식을 이용하려면 반드시 LOCALLY MANAGED TABLESPACE여야 함

 

DMT - tableextent 별도 관리

- extent size(initial, next) 다르게 지정 가능

LMT - table 별 동일 extent size

- initial,next extent size 동일 (FLM : PCTUSED O , ASSM : PCTUSED X)

 

SEGMENT

- Oracle Object 중에서 독자적인 저장 공간을 가지는 것

- 데이터가 증가되면 실제 증가되는 영역

- Table,Index,Undo,Temp 등이 대표적인 Segment의 종류

- 여러 개의 Extent로 구성

-- nologging 테스트 시나리오

-- nologging_test1 : 일반테이블, 아무 옵션 없이 insert

-- nologging_test2 : table nologging 옵션

-- nologging_test3 : table은 그대로, insert append

 

create table nologging_test5

tablespace haksa

as

select * from nologging_test3;

 

create table nologging_test6

tablespace haksa

nologging

as

select * from nologging_test1;

 

-- data insert

begin for i in 1..5000000 loop

insert

into nologging_test1

values(i,'AAAA');

end loop;

commit;

end;

/

 

truncate table nologging_test2;

 

begin for i in 1..5000000 loop

insert

into nologging_test2

values(i,'AAAA');

end loop;

commit;

end;

/

 

truncate table nologging_test3

 

begin for i in 1..5000000 loop

insert /*+ append */

into nologging_test3

values(i,'AAAA');

end loop;

commit;

end;

/

 

begin for i in 1..5000000 loop

insert /*+ append */

into nologging_test4

values(i,'AAAA');

end loop;

commit;

end;

/

 

-- 날짜별 redo log 사용량

select to_char(first_time, 'YYYY-MM-DD') "Date"

, count(*)

from v$log_history

group by to_char(first_time

, 'YYYY-MM-DD')

order by 1;

-- 실제 redo log 사용 현황

SELECT name,

value

FROM v$sysstat

WHERE name in ('redo size',

'redo writes' ,

'redo blocks written');

-- 결론

-- nologging일 경우에는 변경된 내용을 redo, undo에 쌓지 않아서 빠르다.

-- 실제 nologging이 적용되려면 CTAS, create index여야 한다

-- 일반 itas일 경우에는 nologging의 효력이 거의 없다

-- 특히 redo writes보다 redo blocks written의 차이가 더 큰 이유는

-- nologging일 경우 실제 redo buffer에 기록되는 것 보다 --> 실제 버퍼에는 입력하나 리두 로그 파일엔 내리지 않음

-- redo log file에 기록을 훨씬 덜 하게 하면서 성능 상 좋아지기 때문

-- synonym test

select * from dba_tables

where table_name like '%EXTENT_TEST%'

 

SELECT * FROM DBA_INDEXES

WHERE 1=1

-- AND TABLE_NAME='TEMP_TEST'

AND INDEX_NAME='TEMP_TEST_IND'

 

create or replace public synonym EXTENT_TEST for system.EXTENT_TEST;

 

drop table EXTENT_TEST;

 

select * from dba_synonyms

where SYNONYM_NAME='EXTENT_TEST'

 

select * from EXTENT_TEST;

 

create table EXTENT_TEST

(a number, b varchar2(10));

 

-- 결론

-- 테이블(EXTENT_TEST)을 삭제했다가 같은 이름의 테이블을 재생성해도

-- 이미 설정해둔 SYNONYM은 사라지지 않고,

-- 새로 생성된 같은이름의 테이블에 적용된다

-- 테이블 삭제 후 시노님이 그대로 있을 경우에 테이블 조회 시

-- table does not exist error가 아닌 loop synonym error 발생

-- -> 테이블 삭제 후 시노님도 함께 삭제 필요!

 

'Study Note > Database' 카테고리의 다른 글

DBMS JOB & Scheduler  (0) 2016.02.02
User 관리하기  (0) 2016.02.02
Tablespace & Datafiles  (0) 2016.02.02
Redo Log files  (0) 2016.02.02
SQL 문장의 실행 원리 & 백그라운드프로세스 & Startup & Shutdown  (0) 2016.01.27

Tablespace & Datafiles

- 오라클은 데이터를 저장하고 작업할 때 메모리에 논리적으로는 Tablespace라는 공간을 만들어서 작업하며, 물리적으로는 Data File을 만들어서 저장

- 사용자가 SQL을 수행하면 해당데이터는 반드시 메모리에 있는 Tablespace에 존재해야 한다.

- 메모리에 존재하지 않을 경우 Server Process는 데이터가 저장되어있는 Data File에 가서 해당 데이터가 있는 Block을 찾아서

   Tablespace로 가져온 후  사용자가 원하는 데이터를 전달

- Oracle에서는 Database Buffer cacheTablespace를 생성하며 사용하는 메모리 공간이 클수록 일반적으로 수행속도가 빨라짐

 

1. Tablespace의 종류 및 특징

1) SYSTEM Tablespace

- Data Dictionary들이 저장되어있음

- SYS 계정의 소유 Tablespace이지만 SYS 사용자도 이 테이블의 내용을 변경할 수 없음

- System table space 사이즈가 100%이면 어떤 오브젝트도 등록 불가능

- Data Dictionary 테이블 개수 조회

SQL> select count(*) from dictionary;

- SYSTEM Tablespace가 풀 차면 Auto extendon 되어 있다면 자동으로 공간이 늘어남

 

□  Data Dictionary

오라클 서버의 모든 정보를 저장하고 있는 아주 중요한 테이블이나 뷰

 

Data Dictionary에 있는 정보

1) 데이터베이스의 논리적인 구조와 물리적인 구조정보

2) 객체의 정의와 공간 활용 정보

3) 제약조건에 관련된 정보

4) 사용자에 관련된 정보

5) Role, Privilege 등에 관련된 정보

6) 감사 및 보안에 관련된 정보

 

Data DictionaryBase TableData Dictionary View로 나눔

- Base Table : 데이터베이스를 생성할 때 생성되는 테이블로 dictionary의 원본 데이터가 존재

- Data Dictionary View : dbcadatabase 생성 시 자동생성 되지만,

create database로 수동 생성 경우 catalog.sql을 수행해야 생성됨

- Base Table의 내용을 직접 보지 못하도록 Data Dictionary View를 제공해 주는 것

- Data Dictionary View는 다시 Static DictionaryDynamic Dictionary로 나눔

 

Static Dictionary

- 수동으로 업데이트를 해야 정보가 갱신

- 인스턴스가 OPEN 되었을 경우 조회가능

- USER_XXX, ALL_XXX, DBA_XXX 뷰들

 

Dynamic Performance View

- 실시간으로 변경되는 내용을 볼 수 있는 뷰

- 사용자가 조회할 경우 그 시점의 Control File 이나 메모리에서 데이터를 가져와 보여준다

- v$로 시작되며, DatabaseNomount 상태일 때부터 조회가능

 

2) SYSAUX Tablespace

- 주로 오라클 서버의 성능 튜닝을 위한 데이터들이 저장 되어 있음

- 9i 버전까지는 튜닝관련 Dictionary들이 SYSTEM Tablespace에 존재

- 10g버전부터 성능 튜닝과 관련된 Dictionary들이 이곳에 별도로 저장

- 10g에 새로 등장한 자동튜닝 기능들 AWR, ADDM, ASH등이 이곳의 정보를 사용

 

3) 일반 Tablespace

- 일반적으로 많이 사용되는 Tablespace

- 관리자가 필요에 의해 만드는 Tablespace

 

TableSpace 실습

CREATE TABLESPACE haksa

datafile '/oracle11/oracle/oradata/testdb/haksa01.dbf' size 1M(autoextend on);

* autoextend on : 옵션 추가시 공간이 차면 자동으로 사이즈를 늘려줌

 

 

* 이건 segment로 조회 시 안 나옴 왜냐면 빈껍데기는 데이터용량 할당이 안 되기 때문에

다음 block에서 이유 자세히 배움

create table iphak2 (stduno number)

tablespace haksa; -- scott 계정에서

 

-- 대량의 데이터 insert

 

begin

for i in 1..50000 loop

insert into iphak values(i);

end loop

;

commit;

end;

/

 

select count(*) from iphak;

***************** Datafile이 가득 차서 더 이상 insert가 안될 때 **************************

1) 테이블스페이스에 Datafile 추가 -> 디스크 추가

alter tablespace haksa

add datafile '/oracle11/oracle/oradata/testdb/haksa02.dbf' size 20M;

--> 테이블 스페이스에 datafile을 추가함으로 디스크를 늘려줌

 

2) 테이블스페이스의 기존 Datafile 리사이즈

alter database datafile '/oracle11/oracle/oradata/testdb/haksa01.dbf'

resize 20M;

--> datafile 리사이즈

 

3) Autoextend 설정을 on 으로 변경

alter database datafile '/oracle11/oracle/oradata/testdb/haksa2_01.dbf'

autoextend on;

--SELECT * FROM DBA_DATA_FILES; 조회시 autoextensible yes로 바뀐거 확인

======> 파일 추가시 자동으로 사이즈가 늘어남

 

select file_name, tablespace_name, bytes/1024/1024 MB

from dba_data_files;

Tablespace Offline

- 더 이상 해당 Tablespace에 접근하지 않겠다는 의미로 읽기도 쓰기도 되지 않는 상태

- Tablespace의 위치 이동, 장애 복구 시 주로 사용

- Normal, Temporary, Immediate Mode 존재

1) Normal Mode

- 가장 일반적인 offline 방법

- Tablespace가 정상일 경우만 가능

- alter tablespace tablespace_name offline;

2) Temporary Mode

- offline 시키고자 하는 TablespaceData file에 하나라도 이상이 생기게 될 경우 수행

- alter tablespace tablespace_name offline temporary;

3) Immediate Mode

- Data file에 장애가 나서 데이터를 내려쓰지 못하는 상황에서 offline을 해야 하는 경우

- 반드시 archive log mode일 경우에만 사용

- 나중에 online시 복구하라고 메시지 나옴

- alter tablespace haksa offline immediate;

 

--haksa테이블 스페이스 offline

alter tablespace haksa offline;

 

--scn 정보 확인

select a.file#

,a.ts#

,b.name

,a.status

,a.checkpoint_change#

from v$datafile a

,v$tablespace b

where a.ts# = b.ts#;

 

 

--haksa테이블 스페이스 online

alter tablespace haksa online;

 

 ----> 테이블 스페이스 off,online 작업 후에는 여유 있다면 checkpoint 갱신 --alter system checkpoint;

-- 정상적인 오프라인 후 온라인 시킬 시 안된다면 recover 적용

 

Data File Offline

- Data File 단위로도 offline이 가능

- archive mode 경우

  : alter database datafile '.dbf 경로' offline;

- No archive mode 일 경우에는 offline drop

  : alter database datafile 'dbf 경로' offline drop;

- Data file offlineonline 전에 recover 필요

- Data fileTablespace에 여러 개 존재하므로 Data File Offline은 비효율

 

alter database

datafile '/oracle11/oracle/oradata/testdb/haksa01.dbf'

offline; -- no archive mode가 아닐 때 하면 에러남

 

alter database

datafile '/oracle11/oracle/oradata/testdb/haksa01.dbf'

offline drop;

 

--scn 정보 확인

select a.file#

,a.ts#

,b.name

,a.status

,a.checkpoint_change#

from v$datafile a

,v$tablespace b

where a.ts# = b.ts#; 

 

alter tablespace haksa offline temporary;

 

alter tablespace haksa online;

--> dbf 파일 자체를 오프라인했기 때문에 recovery 작업을 해야 함

 

<sysdba> recover tablespace haksa;

 

Data File Rename ( = 파일 위치 옮기는 것 )

- 특정 디스크에 있는 데이터 파일들의 용량이 점점 증가하여 다른 더 큰 용량의 디스크를 설치 한 후 Data file을 이동 시 주로 사용

- Datafile이 사용 중일 때는 절대로 이동시키거나 복사하면 안 된다.

- TablespaceOffline 하거나, Shutdown 한 후 작업해야 함

- 일반 TablespaceOffline후 작업

- Offline이 불가능한 SYSTEM, UNDO, Default Temp TablespaceShutdown 후 작업 가능

 

일반 Tablespace Rename 절차

1) 해당 Tablespace Offline

alter tablespace haksa offline; <ORANGE>

 

2) Datafile 물리적 rename(mv보다 cp로 하는 것이 안전)

cp /oracle11/oracle/oradata/testdb/haksa01.dbf /home/oracle/oradata/testdb/haksa01.dbf <XShell>

 

3) Control file 정보 변경

--controlfile 상의 datafile rename

alter tablespace haksa

rename datafile '/oracle11/oracle/oradata/testdb/haksa01.dbf'

to '/home/oracle/oradata/testdb/haksa01.dbf';

 

alter tablespace haksa

rename datafile '/oracle11/oracle/oradata/testdb/haksa02.dbf'

to '/home/oracle/oradata/testdb/haksa02.dbf';

 

4) 해당 Tablespace Online

alter tablespace haksa online;

alter system checkpoint;

 

SYSTEM Tablespace Rename 절차

1) shutdown

2) Startup mount

3) Data file 물리적 rename

cp /oracle11/oracle/oradata/testdb/system01.dbf /home/oracle/oradata/testdb/system01.dbf <XShell>

4) Control file 정보 변경

alter database rename file '/oracle11/oracle/oradata/testdb/system01.dbf' to '/home/oracle/oradata/testdb/system01.dbf';

5) Open

select * from dba_data_files where tablespace_name='SYSTEM';

 

 

실습 : 리두 로그 파일 이동

--목적

--groupmember/oracle11 -> /home 영역으로 이동

--group/home영역에 member 생성

--리두 로그 확인

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#;

--로그 파일 확인

select * from v$logfile;

 

SQL> shutdown immediate

SQL> startup mount

--cp

cp /oracle11/oracle/oradata/testdb/redo01.log /home/oracle/oradata/testdb/redo01_b.log

cp /oracle11/oracle/oradata/testdb/redo02.log /home/oracle/oradata/testdb/redo02_b.log 

 

cp /oracle11/oracle/oradata/testdb/redo03.log /home/oracle/oradata/testdb/redo03_b.log

--control파일 변경

alter database rename file '/oracle11/oracle/oradata/testdb/redo01.log' to '/home/oracle/oradata/testdb/redo01_b.log';

alter database rename file '/oracle11/oracle/oradata/testdb/redo02.log' to '/home/oracle/oradata/testdb/redo02_b.log'; 

 

alter database rename file '/oracle11/oracle/oradata/testdb/redo03.log' to '/home/oracle/oradata/testdb/redo03_b.log';

-- member 추가

alter database add logfile member

'/home/oracle/oradata/testdb/redo1_2.log' to group 1,

'/home/oracle/oradata/testdb/redo2_2.log' to group 2,

'/home/oracle/oradata/testdb/redo3_2.log' to group 3;

 

--member 확인

select member from v$logfile;

 

Tablespace 삭제

- drop tablespace tablespace_name;

- TablespaceTable이 하나라도 있으면 삭제되지 않는다

- drop tablespace tablespace_name including contents and datafiles; 로 삭제 가능

- ASM이 아니라면 물리적으로도 data file 삭제 필요

 

Undo Tablespace

- DML 작업 수행 시 원본 데이터(Undo data)를 저장하는 장소

- Undo Data를 저장하는 실질적 공간을 Undo Segment라 하고 이 Segment를 저장하는 TablespaceUndo Tablespace

- 기본적으로 하나의 세션 당 하나의 Undo segment를 할당

- Undo Tablespace에는 Undo Data 외의 다른 데이터는 저장될 수 없다

- 사용자가 관여하거나 수정할 수 없고 Oracle Server Process가 직접관리

- Undo TablespaceInstance당 여러 개가 존재할 수 있으나, 사용되는 것은 한번에 1개뿐

- 관리방법으로는 자동 모드와 수동모드가 있으며, Default는 자동모드

- undo_management= auto | manual 로 관리모드 변경 가능하지만 DB 재기동 필요

- Segment의 개수를 수동으로 관리하는 수동모드와는 달리 자동모드에서는 자동적으로 Segment 할당을 관리, 새로운 Segment를 생성

Undo Tablespace 사용 목적

1) Transaction Rollback : 최종 commit 하지 않고 Rollback 하고자 할 때 Undo 데이터를 이용하여 과거 이미지 전달

2) Transaction Recovery (instance Recoveryrollback 단계)

: Instance Crash 발생 후 Redo를 이용해 Roll forward 단계가 완료되면 최종 Commit 되지 않은 변경사항까지

모두 복구할 때 쓰임

3) Read Consistency : 읽기 일관성을 위해 사용

 

 

*** selectbefore이미지만 조회하는데 undo segment에 할당된 before 이미지가 사라지게되면 -> select 절은 조회자료가 사라져

 

Rollback

Undo Segment 할당원리

1. 현재 아래와 같이 4개의 Segment 할당되어 4개의 사용자가 사용 중

A

B

C

D

2. 새로운 사용자 EDML 수행

3. EServer ProcessUndo Segment 할당을 위해 기존 Segment중에 재사용 할 것이 있는지 찾음

새로운 세션의 DML이 발생할 때마다 신규로 Undo Segment를 할당 받지 않음

기존 SegmentCommit이나 Rollback이 되면 재사용 가능한 상태가 되고

즉시 Segment의 내용이 flush 되는 것이 아니고 재사용 되면서 flush

4. A가 그 시점에 Commit 수행

5. EA가 쓰고 있던 Segment를 재사용

 

E

B

C

D

 

6. 새로운 사용자 F가 접속해 DML 수행

7. 아무도 Commit이나 Rollback을 하지 않음

E

B

C

D

F

8. F는 새로운 Segment를 할당 받음

9. 계속해서 새로운 Segment를 할당 받다가 Datafile의 허용범위까지 늘어나면

하나의 Segment2개 세션 이상의 Undo Data를 함께 기록

10. 그 이후에도 공간이 없으면 해당 트랜잭션은 에러 발생 -> Commit되지 않은 모든 데이터들은 Rollback

 

Undo Segment 특징

- Commit을 수행해도 Undo Segment안에 Undo Data는 지워지지 않고 남아있기 때문에 해당 Data file 사이즈를 줄일 수는 없음

- Commit 수행 시 다른 서버 프로세스가 덮어 쓸 수 있게 해주는 것일 뿐 Undo Segment 안의 자료를 지우는 것은 아님

- Undo Tablespace 크기가 비정상적으로 작을 경우에는 관리자가 다른 큰 undo Tablespace를 신규로 만들고,

Undo Tablespace를 신규 Undo Tablespace로 변경시킨 후 기존 Undo Tablespace를 삭제해 주어야 함

 

Undo 관련 주요 파라미터

1. UNDO_RETENTION(초 단위)

- COMMIT 수행 후에도 해당 UNDO SEGMENT 내의 데이터를 다른 서버 프로세스가 덮어 쓰지 못하도록 막아주는 시간

- 그러나, Undo segment 여분이 있을 경우에만 적용되며, 만약 모든 Undo Segment가 사용 중일 경우에는 적용되지 않고

Undo Segment가 재사용되어 진다.

- 관련 에러 : Snap shot too old

* Ora-01555 : Snap shot too old

- 사용자 A : 1시간 정도 수행되는 특정 데이터의 집계작업을 수행 중

- 사용자 B : 사용자 A가 집계중인 데이터를 update 한 후 commit할 경우

- 사용자 A : 사용자 B가 변경전의 데이터를 undo Segment에서 찾아서 집계하게 됨

- 만약 BCommit 한 후 사용자 C가 사용자 BUndo Segment를 덮어 썼다면 사용자 A는 집계 쿼리를

완성할 수 없어 에러 발생

- 이때 발생하는 에러가 Snap shot too old

2. UNDO_RETENTION_GUARANTEE

- Undo_retention으로 설정된 값 만큼 Segment가 재사용 되지 않도록 보장해주는 파라미터

- Undo Segment가 부족하면 undo retention가 설정되어 있더라도 무시하고 재사용하는데 이를 재사용되지 않도록 보장

- commit을 수행해도 특정 기간 동안 Undo Segment를 재사용하지 않기 때문에 Undo Tablespace가 커짐

- default : NOGUARANTEE

- alter tablespace undotbs1 retention guarantee;

 

Undo 사용 현황 조회하기

1번 터미널

SQL > update emp set sal=5000 where empno=7902;

 

undo 사용량(record, block) 조회

SQL > select a.sid, a.serial#, a.username, b.used_urec, b.used_ublk

from v$session a, v$transaction b

where a.saddr = b.ses_addr;

 

각 세션 별로 사용 중인 Undo Segment 확인하기

SQL > select s.sid, s.serial#, s.username, r.name "UNDO SEG",

s2.bytes/1024/1024 "UNDO SEG SIZE(MB)"

from v$session s, v$transaction t, v$rollname r, dba_segments s2

where s.taddr=t.addr

and t.xidusn=r.usn

and r.name=s2.segment_name;

***deleteupdate보다 undo사이즈를 많이 잡는 이유 : update는 행을 지정해서 하지만 delete는 포함 행 모두를 undo segment에 저장

 

-- undo_retention에 의해 expired(undo_retention이 지나서 재사용 가능 공간)된 영역과

-- unexpired(아직 undo_retention이 지나지 않은)된 영역

-- active(실제 사용 중)인 영역

-- free(아직 할당받지 않은) 영역

select tablespace_name,

status,

sum(bytes)

from dba_undo_extents

group by tablespace_name,

status

order by 1;

 

-- 새로운 undo영역 생성 후 할당

create undo tablespace undo01

datafile '/oracle11/oracle/oradata/testdb/undo01.dbf'

size 100M;

select BYTES/1024/1024

from dba_data_files

where tablespace_name like '%UNDO%';

select * from dba_data_files;

alter system set undo_tablespace=undo01;

---> 신규 세션들에 대해서는 undo01에서 작업하고 기존은 그 스페이스에서 계속 작업함

 

drop tablespace UNDOTBS1; -- ACTIVE를 물고있으면 삭제가 안됨! 먼저 ACTIVE인지 확인하고 삭제진행

 

TEMP Tablespace

- Sort Operation(PGA영역) 시에 임시로 사용됨

- 영구 테이블 스페이스로 변경 안 됨

- 성능을 위해 사용자 별로 1개씩 할당 권장

- default temporary tablespace 는 삭제 안 됨 --> 다른 temp tablespace 생성 후 default로 변경 후 삭제

 

--TEMP TableSpace 생성

create temporary tablespace temp2

tempfile '/oracle11/oracle/oradata/testdb/temp02.dbf' size 50M;

select * from dba_data_files; *dbf파일들을 모아 놓은 뷰

select FILE_NAME, BYTES/1204/1024 from dba_temp_files; *temp dbf파일들을 모아 놓은 뷰

select sum(bytes)/1024/1024/1024

from dba_segments

where 1=1

and SEGMENT_NAME like 'TEMP%';

select * from dba_users;

alter database default temporary tablespace temp2;

create temporary tablespace temp3

tempfile '/oracle11/oracle/oradata/testdb/temp03.dbf' size 50M;

 

alter user hr temporary tablespace temp3;

'Study Note > Database' 카테고리의 다른 글

User 관리하기  (0) 2016.02.02
Oracle Block  (0) 2016.02.02
Redo Log files  (0) 2016.02.02
SQL 문장의 실행 원리 & 백그라운드프로세스 & Startup & Shutdown  (0) 2016.01.27
Oracle Architecture  (0) 2016.01.27

Redo Log files

- 오라클 서버는 데이터가 변경될 경우 장애를 대비해 변경되기 전의 내용과 변경된 후의 내용을 기록해 둠

- 기록되는 장소 중 메모리는 Redo Log Buffer

- 기록되는 장소 중 파일은 Redo Log File

 

1. Redo Log 생성 원리

· Write Log Ahead

  - 데이터를 변경하기 전에 Redo Log에 먼저 기록 후 데이터를 변경 (LGWR 작동 후 DBWR 작동)

· Log Force at commit

  - 사용자로부터 Commit 요청이 들어오면 관련된 모든 Redo Recode들을 redo Log file에 저장한 후 Commit을 완료

  - 대량의 데이터 변경 후 commit이 한꺼번에 수행 시 성능이슈(부하가 걸림)

 

STEP1)

  · 사용자가 특정 데이터 변경을 요청하는 쿼리를 수행하면, 해당 SQL을 받은 서버프로세스는 원하는 BlockDB Buffer cache있는지 확인,

   없는 경우 Data File에서 읽어와 메모리에 올림

  · 해당 Block을 다른 사람이 바꿀 수 없도록 Lock을 설정한 후 PGA Redo Change Vector 생성

  · Redo Change Vector : 세션에 대한 모든 변경사항을 저장하는 PGA 영역

STEP2)

  · 서버프로세스는 PGA Change Vector를 생성한 후 Redo Log Buffer에 복사하기 위해 필요한 용량을 계산

  · PGA에 생성된 Change Vectorredo log buffer에 복사하기 위해 Redo copy Latch를 획득해야 함

  · Redo copy latchChange Vector가 모두 Redo Log buffer에 기록될 때까지 계속 유지됨

  · Redo copy latch는 여러 개가 존재하며 기본 값은 CPU개수 * 2 (_log_simultaneous_copies로 변경가능)

STEP3)

  · Redo Copy Latch를 확보한 서버 프로세스는 Redo Log buffer에 내용을 기록하기 위해 Redo Allocation Latch를 확보

  · 8i버전까지는 Redo Allocation Latch1개 밖에 없어서 데이터 변경이 많이 되는 서버일 경우 Redo Allocation Latch를 확보하기 위해

   많은 경합 발생

  · 9i버전부터 Redo Log Buffer를 여러 개의 공간으로 나누어서 각 공간별로 Redo Allocation latch를 할당해주는

    Shared Redo strand라는 기능이 도입

STEP4)

  · Redo Log Buffer에 기록된 내용들은 특정상황이 되면 LGWR이 일부를 Redo Log File에 기록한 후

   기록된 Redo Entries들은 Redo Log Buffer에서 삭제

  · Server ProcessRedo Writing Latch를 확보한 후 Redo Log Buffer에 있는 내용을 Redo Log File에 기록하라고 요청

 

2. Redo Log File 구성

- Redo Log File은 그룹과 멤버라는 개념으로 관리

- 최소 그룹의 개수는 2개이며, 그룹별로 필요한 최소 Member 수는 1

- 같은 그룹의 Member는 같은 내용 저장

- Member를 많이 추가하면 안정적일 수는 있지만, 기록시간이 커서 부하를 줄 수 있음

- 같은 그룹의 멤버는 서로 다른 디스크에 저장되는 것을 권장

- 그룹에 멤버가 여러 개일 경우 병렬로 동시에 같은 내용을 기록하는데 멤버가 같은 디스크에 존재한다면

직렬로 기록하게 된다.

 

- LGWRRedo Log Buffer의 내용을 Redo Log File에 내려 쓰다가 해당 파일이 가득 차게 되면

Log Switch가 발생하여 자동으로 다음 그룹으로 넘어감

- Log Switch가 발생하게 되면 Checkpoint 신호가 발생

- Log Switch가 일어나는 그룹의 순서는 Oracle이 라운드 로빈 방식으로 결정

- Redo Log File크기가 너무 작을 경우 LOG SWITCH가 자주 발생하여 성능저하가 될 수 있고,

너무 크면 데이터의 손상 가능성이 커지므로 적절하게 설정 필요

 

빈번한 Log Switch와 관련된 에러

- checkpoint not completed -----> Redo log size를 올린다

· Log Switch가 너무 빈번하게 일어날 경우 DBWR이 이전에 발생한 Check point 내용을 Data file에 다 기록을 못한 상태에서

다시 Log Switch가 발생하여 checkpoint 신호가 들어올 경우 발생

 

Redo Log File 상태

- CURRENT : LGWR이 내용을 기록하고 있는 상태

- ACTIVE : Redo log file의 내용이 아직 DB Buffer Cache에서 Data file로 저장이 안되서

지워지면 안 되는 상태(checkpoint 발생 후 inactive로 변경 됨)

- INACTIVE : Redo log file의 내용이 Data file로 저장되어 삭제되어도 된다는 의미

 

*참조 뷰, 쿼리

select * from v$log;

select * from v$logfile;

select a.group#, a.member, b.bytes/1024/1024 MB, b.sequence# "SEQ#", b.status, b.archived "ARC"

from v$logfile a, v$log b

where a.group#=b.group#

order by 1,2;

 

alter system switch logfile; -- redo 스위칭

alter system checkpoint; -- 체크포인트신호 강제 주입

 

3. Redo Log File 관리

--group 추가

alter database add logfile group 4

'/oracle11/oracle/oradata/testdb/redo04.log' size 50M;

* 이미 생성된 파일명은 시스템에서 지우기전에는 재생성 불가능

* 사이즈 지정 안 할시 기존 것과 똑같이 설정

 

--member 추가

alter database add logfile member

'/oracle11/oracle/oradata/testdb/redo04_b.log' to group 4;

 

--member 삭제

alter database drop logfile member

'/oracle11/oracle/oradata/testdb/redo04_b.log' ;

* ACTIVE , CURRENT 상태에서는 삭제 불가능 -> 스위칭, 체크포인트 발생시켜야함

alter database drop logfile group 4;

 

4. SCN

- 사용자가 Commit을 수행하게 되면, Oracle내부적으로 SCN이라는 고유번호를 생성해서 트랜잭션을 관리하게 된다.,

- 이러한 SCN 번호를 통해 트랜잭션을 관리하면서, 장애 발생 시 복구 한다.

- System Commit Number(SCN)

· Recover OracleSCN 정보를 사용하여 데이터베이스에 문제가 있는지 판별하고, 문제가 있다고 판단되는 경우 복구를 수행

· SCN번호는 DML문장 단위가 아니라 트랜잭션 단위로 할당

SCN 기록 되는 곳

1) Control File

- Check point 발생했을 때

- Reset Log 발생했을 때

- Incomplete Recovery 수행 때

2) Data blocks

- Block Cleanout시 마지막 SCN을 각 Block에 기록

3) Data File Headers

- 모든 파일의 헤더에 아래의 경우 SCN을 기록한다.

· 마지막 Check Point 발생 시

· Begin Backup 수행 때

· 복구가 되었다면, 사용된 마지막 SCN을 기록한다.

4) Redo Records, Log Buffer

- Commit이 수행되면 Commit RecordSCN을 포함하여 저장함

5) Undo SegmentTablespace Headers에도 기록이 된다.

 

5. CHECKPOINT

- Commit된 데이터를 어디까지 저장했는지 확인하기(SCN으로 확인) 위해서 만들어 놓은 개념

ex) SCN100번까지 Commit되었고, CheckPoint 정보가 90번이라면 SCN 90번 트랜잭션까지 데이터 파일에 저장 되었다고 확인

--> 91번부터 100번까지의 정보는 redo에서 리 트랜잭션을 시켜줌

- Datafile의 복구를 결정하는 기초적인 정보로써 Control FileData FileCheck Point 정보를 비교하고

서로 정보가 다르면 틀린 부분을 Online RedoArchived Redo Log를 참조해서 복구

1) Database / Global Checkpoint ( DB를 내릴 때 발생 )

- DB Buffer Cache내에 있는 모든 저장 안 된 Dirty Buffer들의 내용을 전부 데이터 파일로 저장

- 저장된 SCN 중 가장 큰 SCN번호를 Control FileData File Header부분에 기록

2) Thread Checkpoint / Logical Checkpoint

- 해당 Thread 내의 저장되지 않은 모든 Dirty Buffer들을 Datafile로 내려 쓴다

- Log Switch가 발생 시 생김

- RAC환경일 경우 각 노드 별로 다르게 발생

3) Datafile Checkpoint

- 특정 데이터파일에만 발생하는 Check Point

- 해당 테이블스페이스를 offline, begin backup시 발생 ( 테이블 스페이스 단위로 작업 )

- 이 체크포인트 발생하면 해당 정보를 Control File과 데이터 파일 헤더 부분에 기록

4) Mini Checkpoint

- Drop Table과 같이 특정한 DDL 발생 시 특정 블록에만 발생 하는 Checkpoint

5) Recovery Checkpoint

- 데이터 파일에 장애가 발생 했을 때 백업된 데이터파일 복원 시 Recovery된 블록을 데이터 파일에 저장해야 하는데

이때 발생하는 CheckPointRecovery Check Point라고 함

 

'Study Note > Database' 카테고리의 다른 글

Oracle Block  (0) 2016.02.02
Tablespace & Datafiles  (0) 2016.02.02
SQL 문장의 실행 원리 & 백그라운드프로세스 & Startup & Shutdown  (0) 2016.01.27
Oracle Architecture  (0) 2016.01.27
Oracle RAC(Real Application Clusters)  (0) 2016.01.27

SQL 문장의 실행 원리

1) 사용자 문장 실행 시 User Process에서 Server Process로 실행한 SQL문 전달

2) User Process로부터 문장을 받은 Server Process가 해당 문장의 세부적 체크 진행

· Syntax Check : SQL문이 적절한 문법을 사용했는지 검사

· Semantic Check : SQL문에 포함된 오브젝트들이 실제로 존재하는지 검사

3) Parse과정 후 Shared PoolLibrary Cache에서 공유되어있는 실행계획이 있는지 체크

4) 실행계획이 있을 경우 Execution 진행 (Soft Parsing)

5) 실행계획이 없을 경우 Optimizer를 통해 Data dictionary 등을 참조하여 실행계획을 새로 생성 후 Library Cache에 저장 (Hard Parsing)

 

 

SELECT 문장의 실행 원리

 Parse(구문분석) -> Bind(바인드) -> Execute(실행) -> Fetch(인출)

 

1) Parse(구문분석)

- User Process로부터 전달받은 SQL문장을 Server프로세스가 SQL문을 수행하기 위해 Parse Tree생성

- Parse Tree를 만드는 과정에서 Syntax Check, Semantic Check 진행

- Data Dictionary 조회를 통해 문법이 맞는지, 해당 테이블이 있는지 확인

- 자주 사용되는 Data DictionaryShared PoolDictionary Cache에 캐싱해 두어 성능을 높힘

- 오류가 없을 경우 SQL문장을 Hash 함수로 Hash Value로 변경한 후 Shared PoolLibrary cache에서

Hash Value와 비교하여 동일한 값이 있는지 확인 ( 커서 공유 혹은 Soft Parsing이라고 함 )

· Cursor : 메모리에 데이터를 저장하기 위해 만든 임시 저장 공간 ( 공유 커서, 세션 커서, 어플리케이션 커서 )

· Library Cache 안에 있는 커서는 공유 커서를 의미

· 공유 커서

- 한번 수행된 SQL 문장의 실행계획과 관련 정보를 보관

- 재활용을 통해 Hard Parse의 부담을 줄여 SQL 문장의 수행속도를 빠르게 함.

 

SELECT /* cursor_test */

empno, ename

FROM emp

WHERE empno = 7521 ;

 

 

-- sql의 실행횟수 및 커서공유 현황

SELECT sql_id

, sql_text

, parse_calls -- parse 시도 횟수

, loads -- hard parsing을 거쳐 loading된 횟수

, executions -- 실행 횟수

FROM v$sql

WHERE sql_text LIKE '%cursor_test%'

AND sql_text NOT LIKE '%V$SQL%';

 

   

--> parse 시도를 2번 했으며,

       메모리에 이미 등록된 SQL이므로 hard parsing은 1번 했고,

       실행 횟수는 2번 했음 

 

옵티마이저(Optimizer) : SQL의 실행 계획을 생성해주는 네비게이션 역할

옵티마이저 모드 : RBO, CBO

1) RBO : Rule Based Optimizer(11g부터 사용 불가)

2) CBO : Cost Based Optimizer

- 데이터 딕셔너리 정보를 이용하여 판단

- 옵티마이저가 참조하는 데이터 딕셔너리 중 대부분은 Static Dictionary, , 항상 최신 정보를 가지고 있음

- 데이터 딕셔너리를 관리해야 함 ( 통계정보 생성 및 관리 )

 

 

2) BIND(바인드)

- SQL문이 정확히 일치해야 Soft Parsing이 가능해짐

- 변수 값이 달라지는 동일 쿼리에 대해 모두 다른 SQL로 인식 -> Hard Parsing 유발

- 변수 값이 달라지는 부분에 바인드 변수 처리

ex) select ............

from emp

where empno = :emp_num:

- 바인드 처리하면 모든 SQL이 동일 실행계획을 가짐

 

 

3) Execute(실행)

- ParseBind 단계 후 해당 데이터를 가져오기 위해 데이터가 저장되어있는 데이터 블록을 찾아 DB Buffer Cache에 복사하는 과정

- 사용자가 찾는 모든 데이터는 SGADB Buffer Cache에 있어야 함

- 사용자가 찾거나 변경하는 모든 작업은 DB Buffer Cache에서 작업이 수행됨

- 서버프로세스는 해당블록을 찾기 위해 DB Buffer Cache를 확인 후 없는 경우 데이터 파일로부터 복사해옴

- 데이터 파일과 DB Buffer Cache의 데이터 이동은 BLOCK 단위

- DB_BLOCK_SIZE 크기만큼 데이터를 이동(default : 8K)

 

 

4) Fetch(인출)

- Execute 단계까지 수행하면, 원하는 데이터가 들어있는 블록이 DB Buffer Cache에 올라오게 됨

- 데이터의 I/O 최소 단위가 Block이므로, DB Buffer Cache에 원하는 데이터만 있는 것이 아닌 다른 데이터도 존재

- 사용자가 요청한 데이터만 골라내는 과정을 Fetch라고 함

- 정렬이 필요하거나 추가 작업을 요구하는 경우 Fetch과정에서 Sort를 하여 데이터를 보내주며, 정렬은 PGA영역(Program Global Area)에서 수행

 

   

 

 

 

DML 문장의 실행 원리

- 모든 의의 수행원리는 동일하다.

- DML의 수행단계는 Fetch과정만 없고 나머지는 동일

Parse(구문분석) -> Bind(바인드) -> Execute(실행)

 

1) 서버 프로세스는 Parse과정 수행

- Library Cache에 실행계획이 있는지 확인

- 있으면 Soft Parse, 없으면 Hard Parse 수행

2) 실행계획을 받은 서버프로세스는 Library CachePlan정보 등록한 후 Execute 수행

- DB Buffer Cacheupdate 하려는 데이터가 있는지 확인

- 없을 경우 데이터파일의 해당 블록을 DB Buffer Cache에 복사

3) Execute 단계에서 원하는 데이터가 들어있는 DB Buffer Cache를 가져온 후 Server 프로세스는

데이터 변경 내역을 Redo Log Buffer에 먼저 기록

4) 기록 후 Undo Segment에 원본 이미지를 기록한 후 DB Buffer Cache의 내용을 변경

 

 

[정리] 데이터 변경이 일어날 경우 순서

Redo Log Buffer에 기록 -> Undo Segment에 기록 -> DB Buffer Cache의 실제 데이터 변경

 

1. Parsing

 

2. Data Buffuer Cache 조회

 

3. datafile에서 DBC로 불러옴

 

4. 바꾼 데이터를 Redo Buffer

올려둠

 

5. undo segment에 기록

 

6. Data Buffer Cache 데이터 변경

 

 

 

 

 

* Undo segment에 저장 하는 이유

실제 데이터 파일이므로 무거울 수 있지만

1. 서버가 갑작스럽게 내려갔을 때(memory flash) Before 이미지를 남기기 위해

2. 작업 외 인원이 조회하기 위해 ( 읽기의 일관성 )

 

Oracle Background Process

Oracle Process 종류

1) User Process : 사용자가 작성한 SQL 문장을 Server 프로세스로 전달하고 결과를 가져오는 프로세스

2) Server Process : User Process가 전해 준 SQL 문장을 실제 실행하는 프로세스

3) Background Process : Oracle Server가 시작되면 자동으로 시작되어 운영과 유지를 담당하는 프로세스

· User ProcessServer Process는 사용자가 접속하면 생성되고 접속을 종료하면 해제

· Background ProcessOracle Server가 시작되면 함께 시작되고 종료되면 함께 종료

 

Database Writer (DBWR) [ Database Buffer Cache --> Data File ]

Database Buffer Cache에서 변경완료 후 저장 되어야 하는 블록(Dirty Block)을 데이터 파일로 저장하는 역할

DBWR 동작 시점

1. Checkpoint 신호가 발생 했을 때

2. Dirty Buffer 가 임계 값을 지났을 때

3. Time out 이 발생했을 때s

4. RAC Ping 이 발생했을 때 --> 서로 다른 instance에서 ins1에서 데이터 변경 했을 때 ins2가 해당 데이터 조회 했을 시

5. Tablespace Read only 상태로 변경될 때

6. Tablespace offline 될 때

7. Tablespace begin backup 상태가 될 때

8. Drop table이나 Truncate table 될 때

 

 

1. redo #1 이 가득차면 archive에 저장

2. log change를 이용해 #2로 넘어감

 

Database Writer (DBWR) 개수 수정하기

select * from v$parameter

where name ='db_writer_processes';

 

DBW0~DBW9 (최대 10)

 

Log Writer (LGWR)

- Server Process가 변경내역을 Redo Log Buffer에 기록하게 된다

- LGWRRedo Log Buffer에 있는 내용을 디스크의 Redo Log File로 저장한다.

- 만약 Commit 요청이 들어왔는데 Redo Log File이 없는 경우, Alert Log 파일에 해당 내용을 기록해두고

LGWR은 다음 Commit 요청을 수행하지 않고 대기 ==> DB 전체 중단

 

LGWR 동작 시점

1. Commit 이 발생 했을 때

2. 1/3이 찼을 때

3. 변경량이 1M가 되었을 때

4. 3초 마다

5. DBWR이 내려 쓰기 전에 -- 무조건 LogWriter가 먼저 실행

 

PMON (Process Monitor)

- Server Process 생성 및 관리

- Server Process fail일 경우

commit 된 데이터 저장

commit 안된 데이터 rollback

Lock Release

   

 

SMON (System Monitor) - Instance Recovery

- 인스턴스가 비정상 종료 되었을 경우, 인스턴스를 시작할 때 Clean Up하는 역할 (Instance Recovery)

- Instance Recovery 과정에서 누락된 TransactionRecovery하는 역할

- 비정상 종료된 Transaction Temporary segmentClean up하는 역할

1. 사용자 A가 홍길동을 일지매로 변경

2. 사용자 Acommit 수행해서 변경내용이 Redo log file에 기록 됨

3. 사용자 B가 이순신을 강감찬으로 변경

4. 사용자 Bcommit을 안 했지만 Redo log Buffer의 변경내용이 1M가 되어 Redo log file에 기록이 됨.

5. Shutdown abort;

---> commit 된 데이터만 DataFile로 이동 됨. ( 다 읽은 후 롤백 처리까지 )

Roll Forward --> DB Open --> Roll backward

 

CKPT(Checkpoint Process)

- CKPT ProcessDBWR에게 Checkpoint 신호를 전달해 주며, Control fileData file Header에 해당 Check Point 정보를

기록하는 역할 수행.

- Checkpoint 정보에는 Checkpoint 위치와 SCN(데이터 변경 시점), 해당 내용을 담고 있는 Redo log 내용의 위치 값을 담고 있다.

 

 Oracle Startup & Shutdown

Shutdown --(Pfile/Spfile)--> No mount --(Control file)-->mount --(Data file/Redo log file)--> OPEN

SQL > startup; -- shutdown 상태부터 open 상태까지 진행

SQL > startup nomount; -- shutdown 상태부터 nomount 단계 까지 진행 이후 진행은 alter명령어로 순서대로 올라가야 함

SQL > startup mount; -- shutdown 상태부터 mount 단계까지 진행

SQL > alter database mount; -- nomount 상태부터 mount단계까지 진행

SQL > shutdown;

SQL > shutdown immediate;

SQL > shutdown abort;

 

1) NOMOUNT

- 서버 프로세스가 Parameter File을 찾아 읽음

- 여러 인스턴스가 존재하는 경우 해당 SID를 읽어 들여 Parameter File을 찾음

- Parameter File에는 정적 파라미터 파일인 Pfile과 동적 Parameter 파일인 Spfile이 있음

- 정적 파라미터 파일은 관리자가 수동으로 변경

- 동적 파라미터 파일은 서버 프로세스가 자동으로 변경

- Parameter파일을 읽고, 그 안에 저장되어 있는 파라미터 값을 참고하여 인스턴스 구성

- 인스턴스는 SGABackground Process들로 구성되어 있으므로 MOUNT단계에서 RAM에 인스턴스가 생성되어

작업할 수 있는 메모리 공간이 확보됨

- Alert Log 파일을 열어서 로깅을 시작

- Alert Log는 인스턴스가 시작되어 운영되고 종료될 때까지 중요한 내용을 모두 저장하는 파일

 

*profile에 등록하면 편하게 alert log를 확인할 수 있다.

alias alert='tail -f /oracle11/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log'

 

 

2) MOUNT

- NOMOUNT 단계를 마치면, Control file을 읽고 MOUNT 단계 진행

- Control File의 위치정보는 Parameter File에 기록되어 있음

- MOUNT단계에서는 Database의 이상유무 확인 open 진행

- Instance Crash로 판단되면 OPEN 단계로 가기 전에 SMONInstance Recovery를 수행

- SMONRecovery를 수행할 경우 관련 내용을 Redo Log File에서 찾게 되는데, 복구하려는 내용이

Redo Log File에 없을 경우에는 SMON에 의한 Recovery 실행 -> Media Recovery 수행(Archive 필요)

- instance crashcontrol filedata file파일의 scn(checkpoint) 정보가 서로 다를 경우 crash를 판단하게 되고,

서로 다른 정보를 맞추는 과정이 instance recovery이다.

 

 

Oracle Parameter File

pfile

- $ORACLE_HOME/dbs/initSID.ora

- Text file

- OS 편집기로 내용수정 가능

- 내용 변경 시 재 시작 해야 적용됨

- Dynamic으로 파라미터 적용 불가능

spfile

- $ORACLE_HOME/dbs/spfileSID.ora

- Binary file

- OS 편집기로 내용수정 절대 불가능

- 내용 변경 시 재 시작 하지 않아도 적용됨(일부 제외)

- Dynamic으로 파라미터 적용 가능 (alter system set)

*** 둘 다 존재 시 SPFILE만 사용함 ***

 

1) sqlplus / as sysdba 접속 후

create pfile from spfile;

 생성 후 spfile 지우고 다시 재부팅

2) pfile로 켜진지 확인 후 동적 변경이 가능한지 확인

· select * from v$parameter

where name like '%large_pool_size%'; -- 명령으론 수정 불가능 직접 init파일을 수정해야함!

· alter system set large_pool_size=16m; -- 오류는 안나나 실제적으론 수정이 안 되어있음

 

spfile 환경일 경우 파라미터 변경 옵션

- SQL > ALTER SYSTEM SET DB_CACHE_SIZE=30m Scope=Memory;

- Scope 옵션

· MEMORY : Spfile 내용은 변경하지 말고 현재 작동 중인 인스턴스에만 적용

· SPFILE : 현재 운영중인 인스턴스에 적용하지 말고, SPFILE 내용만 변경 (DB 재기동시 변경되도록 함)

· BOTH : 두 가지 모두에 적용 (Scope 옵션을 사용하지 않을 경우 기본 모드)

 

* SGA 남은 사이즈

SELECT CURRENT_SIZE/1024/1024 AS "FREE_MEMORY(MB)"

FROM V$SGA_DYNAMIC_FREE_MEMORY;

 

 

select * from v$parameter

where name like '%sga_max_size%';

alter system set sga_max_size=400m scope=spfile;

spfile환경에서) sga_max_size는 동적으로 변경 불가능하므로 both, memory 설정 불가능

   

Oracle shutdown

1) NORMAL ( 사용할 일 절대 없음 )

- shutdown normal 또는 shutdown 명령어로 종료

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

- 사용자가 접속을 종료하지 않으면, Instance는 종료되지 않고 무한 대기

2) TRANSACTIONAL

- shutdown transactional 명령어로 종료

- 사용자가 스스로 접속을 종료할 때 가지 기다리지 않고 강제로 접속을 중단시킨 후 Instance를 종료

- 접속을 강제로 중단 시키는 시점은 사용자가 수행중인 Transaction이 끝나는 시점

- DML 작업을 수행 중일 경우에는 해당 트랜잭션을 종료하는 명령어(DDL,DCL,TCL) 수행 시 인스턴스를 종료

- 사용자가 트랜잭션을 종료하지 않게 되면 Instance를 종료할 수 없음(사용자가 COMMIT,ROLLBACK 명령어를 수행해야 함)

3) IMMEDIATE

- shutdown immediate 명령어로 종료

- 사용자의 행동에 상관없이 즉시 접속을 강제로 종료

- 접속이 종료되는 시점까지 해당 사용자가 수행한 작업중에 Commit이 완료된 데이터를 DB Buffer cache에서 찾아

데이터 파일로 저장해주고, 완료되지 않은 작업은 Rollback 시킨 후 Instance 종료

4) ABORT

- shutdown abort 명령어로 종료

- 사용자의 행동에 상관없이 즉시 접속을 강제로 종료

- immediate와 차이점은, 사용자가 수행한 작업을 저장하지도 Rollback하지도 않고 즉시 Instance 종료

- 다시 Startup될 때 SMONInstance Recovery를 수행해서 복구함

---> IMMEDIATECheckPoint를 발생시키고 ABORTCheckPoint를 발생시키지 않음

'Study Note > Database' 카테고리의 다른 글

Tablespace & Datafiles  (0) 2016.02.02
Redo Log files  (0) 2016.02.02
Oracle Architecture  (0) 2016.01.27
Oracle RAC(Real Application Clusters)  (0) 2016.01.27
Oracle 11g RAC 설치 on OEL - 4  (0) 2016.01.25

Oracle Architecture

oracle sever = 인스턴스 + 데이터베이스

인스턴스 : 메모리 상에 생성되는 구조

SGA(System Global Area)

백그라운드 프로세스

데이터베이스 : 디스크 영역에 저장되는 구조

Data files : 데이터가 저장되는 영역

Control files : DB전체의 관리정보가 들어있는 영역

Redo log files : 장애 복구 시에 사용되는 영역

SGA?

-오라클서버의 메모리 영역

-Oracle 인스턴스에 대한 데이터와 제어정보를 가지는 공유 메모리 영역의 집합

-오라클 파라미터 파일(pfile,spfile)의 조정으로 SGA의 각 부분의 크기를 조절

initSID.ora : pfile (정적파라미터변경; 서버를 내리고 해야함)

spfileSID.ora : spfile (동적파라미터변경;)

-Oracle 9i부터 동적으로 변경 가능 (SGA_MAX_SIZE)

-Shared Pool,DataBase Buffer Cache, Redo LogBufferLarge PoolJava Pool로 구성

 

1.Shared Pool

- Shared PoolLibrary CacheData Dictionary Cache로 구성

- Shared Pool은 하나의 데이터베이스에 행해지는 모든 SQL문을 처리하기 위하여 사용

- Shared Pool은 문장을 실행하기 위해 그 문장과 관련된 실행 계획과 구문분석 정보가 들어있음

- SHARED_POOL_SIZE 파라미터 값으로 결정

1) Library Cache

- 가장 최근에 사용된 SQL문장의 명령문과, 구문 분석 트리, 실행계획 정보를 가지고 있음

- LRU(Least Recently Used) 알고리즘으로 관리

- 동일한 문장이 다음 번에 실행되면 Shared SQL 영역에 저장되어 있는 실행계획과 파싱 트리를 그대로 이용하기 때문에 SQL 문장의 처리 속도가 향상(Soft Parsing) <> Hard Parsing : Library Cache가 없는 것

*라이브러리캐시 히트레시오 : 소프트 파싱이 잘되는 rate (보통 90퍼이상)

 

-- TEST SQL 실행

SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID = 60;
SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID = 60;
SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID = 50;

 

-- plan hash value 값 확인

SELECT SQL_ID, SQL_TEXT, HASH_VALUE, PlAN_HASH_VALUE

FROM V$SQL

WHERE SQL_TEXT LIKE '%employees where department_id%'

OR SQL_TEXT LIKE '%EMPLOYEES WHERE DEPARTMENT_ID%';

 

 

 

literal SQL 변수를 바인드 처리해줌( 캐시에 불필요한 sql을 담기 때문 )--> 성능 향상

ex) select empno from emp where empno=:a

* 여러 empno를 조회하더라도 하나의 sql으로 보기 때문에 불필요한 메모리 낭비를 줄일 수 있다.

 

EXACT_MATCHING_SIGNATURE은 다르나 FORCE_MATCHING_SIGNATURE가 같으면 literal sql 변수

 

2) Data Dictionary Cache

- Object(테이블, 컬럼, 사용자 이름, 사용 권한) 같은 가장 최근에 사용된 데이터 사전의 정보를 저장

- 구문 분석 단계에서 서버 프로세스는 SQL문에 지정된 오브젝트 이름을 찾아내고 접근 권한을 검증하기 위해 Dictionary Cache의 정보를 찾아봄

 

3) Shared Pool Size

- 확인

SQL) show parameter shared_pool_size; <프롬프트창>

 

 

SQL) select * from v$parameter where name='shared_pool_size'; <접속툴:Orange>

 

 

- 변경

SQL) alter system set shared_pool_size=10m;

 

select * from v$sgastat;  - sga를 구성하는 4가지 pool의 크기를 이곳에서 조회할 수 있다.

select * from v$parameter  -  현재 세션의 현재 파라미터의 값 표시

 

SELECT * FROM V$PARAMETER

WHERE NAME = 'shared_pool_size';

 

 

 

SQL) alter system set shared_pool_size=13m;

 

 

==> 분명 10M, 13M로 변경하였는데 16M로 바뀌어있다. Granule사이즈 때문인데 아래에서 살펴보자

 

4) Granule

- Granule은 가상 메모리 상의 연속된 공간으로, dynamic SGA 모델에서 할당할 수 있는 최소 단위

- Granule의 크기는 SGA_MAX_SIZE에 따라 다음과 같이 구분

    if estimated SGA size is < 1G 4MB

    else 16MB

- Dynamic SGA를 사용할 수 있는 SGA관련 파라미터는 이 Granule 단위로 늘어나거나 줄어듬

 

2. Database Buffer Cache (Buffer Cache)

- 가장 최근에 사용된 데이터를 저장하는 메모리 공간

- DB Buffer Cache 용량이 적을 경우 디스크 I/O가 많아져 부하가 생겨 성능 저하

- 이 버퍼는 아직까지 디스크에 완전히 쓰여지지 않는 수정된 데이터를 보유할 수도 있음

- LRU 알고리즘에 의하여 가장 오래 전에 사용된 것은 디스크에 저장하고 메모리에는 가장 최근에 사용된 데이터를 저장함으로, 디스크 입 출력이 줄어들고, 데이터베이스 시스템의 성능이 증가됨

- 데이터를 조회 -> 해당 데이터를 먼저 Database Buffer Cache에서 찾고 있으면 반환(Logical Read),

없으면 Database Buffer CacheFree Buffer를 일단 확보 후 Disk에서 데이터를 읽어 들여 cache하여 반환 (Physical Read)

 

Database Buffer Cache Block의 상태

- Pinned Buffer : 다른 사용자가 이미 사용하고 있는 Buffer Block으로 사용할 수 없음

- Dirty Buffer : 현재 작업은 진행되지 않지만 다른 사용자가 내용을 변경한 후 아직 데이터 파일에 변경된 내용을 저장 하지 않은 Buffer

- Free Buffer : Buffer는 사용되지 않았거나(Unused) 또는 Dirty Buffer였다가 디스크로 저장이 되고 다시 재사용 가능하게 된 Block

 

LRU List : Buffer Block들의 상태를 관리하고 있는 list

- 수많은 사용자가 동시에 Physical Read를 하여 동시에 Database Buffer CacheFree Buffer를 찾으려고 할 때 이 LRU List를 참조 -> 동시성 관리를 위해 순번제공 (Latch) -> 본인 순번이 올 때까지 대기

 

-확인

show parameter db_cache_size; <프롬프트창>

select * from v$parameter

where name ='db_cache_size';

 

-변경

SQL> alter system set db_cache_size=10m;

 

 

==> 이또한 Granule 사이즈 영향을 받는다.

 

3. Redo Log Buffer

· Redo 로그 버퍼는 데이터베이스에서 일어난 모든 변화를 저장하는 메모리 공간

· 장애 발생 시 복구를 위해 모든 변경사항 저장

· Redo Log Buffer에 기록하지 않는 경우도 있음

- Direct Load(SQL Loader, insert /+*append*/)

- table 이나 indexnologging 옵션의 경우

- , table nologging DML작업의 경우 제한적으로 Redo log에 기록

· DB에서 발생한 모든 변화는 LGWR에 의해 Redo 로그 파일에 저장

· LOG_BUFFER로 크기 지정

· 동적으로 Size 변경 불가능

 

4. Large Pool ( 위에 3까지가 중요하고 다음은 0으로 설정해도 무관 )

- Oracle 백업 및 복원 작업에 대한 대용량 메모리 할당, I/O 서버 프로세스 및 다중 스레드 서버와 Oracle XA에 대한 세션 메모리를

    제공하는 SGA의 선택적인 영역

      · RMAN으로 백업 및 복구를 할 경우 RMAN이 사용하는 I/OBuffer

      · Parallel Execution 작업을 할 경우 각 프로세스 간 Message Buffer

      · Shared Server ModeOracle Server 운영 시 UGA 

- LARGE_POOL_SIZE 파라미터로 관리되며, 기본크기는 0

 

5. Java Pool

- 자바로 작성된 프로그램을 실행할 때 실행 계획을 저장하는 영역

- JAVA_POOL_SIZE 파라미터로 관리되며, 기본크기 24MB가 할당

 

6. Streams Pool

- 10g New Feature

- Stream 기능 사용할 경우에만 사용되어 기본 값은 0

- 오라클 내부적으로 redolog 변경된 내용을 추적하여 타 DB로 복제

 

7. Fixed SGA

- Oracle이 내부적으로 사용하기 위해 생성시키는 공간

- 주로 백그라운드 프로세스들이 필요한 database 전반적인 공유 정보나 각 프로세스들끼리 공유해야 하는 lock 정보 같은 내용들이 저장

- Oracle이 시작될 때 자동으로 설정되며 사용자나 관리자가 임의로 변경 할 수 없음

 

SGA 사이즈 확인

- Total System Global Area : 전체 SGA 영역

- Fixed Size : 백그라운드 프로세스들이 사용하는 예약된 공간

- Variable Size : Shared Pool, Large Pool, Java Pool 공간

- Database Buffers : Database Buffer Cache 영역

- Redo Buffers : Redo log Buffer 영역

SQL > show SGA

 

 

Dynamic SGA 기능

- Oracle 9i 이후부터 등장하게 된 SGA 동적 관리 기법

- 파라미터의 크기를 Oracle Instance 재 기동 없이 변경할 수 있음

- Dynamic SGA를 사용할 수 있는 SGA 관련 파라미터는 DB_CACHE_SIZE, SHARED_POOL_SIZE, LARGE_POOL_SIZE,

 

JAVA_POOL_SIZE

- SGA 파라미터의 합은 SGA_MAX_SIZE보다 작아야 함

- SGA_MAX_SIZE는 동적으로 변경 불가능

- 파라미터 사이즈 할당 시 Granule 단위로 할당됨

 

PGA(Program Global Area)

- 하나의 단일 프로세스에 대한 데이터와 제어 정보를 가지고 있는 메모리 공간을 USER PROCESSOracle Database에 접속하고

Session이 생성될 때 Oracle에 의해 할당(1:1)

- SERVER PROCESS에 하나만 할당되는 PGA 메모리 영역은 SGA영역과 달리 다른 프로세스와 공유되지 않는, 각 프로세스가

독립적으로 사용하는 non-shared 메모리 영역

- PGA는 프로세스가 생성될 때 할당되며 프로세스가 종료될 때 해제됩니다.

- PGA_AGGREGATE_TARGET라는 값을 통해 사이즈 설정

- 메모리 가득 차면 temp tablespace로 감

  1) Private SQL Area

· User Process로부터 전달받은 SQLBind 변수 값 보관

· Query의 실행 상태 정보 및 Query의 임시 정보 저장

 

2) SQL Work Area

· SortHash관련 작업을 수행하는 공간

· order byunion과 같은 정렬작업을 필요로 하는 SQL 구문 실행 시 1차적으로 해당 공간에서 작업 수행

· INDEX 생성 작업 역시 정렬이 필요하므로 해당 영역에서 1차적 작업 수행

· WORKAREA_SIZE_POLICY

- PGA의 각 영역의 메모리 할당 방식을 지정해 주는 파라미터

- MANUALAUTO(default)관리 방식으로 나뉨

- 세션 별, 시스템 별 설정 가능

SQL> alter session | system set WORKAREA_SIZE_POLICY = AUTO | MANUAL

- PGA_AGGREGATE_TARGET=0 이면 자동으로 WORKAREA_SIZE_POLICY = MANUAL로 설정되면서

PGA의 개별 구성요소 값을 수동으로 설정 해야 함

- PGA_AGGREGATE_TARGET > 0 이면 자동으로 WORKAREA_SIZE_POLICY = AUTO로 설정되면서

PGA의 개별 구성요소 값을 오라클 서버가 자동으로 설정

 

SQL> select * from v$PARAMETER

WHERE NAME in ('pga_aggregate_target'

,'workarea_size_policy'

,'sort_area_size'

,'hash_area_size'

,'bitmap_merge_area_size'

,'create_bitmap_area_size');

 

 

--PGA_AGGREGATE_TARGET의 사이즈가 0일 때 SGA 사이즈의 20% SGA*0.210M중 최대 값 으로 설정

--> 그래서 WORKAREA_SIZE_POLICYAUTO설정

SQL> ALTER SESSION SET WORKAREA_SIZE_POLICY=AUTO;

SQL> ALTER SYSTEM SET PGA_AGGREGATE_TARGET=110M;

 

--세션 별 PGA SIZE확인

SELECT S.SID, S.SERIAL#, P.SPID AS "OS PID", S.USERNAME, S.MODULE, S.TERMINAL, S.SQL_ID, S2.SQL_TEXT, P.PGA_USED_MEM/1024/1024 AS "SIZE(MB)"

FROM V$PROCESS P, V$SESSION S, V$SQL S2

WHERE S.PADDR = P.ADDR

AND S.SQL_ID = S2.SQL_ID(+);

 

 

1. 일반적인 Oracle server 구성방식

* Process : A는 작업장1로 복사해와서 작업을하고, B는 작업장2로 복사를 해와서 작업을 하며 저장을 database에 한다. 이렇게 instance와 database 사이를 왔다 갔다 하면서 작업을 해주는 구성요소

  - server process

  - backgroud process

 

■ Oracle Server의 구성 방식

  - single server 구성 : 하나의 Database에 하나의 instance가 할당되는 구성

==> 일반적으로 DB서버 구현시 1개의 서버를 사용하는데, 이런 경우 istance 역할을 하는 서버에 장애 발생했을 때 storage에 저장된 데이터를 사용할 수 없게 되는 위험이 존재

 

  - OPS(8i버전까지) 또는 RAC(9i버전부터) : 하나의 database에 여러 개의 instance로 구성하는 방식

 

 

 

 

 

2. HA 구성 (High Availability = 고가용성)

  똑같은 장비 두개를 구축해서, 하나는 실제 서비스(active)를 하고, 한대는 대기상태(standby)로 두는 서버구성방식 그래서 active상태였던 서버가 고장나면, standby상태의 서버가 즉시 active 상태로 바뀌어서 투입되는 서비스 중단이 발생하지 않도록 조치되는 구성

 

 

 

※ 문제점

1. 비용이 많이 듬

2. 데이터 동기화 문제 : active 상태의 node에서 작업을 하다가 db가 죽으면, standby 상태의 node로 작업을 할 수는 있다고 쳐도, 데이터가 동기화 되지 않았으므로, 데이터는 이미 날라간 상태

  ==> 미러링을 어떻게 해 줄거냐에 따라서 성능이 결정

       * 미러링 : 장비가 고장나는 사고 생겼을때, 데이터가 손실되는것을 막기위해 데이터를 하나 이상의 장치 중복저장하는 것

  ==> DG(data guard) (HA구성 방식으로 사용시, 데이터 동기화 문제를 해결하기 위해 오라클에서 제공하는 무료 프로그램)

       : 운영 db를 백업받는 용도로 규칙적으로 동기화 ( 별 쓸모 없음 )

** 24X7X365(무정지) : 하루 24시간 7일 365일 내내 stop 하는 시간으로 -> 0이 될 수록 좋음.

 

3. OPS(Oracle Parallel Server)

  하나의 storage에 두 개의 instance가 연결되어 있는 구성으로, 사용자가 각각 다른 instance에 접속을 해도 storage가 하나이므로, 같은 데이터를 조회, 변경할 수 있음.

 

※ 장점

만약 1개의 instance에서 장애가 발생할 경우 남아 있는 다른 instance를 통해 storage에 접근가능하기 때문에 서비스가 중단되는 경우를 예방할 수 있다. (데이터가 날라가지 않음. 그 데이터 그대로 다른 instance에서 쓸 수 있음)

 

 

** 문제점 : RAC ping

 

 

 

[현재 상황] : storage에 저장된 홍길동 데이터를 A사용자가 instance1로 접속해서 조회하고, B사용자는 instance2에 접속한 후 조회.

                   이후에 A사용자가 홍길동을 일지매로 update한 후 commit까지 완료

[문제 발생] : 이때 instance2에 접속해 있는 B사용자가 홍길동 데이터를 조회할 경우 일지매라는 데이터가 보여야하는데,

                    instance1에서 변경완료후 commit된 일지매 데이터를 instance2로 가져오기 위해서 storage에 우선 저장 후 instance2로 가져와야 함

* RAC Ping 이란 Instance 1 에서 변경 완료 된 데이터를 Instance 2로 가져오기 위해서 우선 디스크에 저장을 한 후 해당 데이터를 Instance 2 로 복사해 오는 작업. 이런 과정이 디스크를 사용해서 시간이 오래 걸리기 때문에 OPS 환경에서 RAC Ping 작업은 성능 저하의 주요 원인으로 지적됨

 

4. HA와  OPS의 비교

 

HA  

  - standby 상태의 서버는 장애를 대비하여 대기만하고, 실제 서비스에는 전혀 도움을 주지 않음.

  - Active 상태의 서버 장애 발생시, 해당 서버에 접속해 있던 연결들은 모두 접속 종료 후 standby서버가 가동되면서 다시 접속됨

    즉, active상태였던 서버에서 하던 작업들은 모두 취소

  - 비용이 많이 들고 굉장히 비 효율적

  - 각 서버 별로 Storage를 별도로 가지고 있기 때문에 active상태였던 서버에서 변경된 작업이 standby상태 서버에 반영되지 못할 경우

    데이터 불일치 현상이 생길 수 있음.(데이터 동기화 문제) 

  - 두 개의 서버로만 구성할 수 있음

OPS

  - 두 노드 모두가 Active상태로 동작하기에 이론적으로는 부하가 50%로 분산될 수 있고, 서비스 속도도 두 배 빨리 짐

  - OPS의 경우에는 CTF나 TAF라는 설정이 되어있을 경우 기존 서버에 장애가 발생했을 경우 작업을 그대로 다른 서버로 이전시킬 수 있음

    (단, 수행 중이던 작업의 종류에 따라 다름)

  - 1개의 storage를 공유하므로 한 서버에서 변경된 작업을 다른 서버에서도 그대로 반영

  - OPS나 RAC는 이론적으로 서버수의 제한이 없이 확장이 가능함

  - Down Time을 획기적으로 줄일 수 있음

  - RAC ping이라는 현상으로 심각한 성능저하 발생

 

 

5. RAC(Real Application Cluster) (9i버전부터)

  OPS의 RAC ping문제가 개선되어 성능이 크게 향상 된 것으로, oracle9i버전부터는 서로 다른 instance에서 변경된 데이터를 디스크를 거치지 않고 바로 instance로 가져올 수 있는 기능인 Cache Fusion(캐쉬 퓨젼)이라는 기능이 사용됨.

 

 

* public network (public 망) : ip 3개 중 관리자가 유지,보수 할 때 쓰는 것으로 public 망에 붙어쓰는게 vip인데, service ip임

* inter connect = private network (private 망) : instance1과 instacne2를 연결하는 망

* cache fusion : instance1에 있는 데이터와 instance2에 있는 데이터를 서로 즉시 볼 수 있고, 어떤 물리적인 instance에서 작업을

                       하든지 내용 구분없이 섞여 있으므로 cache fusion이라고 부름

 

■ 클러스터용 소프트웨어

CRS (10g R1) --> clusterware (10g R2) --> Grid(11g)

10g R1버전부터 클러스터용 프로그램을 오라클에서 직접 만들어 제공하기 시작. 10g R2버전부터 클러스터웨어라는 용어로 부름.

11g에서는 ASM기능이 통합되어 grid라는 명칭으로 변경. Grid는 여러개의 local lock 떨어져 있는 것을 하나로 묶어 줌

 

■ clusterware (10g R2)

동일한 데이터를 동시에 변경을 하게 되는 문제가 생기지 않도록 관리해주는 역할

 

 

■ ASM기반

 

  - 10g R2까지는 OCR과 Vote disk를 ASM storage에 저장할 수 없기 때문에 별도의 Raw device를 구성해서 저장해야 함

  - 11g부터는 OCR이나 vote disk가 전부 ASM에 들어감

 

* OCR (Oracle Cluster Repository) : RAC 구성의 전체 정보를 저장하고 있는 디스크로, RAC에서의 핵심역할을 함

  - RAC를 시작할 때 OCR에 저장되어 있는 정보를 보고 RAC를 구성해야 하는데, 10g RAC까지는 RAC 시작 후 ASM instance를 시작하기 때문에

    OCR을 ASM에 저장할 경우 RAC를 시작할 수 없게 되는데, 그래서 별도의 Raw device에 저장 (최소크기 100MB)

 

* VoteDisk : 각 Node들이 장애가 있는지 없는지를 구분하기 위해서 사용하는 일종의 출석부 같은 역할을 하며,

                  cssd가 보내는 heartbeat에 응답을 보내면서 매 초마다 vote disk에도 자신이 정상적으로 동작하고 있다는 표시를 해둠

  - RAC를 구성하는 프로세스 중 cssd라는 프로세스가 각 Node들이 정상적으로 작동하고 있는지 interconnect를 통해 매 초마다

    핑(heartbeat)을 보내고 각 node들은 그에대한 응답을 다시 보내어 자신이 정상적으로 동작하고 있다는 것을 알려줌.

    ==> 만약 어떤 이유로 특정 node가 heartbeat에 응답하지 못했을 때, cssd는 2차로 vote Disk를 확인. 그 vote disk를 확인해보고

         그곳에서 해당 node의 표시가 없다면 해당 node가 장애가 생겼다고 가정하고 해당 node를 cluster에서 제외하고 재부팅한다.

         만약 heartbeat에응답이 없었는데, votedisk에 해당 node의 표시가 있다면, node가 바빴다고 생각하고 넘어간다.

         (최소크기 20MB, 3개로 다중화해서 구성하기를 권장)

 

6. Cache Fusion

  1) Cache Fusion 개념

     : 물리적으로 떨어져 있어도 하나로 만들어 주는 것

 

RAC 에서는 어떤 Instance 에서 작업을 해도 하나의 서버에서 작업을 하는 것과 같은 효과를 내게 되는데 이런 것을 가능하게 해 주는 RAC의 대표먹인 서비스 두가지가 GES , GCS 

GES (Global Enqueue Service) 란 어떤 Instance 에서 데이터 변경작업 ( 트랜잭션 ) 을 하든 하나의 Instance 에서 데이터 변경 작업을 하는것과 같이 관리하는 기능

GCS (Global Cache Fusion) 란 Cache Fusion 기능이 구현되기 위한 필수 서비스로서 어떤 사용자가 자신의 Instance 에서 원하는 데이터를 찾지 못해서 다른 Instance 에 있는 데이터를 요청했을 때 Insterconnect 를 통해서 데이터를 전달해 주는 서비스를 말함

GCS 에서는 데이터 블록을 전송하고 관리할 때 아래의  3가지 모드로 구분함 

  - Null (N) 모드 : 해당 블록을 사용중인 사용자가 없다는 것을 뜻함

  - Share (S) 모드 : 해당 블록을  select 하고 있는 세션이 있다는 뜻함

  - Exclusive (X) 모드 : 해당 블록을 누군가가 변경하고 있다는 뜻함

 

3. Interconnnect ( 인터커넥트 ) 란?

  - 앞에서 살펴본 예에서 알 수 있듯이  RAC의 핵심 기능인 Cache Fusion이라는 특징 때문에 블록들이 이동하는 길인  

    Interconnect 가 RAC 전체 성능에 아주 중요한 역할

  - Interconnect  를 통해 이동하는  정보는  크게  Clusterware  가  Cluster 를  유지하고  운영하기 위해 사용하는 정보와 실제 데이터 블록 ,

    Parallel Query 관련 정보들이 있음 

  - 일반적으로  Cluster 를 유지하고 운영하는 정보인  GCS/GES 관련 정보는  256 bytes 정도로 아주 작지만  실제  데이터  블록은  DB_BLOCK_SIZE   

    ( 10g/11g  기준으로  기본  크기는  8k )  나  Non-Standard Block Size 의 크기로 GCS/GES 정보에 비해 아주 큼

  - Parallel Query 관련 정보는  Parallel_Execution_message_size 에 의해 크기가 결정되는 데 기본크기는  8k 로 설정

  - 이런 내용들이 얼마나 자주 왕래하느냐가 성능에 아주 중요한 영향을 주게 되며 당연히 가급적이면 이동하는 양을 줄이는 것이 튜닝에 아주

      핵심적인 관점 

  -  RAC 튜닝에서  Interconnect 의 사용량을 측정하여 튜닝하는 것이 아주 자주 언급

즉,  Interconnect 를 사용하는 량을 줄이거나 혹은  Interconnect 의 속도를 높이는 것이  RAC 튜닝 에서 아주 중요하다는 뜻 

 

■ (rac1) Oracle 엔진 설치

# cd /home/oracle/database

# . runInstaller

 

 

좀 오래걸립니다

  ** rac1 rac2 순서대로 진행하며 동시 실행시키지 말 것.

 

(rac1) OCR & Voting disks ASM -> Raw Device로 변경

- root 계정으로 변경

[oracle@rac1 ~]$ su - root

Password:

- OCR raw device 추가

[root@rac1 db]# ocrconfig -add /dev/raw/raw1

[root@rac1 db]# ocrconfig -add /dev/raw/raw2

 

- 기존 OCR 디스크 제거

[root@rac1 db]# ocrconfig -delete +DATA

 

- ocrcheck로 변경사항 확인

[root@rac1 db]# ocrcheck

 

- 기존 VOTE 디스크를 rawdevice로 교체

[root@rac1 db]# crsctl replace votedisk /dev/raw/raw3 

 

- VOTE 디스크 추가 : 3개의 디스크로 구성

[root@rac1 db]# crsctl add css votedisk /dev/raw/raw4

[root@rac1 db]# crsctl add css votedisk /dev/raw/raw5

 

- VOTE 디스크 변경사항 확인

[root@rac1 db]# crsctl query css votedisk

 

Database 생성스크립트 제작

-(rac1) dbca 실행

[root@rac1 db]# su - oracle

[oracle@rac1 ~]# dbca 

 

 

 

DATA disk group에서 임시로 사용했던 raw device 데이터 삭제

[root@rac1 db]# dd if=/dev/zero of=/dev/raw/raw6 bs=8k

[root@rac1 db]# dd if=/dev/zero of=/dev/raw/raw7 bs=8k

[root@rac1 db]# dd if=/dev/zero of=/dev/raw/raw8 bs=8k

 

DB 생성 스크립트 수정 (rac1만 수정)

[root@rac1 ~]# su - oracle

[oracle@rac1 ~]$ cd /oracle11/oracle/admin/racdb/scripts

 

 

[oracle@rac1 scripts]$ vi racdb1.sql

(변경전)


(변경후)

[oracle@rac1 scripts]$ vi CreateDB.sql

(변경전)

(변경후)

[oracle@rac1 scripts]$ vi CreateDBFiles.sql

(변경전)

(변경후)

[oracle@rac1 scripts]$ vi postDBCreation.sql

(변경전)

(변경후)

[oracle@rac1 scripts]$ vi init.ora

권한 때문에 에러가 날 수도 있으니 실행전 한번 더 수행!

chown -R oracle.dba /home/oracle

chown -R oracle.dba /oracle11

 

(rac1에서 실행)

[oracle@rac1 scripts]$ . racdb1.sh

계정 설정한 암호 3번 입력!

 

rac1 완료후에

 

(rac2에서 실행)

[oracle@rac2 scripts]$ . racdb2.sh

계정 설정한 암호 3번 입력!

-(rac1) ASM resource 제거

[oracle@rac1 scripts]$ srvctl stop database -d racdb

[oracle@rac1 scripts]$ srvctl stop diskgroup -g data

[oracle@rac1 scripts]$ srvctl stop asm -n rac1 -f

[oracle@rac1 scripts]$ srvctl stop asm -n rac2 -f

[oracle@rac1 scripts]$ srvctl remove diskgroup -g data -f

[oracle@rac1 scripts]$ srvctl remove asm -f

[oracle@rac1 scripts]$ srvctl modify database -d racdb -z

[oracle@rac1 scripts]$ srvctl start database -d racdb

 

-(rac1) RAC 전환

[oracle@rac1 scripts]$ srvctl stop database -d racdb

[oracle@rac1 scripts]$ sqlplus / as sysdba

SQL> startup

SQL> alter system set cluster_database=true scope=spfile sid='*';

SQL> shutdown immediate

SQL> exit

- rac1 확인

[oracle@rac1 scripts]$ srvctl start database -d racdb

[oracle@rac1 scripts]$ sqlplus / as sysdba

SQL> select instance_name,status from v$instacne;

- rac2 확인

[oracle@rac2 scripts]$ sqlplus / as sbsdba

SQL> select instnace_name, status from v$instance;

'Study Note > Database' 카테고리의 다른 글

Oracle Architecture  (0) 2016.01.27
Oracle RAC(Real Application Clusters)  (0) 2016.01.27
Oracle 11g RAC 설치 on OEL - 3  (0) 2016.01.25
Oracle 11g RAC 설치 on OEL - 2  (0) 2016.01.25
Oracle 11g RAC 설치 on OEL - 1  (0) 2016.01.25

  vi /etc/ssh/sshd_config

Permitrootlogin yes 주석 해제

/etc/hosts 파일 수정

1. vi 편집기로 /etc/hosts 파일 수정

# vi /etc/hosts

2. 아래와 같이 내용 편집

127.0.0.1 localhost.localdomain localhost

# Public

192.168.40.11    rac1

192.168.40.12    rac2

# Private192.168.2.120    rac1-priv

192.168.2.130    rac2-priv

# VIP

192.168.40.21    rac1-vip

192.168.40.22    rac2-vip

192.168.40.23    rac-scan

앞서 설정한 Pulic Private, VIP IP를 설정해준다.

참고로 여기에 적힌 IPVMware마다 다르니 참고할 것!!

# service network restart

- 필요 없는 서비스 중지 ( 부팅 속도가 빨라질 수 있음)

chkconfig --level 123456 xinetd off

chkconfig --level 123456 sendmail off

chkconfig --level 123456 cups off

chkconfig --level 123456 cups-config-daemon off

chkconfig --level 123456 smartd off

chkconfig --level 123456 iptables off

 

- 오라클 계정 생성

groupadd -g 5000 dba

groupadd -g 5001 oinstall

useradd -g oinstall -G dba -d /home/oracle oracle

passwd oracle

 

- 공유 메모리 설정

# vi /etc/sysctl.conf

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

net.ipv4.ip_local_port_range = 9000 65500

net.core.wmem_max = 1048576

net.core.rmem_default = 4194304

net.core.rmem_max = 4194304

net.core.wmem_default = 262144

fs.file-max = 6815744

fs.aio-max-nr = 1048576

 

# sysctl -p // sysctl.conf 에 있는 설정을 로드한다.

 

- 공유 자원 설정

# vi /etc/security/limits.conf

grid soft nproc 2047

grid hard nproc 16384

grid soft nofile 1024

grid hard nofile 65536

oracle soft nproc 2047

oracle hard nproc 16384

oracle soft nofile 1024

oracle hard nofile 65536

 

- /etc/pam.d/login 파일 내용 추가 

session required pam_limits.so

 

- /etc/modprobe.conf 파일 내용 추가

# vi /etc/modprobe.conf

options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180

 

 

/etc/rc.local 파일 내용 추가

# vi /etc/rc.local

/sbin/modprobe hangcheck-timer rdate -s 203.248.240.140

 

/etc/sysconfig/ntpd파일 내용 추가

# vi /etc/sysconfig/ntpd

OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"

=> 2번째 줄 -x 옵션 추가 후 저장

 

 

# service ntpd restart

# chkconfig --level 123456 ntpd on

 

[root@rac1 Server]# pwd

/media/OL5.9 i386 dvd 20130111/Server

**** 위에 경로가 없을 시 리눅스 셧다운 후 iso 다시 마운트 하고 재부팅 시 생성 됨

# rpm -Uvh libaio-devel-0.3.106-5.i386.rpm

# rpm -Uvh numactl-devel-0.9.8-12.0.3.el5_6.i386.rpm

# rpm -Uvh unixODBC-*

 

- rac1 환경 변수 설정

[root@rac1 ~]# vi .bash_profile

export GRID_HOME=/oracle11/11g/grid

export PATH=$PATH:$HOME/bin:$GRID_HOME/bin

 

[root@rac1 ~]#  vi /home/oracle/.bash_profile

export PATH

export EDITOR=vi

export TMP=/tmp

export TMPDIR=$TMP

export ORACLE_HOSTNAME=rac1

export ORACLE_UNQNAME=racdb

export ORACLE_BASE=/oracle11/oracle

export ORACLE_HOME=$ORACLE_BASE/11g/db

export GRID_HOME=/oracle11/11g/grid

export ORACLE_SID=racdb1

export ORACLE_TERM=xterm

export PATH=/usr/sbin:$PATH

export PATH=$ORACLE_HOME/bin:$GRID_HOME/bin:$PATH

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib

export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib

 

Disk 설정

# fdisk /dev/sdb

n - p - 1 - 엔터 - 엔터 - t - 8e - p - w 순 으로 입력

The number of cylinders for this disk is set to 1305.

There is nothing wrong with that, but this is larger than 1024,

and could in certain setups cause problems with:

1) software that runs at boot time (e.g., old versions of LILO)

2) booting and partitioning software from other OSs

(e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): n

Command action

e extended

p primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-1305, default 1): 엔터

Using default value 1

Last cylinder or +size or +sizeM or +sizeK (1-1305, default 1305): 엔터

Using default value 1305

Command (m for help): t

Selected partition 1

Hex code (type L to list codes): 8e

Changed system type of partition 1 to 8e (Linux LVM)

Command (m for help): p

Disk /dev/sdb: 10.7 GB, 10737418240 bytes

255 heads, 63 sectors/track, 1305 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

/dev/sdb1 1 1305 10482381 8e Linux LVM

Command (m for help): w

The partition table has been altered!

Calling ioctl() to re-read partition table.

Syncing disks.

#

 

# pvcreate rac /dev/sdb1

#vgcreate rac /dev/sdb1

 

- Logical Volume 생성

pvcreate rac /dev/sdb1

vgcreate rac /dev/sdb1

lvcreate -L 300M -n ocr01 rac

lvcreate -L 300M -n ocr02 rac

lvcreate -L 300M -n vote01 rac

lvcreate -L 300M -n vote02 rac

lvcreate -L 300M -n vote03 rac

lvcreate -L 700M -n system rac

lvcreate -L 700M -n sysaux rac

lvcreate -L 700M -n users rac

lvcreate -L 700M -n undotbs1 rac

lvcreate -L 700M -n undotbs2 rac

lvcreate -L 700M -n temp rac

lvcreate -L 100M -n control01 rac

lvcreate -L 100M -n control02 rac

lvcreate -L 100M -n control03 rac

lvcreate -L 200M -n redo01 rac

lvcreate -L 200M -n redo02 rac

lvcreate -L 200M -n redo03 rac

lvcreate -L 200M -n redo04 rac

lvcreate -L 200M -n redo05 rac

lvcreate -L 200M -n redo06 rac

lvcreate -L 100M -n spfile rac

 

■ 생성 확인

# lvscan

 

- Raw Device Rule 구성

# vi /etc/udev/rules.d/60-raw.rules

ACTION=="add", KERNEL=="raw*", OWNER=="oracle", GROUP=="dba", MODE=="0660"

 

- Raw Device Mapping

# vi /etc/sysconfig/rawdevices

/dev/raw/raw1 /dev/rac/ocr01

/dev/raw/raw2 /dev/rac/ocr02

/dev/raw/raw3 /dev/rac/vote01

/dev/raw/raw4 /dev/rac/vote02

/dev/raw/raw5 /dev/rac/vote03

/dev/raw/raw6 /dev/rac/system

/dev/raw/raw7 /dev/rac/sysaux

/dev/raw/raw8 /dev/rac/users

/dev/raw/raw9 /dev/rac/temp

/dev/raw/raw10 /dev/rac/undotbs1

/dev/raw/raw11 /dev/rac/undotbs2

/dev/raw/raw12 /dev/rac/redo01

/dev/raw/raw13 /dev/rac/redo02

/dev/raw/raw14 /dev/rac/redo03

/dev/raw/raw15 /dev/rac/redo04

/dev/raw/raw16 /dev/rac/redo05

/dev/raw/raw17 /dev/rac/redo06

/dev/raw/raw18 /dev/rac/control01

/dev/raw/raw19 /dev/rac/control02

/dev/raw/raw20 /dev/rac/control03

/dev/raw/raw21 /dev/rac/spfile

 

- Raw Device 재시작

# /etc/init.d/rawdevices restart

 

 

- Raw Device 권한 확인

ls -al /dev/raw/raw*

폴더 복사

1. 윈도우의 내컴퓨터 실행

2. C:\VM\Rac1 폴더 이동 // 나의 VMware 파일 경로

3. 아래 2개의 파일을 복사 (Ctrl + C) // 파일 아이콘 및 유형으로 확인할 것

Rac 설치 준비를 해둔 VMware 파일을 이용하여 Rac 두번째 노드를 손쉽게 구성하기 위해서 복사를 한다.

이 과정을 대신에 직접 Rac2 노드를 생성해도 된다.

 

폴더 이동

1. C:\VM 폴더에 Rac2 폴더 생성

2. C:\VM\Rac2 폴더에 복사한 파일 붙여넣기 (Ctrl + V)

3. 파일이름 변경 (Rac1 -> Rac2)

VMware 설정 파일 변경

1. 이름을 변경한 Rac2 파일중 Configuration 파일을 메모장으로 오픈 (용량이 가장 적은 파일)

2. 검색 기능 (Ctrl + F) 을 이용하여 Rac1 을 검색 후 모두 Rac2 로 바꿔줌

3. 저장 후 종료

4. 변경 완료 된 설정 파일 실행 (더블 클릭)

파일은 복사해 왔지만 VMware 의 설정은 모두 Rac1 로 되어있을 것이기 때문에 이를 Rac2 로 변경해주는 것이다.

 

Rac2 VMware 에 추가

1. VMware 가 실행되면서 Rac2 가 추가됨

2. Rac2 실행

 

복사한 Node 2 초기 설정 변경

복사 유,

I copied it 클릭

 

 

rac2 환경설정

# neat

# service network restart

 

# vi .bash_profile

export GRID_HOME=/oracle11/11g/grid

export PATH=$PATH:$HOME/bin:$GRID_HOME/bin

추가

 

# vi /home/oracle/.bash_profile

export ORACLE_HOSTNAME=rac2

export ORACLE_SID=racdb2

수정

 

설치파일 복사 및 RAC 설치 전 기본 환경설정

- (rac1) 파일 이동 후 압축 풀기

cd /home/oracle

unzip *.zip

 

- 설치파일 설치 디렉토리 소유권 oracle 계정으로 이전

(rac1,2전부 수행)

# chown -R oracle.dba /home/oracle

# chown -R oracle.dba /oracle11

 

- (rac1) cvuqdisk RPM 설치

[root@rac1 ~]# cd /home/oracle/grid/rpm

[root@rac1 rpm]# ls

cvuqdisk-1.0.7-1.rpm

[root@rac1 rpm]# export CVUQDISK_GRP=dba

[root@rac1 rpm]# rpm -Uvh cvuqdisk-1.0.7-1.rpm

- (rac1) scp를 이용하여 rac2노드에 cvudisk 복사

[root@rac1 rpm]# scp cvuqdisk-1.0.7-1.rpm rac2:~/

 

- (rac2) cvuqdisk-1.0.7-1.rpm 설치

[root@rac2 ~]# export CVUQDISK_GRP=dba

[root@rac2 ~]# rpm -Uvh cvuqdisk-1.0.7-1.rpm

 

- (rac1) Grid Infrastructure 설치

rac1oracle 계정 rac2root계정으로 로그인

[root@rac1 rpm]# su - oracle

[oracle@rac1 ~]$ cd /home/oracle/grid/

[oracle@rac1 grid]$ . runInstaller

 

rac1, rac2 위의 쉘을 root계정으로 수행 후 OK

ignore All 체크 후 Next

65%에서 한동안 멈춤 당황하지 말 것.

script 실행 순서 :

rac1 - 1sh

rac1 - 2sh

rac2 - 1sh

rac2 - 2sh2sh돌릴 때 입력키는 그냥 Enter

** 절대 동시에 실행 시키지 말 것 !! 순서 지켜 실행시킬 것!!

원래 뜨는 에러이니 당황하지 말 것

 

 

[root@rac1 oracle]# crs_stat -t

 

 이 화면 나온다면 crs 설치 완료

'Study Note > Database' 카테고리의 다른 글

Oracle Architecture  (0) 2016.01.27
Oracle RAC(Real Application Clusters)  (0) 2016.01.27
Oracle 11g RAC 설치 on OEL - 4  (0) 2016.01.25
Oracle 11g RAC 설치 on OEL - 2  (0) 2016.01.25
Oracle 11g RAC 설치 on OEL - 1  (0) 2016.01.25

2. OEL 설치

(리눅스 설치 및 네트워크 ip 설정)

boot 화면에서 Enter --> Skip 클릭! --> NEXT! --> english --> U.S. English

--> 경고시 YES --> Create custom layout 으로 파티션 설정

※ 각 Mount Point 별 용량 할당량

  / 7000

 /boot 100

 /var 1000

 swap 3000

 /home 8000

 /oracle11 나머지

 

 

 

 

 * sda 만 체크해주고 넘어가야함

sdb에는 추후 Logical Volume 생성

 사이즈 조정 'Fill to maxmum allowable size' 선택

 nat 과 host-only ip 확인

nat : 서버 외부 통신 (eth0)

host-only : 서버 내부 통신(eth1)

 

Desktop Enviroments - 변경 x

Applications - 그래픽 인터넷, 편집기 두고 다 지움

Development - 모두 체크

Servers - Server Configuration tools 만 체크

Base System - System Tools 추가 체크

* optional packagesysstat 체크하고 Close!

Cluster Storate,Clustering,Virtualization - 셋다 변경 x

Languages - Korean support

 

 Disabled

Disabled

추후 추가. 에러메세지 발생해도 그냥 넘어감

# ifconfig : ip 주소 확인

# netstat -nr : gateway 확인

 

'Enable IPv6 configuration for this interface' 체크 해제

(eth0) nat 영역대 ip 등록

'Enable IPv6 configuration for this interface' 체크 해제

(eth1) host-only 영역대 ip 등록

eth1은 Gateway를 입력하지 않는다.

 DNS네임과 DNS ip 추가 입력

 

ip설정 완료 후 네트워크 재시작

# service network restart

 

 

 

 

'Study Note > Database' 카테고리의 다른 글

Oracle Architecture  (0) 2016.01.27
Oracle RAC(Real Application Clusters)  (0) 2016.01.27
Oracle 11g RAC 설치 on OEL - 4  (0) 2016.01.25
Oracle 11g RAC 설치 on OEL - 3  (0) 2016.01.25
Oracle 11g RAC 설치 on OEL - 1  (0) 2016.01.25

1. VMware 환경 구성 (Virtual Machine Workstation 9 버전)

 Hardware 정보가 위와 아래가 다른데 실패를 여러번 해서 캡쳐를 전에 떠논걸 쓰다보니 이렇게 되었습니다.

다하고 나서 확인해서 참고 해주길 바랍니다. ( 입력하시는 창 그대로 따라하시면 됩니다. 이후 과정도 마찬가지로 )

위의 파일을 메모장으로 open 후, 아래 문장 추가

disk.locking = "FALSE"

diskLib.dataCacheMaxSize = "0"

scsi1.sharedBus = "virtual"

scsi1:0.deviceType = "disk"

CD 삽입 후 종료.

 

'Study Note > Database' 카테고리의 다른 글

Oracle Architecture  (0) 2016.01.27
Oracle RAC(Real Application Clusters)  (0) 2016.01.27
Oracle 11g RAC 설치 on OEL - 4  (0) 2016.01.25
Oracle 11g RAC 설치 on OEL - 3  (0) 2016.01.25
Oracle 11g RAC 설치 on OEL - 2  (0) 2016.01.25

+ Recent posts