본문 바로가기

Program/Oracle

[Oracle] Oracle Startup & Shutdown (Parameter Files / Control Files)

정성 가득한 글을 작성하신 원작자님께 감사드린다.

출처 : http://blog.naver.com/zoshstbt/50131709680


 

가장 먼저 sqlplus User Process를 통한 startup 명령이 Server Process로 전달되면서 startup 과정이 시작된다.


① nomount 상태로 진입하기 위해 Server Process는 parameter file을 읽어들인다.

- pfile : 8i까지 기본으로 사용되는 parameter file

- spfile : 9i부터 추가된 parameter file로 기본으로 사용됨

Server Process는 위의 parameter 중에서 하나를 읽어서 적절하게 Instance를 생성한다.(SGA, background process)


② mount 상태로 진입하기 위해서는 control file이 사용된다. 이 control file은 전 단계에서 사용된 parameter file에 해당 위치가 기록되어 있으며, database의 상태를 기록하고 있다. database의 이상 유무를 점검하기 위한 준비단계로 볼 수 있다.


③ open 단계로 진입하기 위해서는 data fileredo log file이 존재하여야 하며, 이 파일들의 위치는 전 단계에서 사용된 control file에 해당 위치가 기록되어 있다. control file의 정보와 data file의 헤더 내용을 확인하여 Instance Crash 상태였다며 Instance Recovery 과정을 통해서 Database 복구가 진행되는 단계이다. 정상적일 경우 Database가 정상적으로 사용가능한 open 상태로 변경된다.


1. Parameter File


1.1 pfile(Parameter File)

기본 이름은 initSID.ora 형식을 가지며(SID는 Instance ID를 나타냄), startup 과정에서 특정 위치를 나타내지 않으면, Server Process는 해당 파일을 기본 디렉터리인 $ORACLE_HOME/dba 경로에서 찾게된다.

  • Oracle 8i까지 기본으로 사용되던 parameter file로 일단 Text 파일이라서 에디터 프로그램으로 열어서 확인 및 내용 수정이 가능하다.
  • alter system 명령으로 Database 구동 중에 parameter 값을 변경할 수는 있으나 SCOPE의 값이 MEMORY 값을 갖기 때문에 값을 변경하여도 pfile에는 적용되지 않는다. 때문에 재부팅 후에는 다시 원본 pfile의 내용이 적용되기 때문에 지속적으로 적용하고자 한다면 pfile을 직접 수정해 주어야 한다.
  • Oracle 10g의 경우 Database를 설치한 초기 상태라면 pfile이 존재하지 않는다. pfile을 사용하기 위해서는 다음의 경로에서 init.ora.라는 이름으로 시작하는 sample 파일을 $ORACLE_HOME/dbs/initSID.ora 파일로 복사하면 된다.
    • $ORACLE_BASE/admin/testdb/pfile/


1.2 spfile(Server Parameter File)

기본 이름은 spfileSID.ora 형식을 가지며(SID는 Instance ID를 나타냄), startup 과정에서 특정 위치를 나타내지 않으면, Server Process는 해당 파일을 기본 디렉터리인 $ORACLE_HOME/dbs 경로에서 찾게 된다.

  • Oracle 9i에서부터 추가된 parameter file로 binary 형식이기 때문에 에디터를 사용하여 직접 수정할 수 없다. 때문에 alter system 명령으로 동적으로 값을 적용해주어야 한다. 동적으로 parameter 값을 수정하는 경우 다음과 같이 3가지의 SCOPE 상태를 갖을 수 있다.
    • both : spfile, 현재 Instance 상태 모두 변경
    • spfile : spfile에는 적용하고, 현재 Instance 상태는 변경하지 않는다. 재부팅 후 적용된다.
    • memory : pfile의 parameter 동적 수정 방식과 동일하게 현재 Instance 상에서만 값을 수정한다. scope를 지정하지 않는 경우 기본값.
  • spfile의 복사 및 이동 작업의 경우 Oracle Server의 상태를 shutdown한 상태에서 진행해야 한다.


1.3 parameter file 생성

pfile 또는 spfile이 $ORACLE_HOME/dba/ 경로 내에 존재한다고 가정하고, 다음과 같은 명령으로 각각의 파일을 생성할 수 있다.

  • spfile로부터 pfile 생성
    • SQL> create pfile from spfile;
  • pfile로부터 spfile 생성
    • SQL> create spfile from pfile;
