오라클에 사용되는 파라미터 파일을 살펴보면 tnsnames.ora, LISTENER.ora, sqlnet.ora, cman,ora, ldap.ora와 같은 파일들이 있다.
이 파일들은 네트워크를 통한 데이터베이스 접속시에 사용되는 파라미터 파일들로, 이 책에서는 다루지 않을 예정이다.

여기서는 데이터베이스와 관련있는 파라미터 파일들만을 다룰 것이며, 이 파일들은 init file 혹은 init.ora라는 이름으로 알려져있다. 해당 파일들의 기본 파일명이 init<ORACLE_SID>.ora이기 때문이다.
헌데 오라클 9iR1에서 SPFILE(server parameter file)이라는 새로운 방식이 소개되었고, 이를 통해 파라미터 설정과 저장이 훨씬 편하게 바뀌었다. 그래서 현재는 spfile<ORACLE_SID>.ora라는 이름을 갖는 SPFILE을 주로 사용하고 있다.

파라미터 파일이 없으면 오라클을 기동할 수 없으며, 이 파일을 잘 관리하는 것 또한 중요한 일일 것이다. 오라클 9iR2부터는 RMAN 백업 수행시에 SPFILE도 포함시킬 수 있도록 바뀌었다. 그만큼 이 파일의 안전에 대한 보장이 필요하다는 이야기일 것이다.
SPFILE과 달리 PFILE(init.ora 파라미터 파일)은 텍스트 형식의 파일이며, 이 파일에 문제가 생기더라도 얼럿 로그 파일에 남아있는 오라클 기동 정보를 참고하여 텍스트 편집기를 통해 얼마든지 재생성이 가능한다.

SID
SID란 site identifier의 약자이다. 유닉스 환경이라면 ORACLE_SID와 ORACLE_HOME값을 해시하여 SGA 메모리 영역을 생성하거나 덧붙이기 위해 사용되는 유일한 키 값을 만든다. 만약 ORACLE_SID, ORACLE_HOME이 설정되어 있지 않다면, SGA영역으로 접근할 수 없기에 'ORACLE NOT AVAILABLE'과 같은 에러가 발생하게 된다.
윈도우 환경에서는 유닉스 환경에서처럼 프로세스간의 통신이 필요한 것은 아니지만, 같은 ORACLE_HOME 밑에 여러개의 데이터베이스가 있는 상황등에서 SID가 없으면 구성 파일들을 유일하게 식별할 수 없게 될 것이다.

파라미터란?

데이터베이스 파라미터는 'key'와 'value'를 하나의 세트로 이루어 구성된다. 파라미터에 대한 내용은 아래와 같이 V$PARAMETER 뷰를 통해서, 혹은 SHOW PARAMETER라는 명령을 통해서 조회 가능하다.

sys@CATDB> SELECT VALUE
  2  FROM v$parameter
  3  WHERE name = 'db_block_size'
  4  ;

VALUE
----------------------------------------------------------------------------------------------------
8192

sys@CATDB> show parameter db_block_s

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_size                        INTEGER     8192

 

이와 같은 경우에 key는 db_block_size가 되며, value는 8192가 되겠다. V$PARAMETER뷰에는 더 많은 컬럼이 들어있어 보다 많은 정보를 살펴볼 수 있다. SHOW PARAMETER 명령은 편의를 위해 매개 변수 앞뒤에 와일드 카드(%)를 삽입하여 검색해준다. V$PARAMETER 뷰에 대한 조회 권한이 없다면, V$PARAMETER뷰에 대한 조회는 물론이고, SHOW PARAMETER 명령 또한 사용이 불가능하다.

sys@CATDB> conn scott/tiger
Connected.
scott@CATDB> SELECT VALUE
  2  FROM v$parameter
  3  WHERE name = 'db_block_size'
  4  ;
FROM v$parameter
     *
ERROR AT line 2:
ORA-00942: TABLE OR VIEW does NOT exist
scott@CATDB> show parameter db_block_s
ORA-00942: TABLE OR VIEW does NOT exist

scott@CATDB> conn minhang/minhang
Connected.
(minhang계정에는 DBA권한이 있다)
minhang@CATDB> DESC v$parameter
 Name                                                  NULL?    TYPE
 ----------------------------------------------------- -------- ------------------------------------
 NUM                                                            NUMBER
 NAME                                                           VARCHAR2(80)
 TYPE                                                           NUMBER
 VALUE                                                          VARCHAR2(512)
 DISPLAY_VALUE                                                  VARCHAR2(512)
 ISDEFAULT                                                      VARCHAR2(9)
 ISSES_MODIFIABLE                                               VARCHAR2(5)
 ISSYS_MODIFIABLE                                               VARCHAR2(9)
 ISINSTANCE_MODIFIABLE                                          VARCHAR2(5)
 ISMODIFIED                                                     VARCHAR2(10)
 ISADJUSTED                                                     VARCHAR2(5)
 ISDEPRECATED                                                   VARCHAR2(5)
 DESCRIPTION                                                    VARCHAR2(255)
 UPDATE_COMMENT                                                 VARCHAR2(255)
 HASH                                                           NUMBER

 

