버전 비교

  • 이 줄이 추가되었습니다.
  • 이 줄이 삭제되었습니다.
  • 서식이 변경되었습니다.

SPFILE을 사용하게 되면 바로 위에서 언급했던 두가지 문제를 해결할 수 있게 된다.

  • 데이터베이스 외부에 존재하고 있는 파라미터 파일을, 텍스트 편집기를 통해 다시 수동으로 관리해주어야 하는 문제가 해결된다.
    SPFILE을      SPFILE을 사용하면 ALTER SYSTEM 명령을 통해 데이터베이스 상에서 SPFILE에 직접 변경된 내용을 기록할 수 있다. 또한 일부로 SCOPE=MEMORY 옵션을 주지 않는한, 변경된 파라미터가 SPFILE에도 자동으로 반영된다.
  • 파라미터 파일이, 데이터베이스 기동에 쓰는 다수의 클라이언트 시스템에 산재해 있고, 각각의 내용이 다르게 들어가있을 수 있는 문제가 해결된다.
    SPFILE은      SPFILE은 클라이언트 쪽이 아닌 데이터베이스 서버쪽에만 저장이 되며, 단 하나의 파일을 통해 파라미터를 관리하게 되기에, 서로 다른 내용의 수많은 파라미터 파일 속에서 혼돈이 발생할 일이 없다.

SPFILE은 기본적으로 $ORACLE_HOME/dbs/spfile<ORACLE_SID>.ora 라는 파일명으로 생성된다. 이 위치가 기본 경로이며, 오라클 기동시에 자동으로 기본 경로의 SPFILE부터 찾게된다. 따라서 기본 위치에 SPFILE을 두고 사용하는 것이 가장 관리가 편하다.

 

SPFILE로 변환하기

코드 블럭
sys@CATDB> startup pfile='/home/oracle/10g/dbs/initcatdb.ora'
ORACLE instance started.

Total SYSTEM Global Area  167772160 bytes
Fixed SIZE                  2094800 bytes
Variable SIZE             125831472 bytes
DATABASE Buffers           33554432 bytes
Redo Buffers                6291456 bytes
DATABASE mounted.
DATABASE opened.
sys@CATDB> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string

-- 현재 이렇게 PFILE을 이용해서 DB를 기동한 상태이다. 이 때에 spfile 파라미터에 대한 value는 빈칸이 된다.
-- SPFILE의 생성은 PFILE을 통해서 가능하며, 이때 사용되는 명령어가 CREATE SPFILE FROM PFILE이다.
-- PFILE의 위치는 특정지어 줄 수도 있으며, 지정하지 않으면 기본 경로의 PFILE을 이용한다. 기동시의 PFILE이 아니다.
-- SPFILE의 위치 또한 특정지어 줄 수 있으며, 지정하지 않으면 기본 경로의 SPFILE명이 사용된다.
-- SPFILE의 생성을 위해서는 오라클을 기동할 수 있는 권한이 있어야한다.

sys@CATDB> conn minhang/minhang
Connected.
minhang@CATDB> CREATE spfile FROM pfile;
CREATE spfile FROM pfile
*
ERROR AT line 1:
ORA-01031: insufficient PRIVILEGES

-- 이와같이 DBA 권한을 가지고있는 minhang 계정으로도 SPFILE을 생성하는 것은 불가능하다.
-- 허나 아래와 같이 SYSDBA나 SYSOPER와 같은 DB 기동 권한을 가진 계정으로 로그인하면 SPFILE의 생성이 가능하다.
minhang@CATDB> conn / AS sysoper
Connected.
PUBLIC@CATDB> CREATE spfile FROM pfile;

FILE created.

PUBLIC@CATDB> conn / AS sysdba
Connected.
sys@CATDB> CREATE spfile FROM pfile;

FILE created.

sys@CATDB> conn minhang/minhang AS sysdba
Connected.
sys@CATDB> CREATE spfile FROM pfile;

FILE created.

sys@CATDB> 
sys@CATDB> conn minhang/minhang AS sysoper
Connected.
PUBLIC@CATDB> CREATE spfile FROM pfile;

FILE created.

-- SPFILE명을 지정하지 않았으므로 기본 경로에 위치하게 된다.
-- 또한 오라클을 기동할 시에는 기본 경로의 SPFILE을 가장 먼저 참조하게 된다.
-- 즉 이 상태에서 오라클을 재기동하면 방금 생성해준 SPFILE을 참조하여 구동될 것이다.
-- 아래 예시를 통해서는 SYSOPER권한의 계정이 DB를 재기동 시키는 것이 가능하다는 것과,
-- 해당 권한의 계정으로는 DB재기동은 가능하나 V$PARAMETER뷰는 조회할 수 없다는 것을 확인할 수 있다.

PUBLIC@CATDB> startup force
ORACLE instance started.
DATABASE mounted.
DATABASE opened.
PUBLIC@CATDB> show parameter spfile
ORA-00942: TABLE OR VIEW does NOT exist


PUBLIC@CATDB> conn / AS sysdba
Connected.
sys@CATDB> show parameter spfile 

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /home/oracle/10g/dbs/spfilecat
                                                 db.ora
-- SPFILE을 통해 오라클을 기동하면, 기동시 이용한 SPFILE명이 파라미터 spfile의 value로 들어가며,
-- 보시다시피 지금은 기본 경로의 SPFILE로 기동된 상태이다


