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

c:\ 에 대체로 자기 램 용량만큼의 hiberfil.sys 가 보인다. 

hiberfil.sys 파일은 최대절전모드로 들어갈때 램을 하드로 백업해 놓는 역할이다.

 

1. 없애는 방법

관리자 모드의 cmd 로 들어가서
powercfg /hibernate off

이러면 종료메뉴에서 최대절전모드가 사라지면서 파일도 같이 없어진다.

다시 켜려면 on

 

2. 파일용량 줄이는 방법

powercfg /hibernate size (램 용량의 백분율 50~100, %는 쓰지 않음)

작업관리자에서 메모리사용량을 잘 보면서 조절하도록하자

모자라도 문제가 생긴다.

 

출처 : http://blog.naver.com/nasaman95/50175270886

by 짱구를꼭말려 2013. 8. 31. 14:16

★★★오라클 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

RHEL5 or OEL - 11g - ASM 설치 후 재부팅하면 오라클 디스크가 조회가 되지 않고, 시작도 안될 때

SQL> select status from v$instance;
select status from v$instance
*
ERROR at line 1:
ORA-01034: ORACLE not available
Process ID: 0
Session ID: 0 Serial number: 0


SQL> startup
ORA-00099: warning: no parameter file specified for ASM instance
ASM instance started

Total System Global Area  284565504 bytes
Fixed Size                  1336036 bytes
Variable Size             258063644 bytes
ASM Cache                  25165824 bytes
ORA-15110: no diskgroups mounted

 

[root@server122 ~]# oracleasm disks

(아무것도 안나옴)

 

▲ RHEL5, OEL에서는 dm-xxxxx 라는 파일에서 디스크를 찾게끔 만들어져 있다.
1.그 파일을 찾아서 주석처리를 해 주면 된다.
2.dm 부분을 ""이렇게 공백처리 해 주면 되나? (이건 해보진 않았다, 가설만 세움)

 

요약

11g asm 설치 후 oracleasm listdisks 했는데 디스크 목록이 안보일 경우 조치하기
해결책 : /etc/udev/rules.d/90-dm.rules 파일을 열어서 첫 번째 줄을 주석 처리할 것.

이 작업을 한 후 asm 은 정상 오픈 되었다.

이 아래는 해보진 않았지만 참고


 

 

** 위 작업 설명
We already had the same symptom of ORA-15032 & ORA-15063 mentioned in my last post. Trying to follow these instructions didn't help this time.

 

ls -l /dev/oracleasm/disks/*
rpm -qa | grep oracleasm ->
kfod asm_diskstring='ORCL:*' disks=all
(/etc/init.d/oracleasm) /etc/sysconfig/oracleasm conatin ORACLEASM_SCANORDER=dm
spfile has: asm_diskstring = /dev/dm*

 

All of these command worked fine. Beacause of the dm* parameter I checked the filesystem:

 

$ ls -l /dev/dm-*
/bin/ls: /dev/dm-*: No such file or directory

 

It seems that the dm* devices are missing and must be there for ASM by Note 602952.1 :

 

NOTE: When scanning, only the device names known by the kernel are scanned. With device-mapper, the kernel sees the devices as /dev/dm-XX. The /dev/mapper/XXX names are created by udev for human readability. Any configuration of ORACLEASM_SCANORDER or ORACLEASM_SCANEXCLUDE must use the dm prefix.

 

Since this Host is RedHat 5, we found the source of the problem by Note 558596.1:

 

Cause: The oracleasm scans /proc/partitions and expects devices to be available in /dev. If the device doesn't exist in /dev it will fail to open the device. RHEL/OEL5 does not create dm-xx devices in /dev by default.

Solution: Please comment out the following line in file /etc/udev/rules.d/50-udev.rules
#KERNEL=="dm-[0-9]*", ACTION=="add", OPTIONS+="ignore_device"
reboot and the problem should be gone.
Note: Newer versions of EL/RH 5 the udev rule has been moved to "/etc/udev/rules.d/90-dm.rules".

 


11g asm 설치 후 재부팅하면 DB 시작이 안되는 경우 조치방법
-> root 계정으로 $ASM_HOME/bin 아래에서
   ./crsctl start resource ora.cssd  실행

by 짱구를꼭말려 2013. 8. 13. 10:57