Server Process는 $ORACLE_HOME/dbs/ 경로에 만약 pfile과 spfile 모두 존재할 경우 spfile을 parameter file을 기본으로 사용한다.
pfile을 사용하고자 한다면 spfile을 삭제하거나, 이름을 변경 하여 pfile만 남게하면 된다.


1.4 사용된 parameter file 확인

Database startup시 사용된 parameter file을 확인하기 위해서는 다음과 같은 명령으로 확인할 수 있다.

SQL> show parameter pfile;

or SQL> show parameter spfile;

NAME TYPE VALUE

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

spfile string


위와 같이 value 컬럼에 값이 나오지 않으면, nomount 상태로 진입할 때 pfile이 사용된 것이다.


SQL> show parameter pfile;

or SQL> show parameter spfile;

NAME TYPE VALUE

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

spfile string /home/oracle/product/10g/dbs/s

pfiletestdb.ora


위와 같이 value 컬럼에 spfile parameter file 경로나 나오게 되면 nomount 상태로 진입할 때 spfile이 사용된 것이다.



2. Control File

Oracle을 운영하는데 중요한 정보를 저장하고 있는 binary 파일로서, Database를 생성할 때 만들어진다.

Server Process를 통해서만 수정 및 관리가 가능하며, 내용을 수정이나 삭제 또는 추가 하고 싶은 경우 DDL 문을 사용하면 된다.

Control File은 Oracle Server 구동에서 매우 중요한 역할을 하기 때문에 해당 파일들을 하나의 디렉터리 밑에 모아 두는것은 위험하며, 다중화 하며 보관해야 한다.


2.1 Control File 관리(pfile 이용)

pfile내의 control file의 위치 정보


*.control_files='/home/oracle/oradata/testdb/control01.ctl',

'/home/oracle/oradata/testdb/control02.ctl',

'/home/oracle/oradata/testdb/control03.ctl'


위와 같이 각 control 파일의 전체경로를 명시되어 있으며, 해당 control file들을 다중화 하여 보관하기 위해 다음과 같이 수정 할 수 있다.


*.control_files='/home/oracle/oradata/disk1/testdb/control01.ctl',

'/home/oracle/oradata/disk2/testdb/control02.ctl',

'/home/oracle/oradata/disk3/testdb/control03.ctl'


해당 경로를 수정한 후 startup 명령을 수행했을 때, 수정한 경로에 control file이 존재하지 않을 경우 다음과 같은 에러 메시지가 나타난다.

ORA-00205: error in identifying control file, check alert log for more info


위와 같은 에러메시지가 나타나고 Oracle Server는 nomount 상태에서 더이상 진행되지 못하고 멈추게 된다.


SQL> select status from v$instance;


STATUS

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

STARTED


때문에 pfile내의 control_files parameter 값을 변경하였을 경우에는 해당 경로에 control file이 존재하여야 startup 과정에서 문제가 발생되지 않는다.


control_files parameter의 경로를 올바르게 수정 또는 해당 파일을 올바른 위치에 복사한 후 startup 과정을 계속 진행하기 위해서는 shutdown 후 pfile의 control_files parameter를 수정한 후 다시 startup을 진행 하여야 한다.

* pfile을 alter system 명령을 사용하여 현재 control_files parameter를 변경하는 방법은 사용될 수 없다. 아래 spfile을 이용한 관리방법에서 살펴보겠지만 기본적으로 pfile에 대한 alter system 명령은 scope 값을 memory를 갖기 때문에 현재 Instance 상에서 변경을 발생 시킨다. 하지만 control_files parameter는 scop 값이 spfile에 대해서만 적용 가능하다.


2.2 Control File 관리(spfile 이용)

spfile내의 control file의 위치 정보


spfile은 binary 파일이어서 내부 내용을 확인할 수 없기 때문에 show parameter 명령으로 확인하여야 한다.


SQL> show parameter control_files;


NAME TYPE VALUE

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

control_files string /home/oracle/oradata/testdb/co

ntrol01.ctl, /home/oracle/orad

ata/testdb/control02.ctl, /hom