RAC 구성과 같은 특수한 상황에서는 여러 인스턴스가 하나의 SPFILE을 참조하게 된다. 이 때에 사용될 SPFILE을 생성하려 한다면, 단일 인스턴스들이 갖고있는 개별 PFILE의 내용을 하나로 합친 상태에서 SPFILE로 변환해주어야 한다. 이때에 합쳐진 PFILE은 아래와 같은 형태가 된다.

서식 미적용
rac2.__db_cache_size=184549376
rac1.__db_cache_size=201326592
rac1.__java_pool_size=4194304
rac2.__java_pool_size=4194304
rac2.__large_pool_size=8388608
rac1.__large_pool_size=8388608
rac1.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
rac2.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
rac1.__pga_aggregate_target=297795584
rac2.__pga_aggregate_target=297795584
rac1.__sga_target=553648128
rac2.__sga_target=553648128
rac1.__shared_io_pool_size=0
rac2.__shared_io_pool_size=0
rac2.__shared_pool_size=339738624
rac1.__shared_pool_size=327155712
rac1.__streams_pool_size=4194304
rac2.__streams_pool_size=8388608
*.audit_file_dest='/u01/app/oracle/admin/rac/adump'
*.audit_trail='db'
*.cluster_database=true
*.compatible='11.2.0.0.0'
*.control_file_record_keep_time=2
*.control_files='/ora_shared_file/oradata/rac/control01.ctl','/ora_shared_file/oradata/rac/control02.ctl'
*.db_block_size=8192
*.db_domain='adminschool.net'
*.db_file_multiblock_read_count=16
*.db_name='rac'
*.db_recovery_file_dest='/ora_stg02/fra'
*.db_recovery_file_dest_size=26843545600
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=racXDB)'
rac1.instance_number=1
rac2.instance_number=2
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST MANDATORY REOPEN=300'
*.log_archive_dest_2='LOCATION=/ora_stg02/fra/RAC/archivelog OPTIONAL REOPEN=300'
*.log_archive_format='RAC_%t_%s_%r.dbf'
*.memory_target=849346560
*.open_cursors=300
*.processes=150
*.remote_listener='rac-scan:1521'
*.remote_login_passwordfile='EXCLUSIVE'
*.remote_os_authent=TRUE
rac2.thread=2
rac1.thread=1
rac2.undo_tablespace='UNDOTBS2'
rac1.undo_tablespace='UNDOTBS1'

공통으로 적용되는 내용에는 *.파라미터=VALUE라는 형태로 값이 들어가며, 개별적으로 적용되는 내용에는 SID.파라미터=VALUE가 된다.

RAC를 설치하면 자동으로 SPFILE을 사용하도록 설정이 되는데 왜 이러한 기능이 필요한 것일까? 만약 SPFILE을 유실하였을 경우, 개별 인스턴스의 얼럿 로그를 참조하여(얼럿 로그 상에서, DB 기동 시점으로 찾아가 System parameters with non-default values: 항목을 보면 된다.) PFILE을 생성해준 뒤, 이 PFILE들을 위에서 처럼 병합하여, 이를 기반으로 SPFILE을 재생성해줄 수 있다.

 

SPFILE 값 설정하기

PFILE을 수정할 때에 OS상에서 텍스트 편집기를 이용한다면, SPFILE을 수정할 때에는 데이터베이스 상에서 아래와 같이 ALTER SYSTEM SET 명령을 이용하게 된다.

 

SPFILE에서 설정값 되돌리기

아래의 명령을 통해 이미 설정되어 있는 파라미터 값을 삭제하고 기본 값으로 되돌릴 수 있다. scope와 sid옵션이 제공되며 ALTER SYSTEM SET 명령에서의 용도와 동일하게 쓰인다.

 

SPFILE을 이용하여 PFILE 생성하기

PFILE을 통해 SPFILE을 생성해 주었을 때와 마찬가지고, SPFILE을 통해 PFILE을 생성해주는 것도 가능하다. 순서만 다를 뿐 그외의 상황은 완전히 동일하다.

훼손된 SPFILE의 복구

SPFILE 자체는 바이너리 형태의 파일인지라 PFILE을 복구할 때 처럼 사용자가 쉽게 만들어 낼 수 없다. 단 쉽게 만들어낼 수 있는 PFILE로부터 SPFILE을 생성해 줄 수 있으므로, 세가지의 옵션의 백업 복구 방법을 사용할 수 있을 것이다.

 

서식 미적용
[oracle@minhang2 dbs]$ strings spfilecatdb.ora 
catdb.__db_cache_size=33554432
catdb.__java_pool_size=4194304
catdb.__large_pool_size=4194304
catdb.__shared_pool_size=109051904
catdb.__streams_pool_size=8388608
*.audit_file_dest='/home/oracle/admin/catdb/adump'
*.background_dump_dest='/home/oracle/admin/catdb/bdump'
*.compatible='10.2.0.5.0'
*.control_files='/home/oracle/datafile/catdb/control01.ctl','/home/oracle/datafile/catdb/control02.ctl','/home/oracle/datafile/catdb/control03.ctl'
*.core_dump_dest='/home/oracle/admin/catdb/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='catdb'
*.db_recovery_file_dest='/home/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=catdbXDB)'
*.job_queue_processes=10
*.local_listener='(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=58.233.7.122)(PORT=1600)))'
*.nls_language='KOREAN'
*.nls_territory='KOREA'
*.open_cursors=300
*.pga_aggregate_target=16777216
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=167772160
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/home/oracle/admin/catdb/udump'