만약 V$PARAMETER에 대한 조회 권한이 없더라도 dbms_utility.get_parameter_value라는 API를 통해서 파라미터값에 대한 조회가 가능하다.

scott@CATDB> CREATE OR REPLACE 
  2  FUNCTION get_param( p_name IN VARCHAR2 )
  3  RETURN VARCHAR2
  4  AS
  5      l_param_type  NUMBER;
  6      l_intval      BINARY_INTEGER;
  7      l_strval      VARCHAR2(256);
  8      invalid_parameter EXCEPTION;
  9      PRAGMA exception_init( invalid_parameter, -20000 );
 10  BEGIN
 11      BEGIN
 12          l_param_type := 
 13          dbms_utility.get_parameter_value
 14          ( parnam => p_name, 
 15              intval => l_intval,
 16            strval => l_strval );
 17      EXCEPTION
 18          WHEN invalid_parameter
 19          THEN
 20              RETURN '*access denied*';
 21      END;
 22      IF ( l_param_type = 0 )
 23      THEN
 24          l_strval := TO_CHAR(l_intval);
 25      END IF;
 26      RETURN l_strval;
 27  END get_param;
 28  /

FUNCTION created.

 

위와 같이 dbms_utility.get_parameter_value를 통해 파라미터를 조회하는 프로시저를 생성해준 뒤, 아래와 같이 실행해보면

scott@CATDB> EXEC dbms_output.put_line( get_param( 'db_block_size' ) );
8192

PL/SQL PROCEDURE successfully completed.

 

보시다시피 해당 파라미터의 value를 구할 수 있다. 허나,

scott@CATDB> EXEC dbms_output.put_line( get_param( 'pga_aggregate_target' ) );
*ACCESS denied*

PL/SQL PROCEDURE successfully completed.

 

몇몇 파라미터는 이와 같이 조회가 불가능한 것도 있다. 아래에서 보시다시피 sga_max_size, db_cache_size, pga_aggregate_target과 같은 메모리 관련 파라미터들이 그렇다.

sys@CATDB> SELECT name, scott.get_param( name ) val 
  2    FROM v$parameter 
  3   WHERE scott.get_param( name ) LIKE '*access%';

NAME                                 VAL
------------------------------------ ----------------------------------------
java_pool_size                       *ACCESS denied*
streams_pool_size                    *ACCESS denied*
shared_pool_reserved_size            *ACCESS denied*
sga_target                           *ACCESS denied*
db_cache_size                        *ACCESS denied*
db_2k_cache_size                     *ACCESS denied*
db_4k_cache_size                     *ACCESS denied*
db_8k_cache_size                     *ACCESS denied*
db_16k_cache_size                    *ACCESS denied*
db_32k_cache_size                    *ACCESS denied*
db_keep_cache_size                   *ACCESS denied*
db_recycle_cache_size                *ACCESS denied*
large_pool_size                      *ACCESS denied*
olap_page_pool_size                  *ACCESS denied*
sga_max_size                         *ACCESS denied*
shared_pool_size                     *ACCESS denied*
pga_aggregate_target                 *ACCESS denied*
db_recovery_file_dest_size           *ACCESS denied*

 

결과는 오라클 버전에 따라 조금 달라질 수 있으며, 9iR2는 258개, 10gR2는 259개, 11gR1는 294개, 11gR2는 342개의 파라미터를 확인할 수 있다. 새로운 기능의 추가와 더불어 추가된 파라미터들도 있지만, 아래와 같이 사라진 파라미터들도 존재한다.

sys@CATDB> ALTER SYSTEM SET distributed_transactions = 10;
ALTER SYSTEM SET distributed_transactions = 10
*
ERROR AT line 1:
ORA-25138: DISTRIBUTED_TRANSACTIONS initialization parameter has been made obsolete

 

이렇게 확인이 가능한 파라미터들을 문서화된 파라미터라고 하며, 해당 파라미터들에 대한 설명 또한 오라클에서 제공하고 있다. 이러한 파라미터 외에 히든 파라미터라고 불리우는 파라미터들도 있다. 이름처럼 숨어있어서 SHOW PARAMETER 명령어나 V$PARAMETER 뷰를 통해서는 확인이 불가능하다. 이를 확인하기 위해서는 SYSDBA 권한의 계정으로 아래의 쿼리를 수행해보도록 하자.

sys@CATDB> col ksppinm FOR a30
sys@CATDB> col ksppstvl FOR a30
sys@CATDB> SELECT a.ksppinm, b.ksppstvl 
  2  FROM x$ksppi a, x$ksppsv b
  3  WHERE a.indx=b.indx
  4  AND SUBSTR(ksppinm,1,1) = '_';