e/oracle/oradata/testdb/contro

l03.ctl


spfile을 사용하는 경우 control file의 다중화 보관을 위해서는 alter system 명령을 사용해야 한다.(binary file이기 때문에)


SQL> alter system set

control_files='$ORACLE_BASE/oradata/disk1/testdb/control01.ctl','$ORACLE_BASE/oradata/disk2/testdb/control02.ctl',

'$ORACLE_BASE/oradata/disk3/testdb/control03.ctl' scope=both;

alter system set

control_files='$ORACLE_BASE/oradata/disk1/testdb/control01.ctl','$ORACLE_BASE/oradata/disk2/testdb/control02.ctl',

'$ORACLE_BASE/oradata/disk3/testdb/control03.ctl' scope=both

*

ERROR at line 1:

ORA-02095: specified initialization parameter cannot be modified



SQL> alter system set

control_files='$ORACLE_BASE/oradata/disk1/testdb/control01.ctl','$ORACLE_BASE/oradata/disk2/testdb/control02.ctl',

'$ORACLE_BASE/oradata/disk3/testdb/control03.ctl' scope=memory;

alter system set

control_files='$ORACLE_BASE/oradata/disk1/testdb/control01.ctl','$ORACLE_BASE/oradata/disk2/testdb/control02.ctl',

'$ORACLE_BASE/oradata/disk3/testdb/control03.ctl' scope=memory

*

ERROR at line 1:

ORA-02095: specified initialization parameter cannot be modified



SQL> alter system set

control_files='$ORACLE_BASE/oradata/disk1/testdb/control01.ctl','$ORACLE_BASE/oradata/disk2/testdb/control02.ctl',

'$ORACLE_BASE/oradata/disk3/testdb/control03.ctl' scope=spfile;


System altered.


위에서 보이는 것과 같이 control_files parameter를 변경하는데 scope의 값이 spfile(spfile에만 적용하고 재부팅시에 적용됨)일 경우에만 정상적으로 parameter 값이 변경되었다.


spfile cope 값으로 명령이 정상적으로 처리되었지만 아래와 같이 현재 Instance 상의 parameter 값을 조회해 보면 변경이 되지 않은 것을 확인할 수 있다.


SQL> show parameter control_files;


NAME TYPE VALUE

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

control_files string /home/oracle/oradata/testdb/co

ntrol01.ctl, /home/oracle/orad

ata/testdb/control02.ctl, /hom

e/oracle/oradata/testdb/contro

l03.ctl


scope=spfile 을 사용하여 parameter를 변경하였기 때문에 해당 spfile 내에서 control_files parameter 가 변경되었는 확인하려면 다음과 같은 명령을 사용해야 한다.


SQL> select value from v$spparameter where name='control_files';


VALUE

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

$ORACLE_BASE/oradata/disk1/testdb/control01.ctl

$ORACLE_BASE/oradata/disk2/testdb/control02.ctl

$ORACLE_BASE/oradata/disk3/testdb/control03.ctl


이렇게 control_files의 경우 scope의 값이 spfile인 경우에만 적용가능한 이유는 initial parameter의 종류에는 Database가 운영중에는(Instance 상에서는) 바로 그 값을 변경하여 반영시킬 수 없고, shutdown된 후 다음 startup된 시점에 변경된 값이 적용되는 parameter가 존재하기 때문이다. 이러한 parameter를 static parameter라 부르며, 다음과 같이 확인할 수 있다.


SQL> select name, issys_modifiable from v$parameter

2 order by name;


NAME ISSYS_MODIFIABLE

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

O7_DICTIONARY_ACCESSIBILITY FALSE

....

control_file_record_keep_time IMMEDIATE

control_files FALSE

core_dump_dest IMMEDIATE

...


ISSYS_MODIFIABLE 상태

  • FALSE
    • static parameter로 scope=spfile을 사용해서만 값의 변경이 가능하며, 바로 적용되지 않고 다음 startup 시에 적용됨
  • IMMEDIATE
    • 값을 변경하면 현재 session의 Instance 상에서 바로 적용 가능함
  • DEFERRED
    • 변경된 값이 이후 접속되는 session부터 영향을 줌


출처 : http://blog.naver.com/zoshstbt/50131709680