KSPPINM                        KSPPSTVL
------------------------------ ------------------------------
_trace_files_public            FALSE
_hang_analysis_num_call_stacks 3
_ior_serialize_fault           0
_inject_startup_fault          0
_latch_recovery_alignment      998
 ...
 ...
 ...

 

이렇게 언더바(_)기호로 시작되는 파라미터들이 바로 히든 파라미터인데, 이 파라미터들은

  1. 잘 사용되지 않으며,
  2. 용도 폐기된 기능을 사용하기 위해서 필요한 경우가 많으며,
  3. 과거 버전과의 호환성을 위해 제공되기도 하며,
  4. 데이터 복구를 지원하는 용도로 사용되기도 하고,
  5. 향후 지원될 기능을 미리 테스트하기 위해 제공되며,
  6. 문제 발생시 자세한 트레이스 파일을 생성하기 위해 쓰이기도 하며,
  7. 임의의 기능에 대한 변경 및 제약을 가하기 위해서 쓰이는 등

일반적인 경우에서 사용되는 파라미터들은 아니다. 따라서 이들 파라미터를 변경하는 데에 있어서 신중할 필요가 있을 것이고, 기왕이면 Oracle Support의 권고 없이는 변경하지 않기를 추천한다.

레거시 init.ora 파라미터 파일

레거시 init.ora 파일은 일반 텍스트 편집기를 사용하여 수정할 수 있는 ASCII파일이다. 그러한 파일 내에 아래와 같이 단순하게 오라클 파라미터와 key와 value를 적어 넣어준다.

실제 운영중인 서버에서 CREATE PFILE FROM SPFILE명령을 통해 생성해낸 PFILE에서 보안상 SID만 변경한 것이다.

SOSI_NO1.__db_cache_size=25971130368
SOSI_NO1.__java_pool_size=67108864
SOSI_NO1.__large_pool_size=67108864
SOSI_NO1.__oracle_base='/oracle'#ORACLE_BASE set from environment
SOSI_NO1.__pga_aggregate_target=4294967296
SOSI_NO1.__sga_target=27917287424
SOSI_NO1.__shared_io_pool_size=0
SOSI_NO1.__shared_pool_size=1543503872
SOSI_NO1.__streams_pool_size=67108864 
*._optim_peek_user_binds=FALSE
*.audit_file_dest='/oracle/admin/SOSI_NO1/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/data01/oradata/SOSI_NO1/control01.ctl','/data01/oradata/SOSI_NO1/control02.ctl','/data02/oradata/SOSI_NO1/control03.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_files=1000
*.db_name='SOSI_NO1'
*.db_recovery_file_dest='/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=5218762752
*.diagnostic_dest='/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=SOSI_NO1DB)'
*.max_dump_file_size='1000M'
*.nls_language='KOREAN'
*.nls_territory='KOREA'
*.open_cursors=300
*.processes=1000
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=1100
*.undo_tablespace='UNDOTBS1'
*.pga_aggregate_target=4294967296
*.sga_max_size=30064771072
*.sga_target=27917287424
*._log_io_size=65536
*._memory_broker_stat_interval=999
*._optimizer_extended_cursor_sharing_rel='NONE'
*._optim_peek_user_binds=FALSE

 

이와 같이 인스턴스 구성시에 필요한 메모리 사이즈나 최대 세션수와 같은 값들을 init.ora파일에 지정해 놓고 startup 명령어를 사용할 시에 pfile=filename 옵션을 사용하면 해당 PFILE 내용을 기반으로하여 오라클이 기동되게 된다.
단, ALTER SYSTEM 명령어를 사용하여 변경된 파라미터값은 PFILE에 자동으로 반영되지 않는다. 따라서 변경된 파라미터값을 직접 텍스트 편집기를 통해 PFILE에 넣어주지 않는다면, 오라클 재구동시에 PFILE을 다시 읽어들이며 과거의 파라미터값으로 돌아가게 될 것이다.

또 하나의 특이점은, PFILE의 위치가 반드시 오라클이 설치되어있는 서버여야 하는 것이 아니라, 오라클을 기동하려는 클라이언트 시스템에 있어도 된다는 것이다.
이 말은 곧, 오라클을 기동하려는 시스템에서 파라미터 파일을 참조하려 든다는 것이고, 수많은 DB 관리자들의 PC에 들어있는 모든 PFILE들의 내용을 동기화해야할 필요가 있다는 이야기가 된다.

즉, PFILE을 사용한다면 시스템에서 변경된 파라미터값이 PFILE에 자동으로 반영되지 않으며, 여러군데에 파라미터 파일이 산재해 있게되어 관리상에 불편함을 초래하게 된다. 이러한 두가지의 결점을 해결한 방식이 바로 9iR1에서 소개된 SPFILE이라는 방식이다.

레이블 (0)

  • 레이블 없음
댓글 쓰기...

첨부 파일  (0)

첨부 파일 추가하기
공유된 파일이 아직 없습니다.