[Oracle] Control File 관리하기

HYEOB KIM·2022년 10월 24일
0

Oracle

목록 보기
9/58

이전 포스트: [Oracle] Oracle 시작/종료
다음 포스트: [Oracle] Redo Log 관리하기

1. Control File의 내용

nomount 단계에서 mount 단계로 갈 때 Control File을 읽습니다. Control File에는 Database가 운영될 때 실시간으로 각종 정보가 저장되고 또 조회됩니다. 이 파일에 장애가 발생할 경우 Instance가 비정상 종료되므로 잘 관리해야 합니다.

Control File은 바이너리 파일이기 때문에 직접 내용을 편집할 수 없고, SQL 문장이나 DDL 문장을 통해 변경해야 합니다.

SQL> select type from v$controlfile_record_section;
DATABASE               
CKPT PROGRESS
REDO THREAD
REDO LOG
DATAFILE
FILENAME
TABLESPACE
TEMPORARY FILENAME
RMAN CONFIGURATION
LOG HISTORY
OFFLINE RANGE
ARCHIVED LOG
BACKUP SET 
BACKUP PIECE
BACKUP DATAFILE
BACKUP REDOLOG
DATAFILE COPY 
BACKUP CORRUPTION
COPY CORRUPTION 
DELETED OBJECT 
PROXY COPY 
BACKUP SPFILE
DATABASE INCARNATION
FLASHBACK LOG 
RECOVERY DESTINATION
INSTANCE SPACE RESERVATION
REMOVABLE RECOVERY FILES
RMAN STATUS
THREAD INSTANCE NAME MAPPING
MTTR
DATAFILE HISTORY
STANDBY DATABASE MATRIX
GUARANTEED RESTORE POINT
RESTORE POINT
DATABASE BLOCK CORRUPTION
ACM OPERATION
FOREIGN ARCHIVED LOG
PDB RECORD 
AUXILIARY DATAFILE COPY
MULTI INSTANCE REDO APPLY
PDBINC RECORD
TABLESPACE KEY HISTORY

2. Control File 관리하기

다중화(Multiplexing)

Control File에 문제가 발생하면 심각한 장애가 발생할 수 있기 때문에 평소에 파일이 삭제되지 않도록 주의해야 합니다. 혹여나 삭제되더라도 복구할 수 있도록 여러 곳에 복사본을 만들어 분산시켜 사용하면 좋습니다. 이를 다중화라고 합니다.

spfile 다중화

0) 현재 인스턴스의 상태가 open인지 확인하고, 파라미터 파일이 spfile인지 확인합니다.

SQL> select status from v$instance;

STATUS
------------
OPEN
SQL> show parameter spfile;

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
spfile				     string	 /ORA19/app/oracle/product/19.0
						 .0/db_1/dbs/spfileoracle19.ora

1) 먼저 현재 운영중인 Control File의 경로를 확인합니다.

SQL> select name from v$controlfile;

NAME
----------------------------------------------------------------------
/ORA19/app/oracle/oradata/ORACLE19/control01.ctl
/ORA19/app/oracle/fast_recovery_area/ORACLE19/control02.ctl

2) spfile의 내용을 변경한 후 인스턴스를 종료합니다.

SQL> alter system set control_files='/home/oracle/disk1/control01.ctl',
  2  '/home/oracle/disk2/control02.ctl',
  3  '/home/oracle/disk3/control03.ctl'
  4  scope=spfile;

System altered.

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

3) 변경한 내용대로 해당 경로에 디렉토리를 생성하고 파일을 복사합니다.

SQL> !
$
$ cd /home/oracle
$ mkdir disk1 disk2 disk3
$ cp /ORA19/app/oracle/oradata/ORACLE19/control01.ctl /home/oracle/disk1/control01.ctl
$ cp /ORA19/app/oracle/oradata/ORACLE19/control01.ctl /home/oracle/disk2/control02.ctl
$ cp /ORA19/app/oracle/oradata/ORACLE19/control01.ctl /home/oracle/disk3/control03.ctl
$ exit
exit

Control File은 여러 곳에 분산되더라도 내용은 모두 동일해야 합니다.

4) startup 후 변경된 Control File 경로 확인

SQL> startup
ORACLE instance started.

Total System Global Area 1660940992 bytes
Fixed Size                  8897216 bytes
Variable Size             956301312 bytes
Database Buffers          687865856 bytes
Redo Buffers                7876608 bytes
Database mounted.
Database opened.
SQL> select name from v$controlfile;

NAME
-----------------------------------------------------------
/home/oracle/disk1/control01.ctl
/home/oracle/disk2/control02.ctl
/home/oracle/disk3/control03.ctl

pfile 다중화

0) spfile이 파라미터 파일이라면 pfile을 생성한 후 spfile을 삭제하는 작업이 이루어져야 합니다.

-- spfile의 경로로 접근
SQL> !ls $ORACLE_HOME/dbs
hc_oracle19.dat  init.ora  lkORACLE19  orapworacle19  spfileoracle19.ora

-- spfile을 이용해 pfile을 생성

SQL> create pfile from spfile;

File created.

-- pfile 생성 확인
SQl> !ls -al $ORACLE_HOME/dbs
total 32
drwxr-xr-x.  2 oracle dba      4096 Oct 27 16:37 .
drwxrwxr-x. 69 oracle oinstall 4096 Oct 12 21:13 ..
-rw-rw----.  1 oracle dba      1544 Oct 27 16:36 hc_oracle19.dat
-rw-r--r--.  1 oracle dba      3079 May 14  2015 init.ora
-rw-r--r--.  1 oracle dba      1170 Oct 27 16:37 initoracle19.ora
-rw-r-----.  1 oracle dba        24 Oct 12 21:17 lkORACLE19
-rw-r-----.  1 oracle dba      2048 Oct 12 21:26 orapworacle19
-rw-r-----.  1 oracle dba      3584 Oct 27 16:36 spfileoracle19.ora

-- spfile 삭제(<SID>에는 자신의 SID를 넣어야 함)
SQL> !rm -f $ORACLE_HOME/dbs/spfileoracle19.ora

SQL> !ls -al $ORACLE_HOME/dbs
total 28
drwxr-xr-x.  2 oracle dba      4096 Oct 27 16:39 .
drwxrwxr-x. 69 oracle oinstall 4096 Oct 12 21:13 ..
-rw-rw----.  1 oracle dba      1544 Oct 27 16:36 hc_oracle19.dat
-rw-r--r--.  1 oracle dba      3079 May 14  2015 init.ora
-rw-r--r--.  1 oracle dba      1170 Oct 27 16:37 initoracle19.ora
-rw-r-----.  1 oracle dba        24 Oct 12 21:17 lkORACLE19
-rw-r-----.  1 oracle dba      2048 Oct 12 21:26 orapworacle19

-- 재기동
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup;
ORACLE instance started.

Total System Global Area 1660940992 bytes
Fixed Size                  8897216 bytes
Variable Size             956301312 bytes
Database Buffers          687865856 bytes
Redo Buffers                7876608 bytes
Database mounted.
Database opened.

-- VALUE 부분에 아무 값도 출력되지 않으면 pfile이 사용되고 있다는 의미입니다.
SQL> show parameter pfile;

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

1) 사용 중인 Control File 조회하기

SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/home/oracle/disk1/control01.ctl
/home/oracle/disk2/control02.ctl
/home/oracle/disk3/control03.ctl

2) 인스턴스 종료

SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

3) pfile에서 Control File의 경로를 수정한 후 저장

-- (<SID>에는 자신의 SID를 넣어야 함)
SQL> !vi $ORACLE_HOME/dbs/init<SID>.ora
(중간 생략)
*.control_files='/home/oracle/disk4/control01.ctl',
				'/home/oracle/disk5/control02.ctl',
                '/home/oracle/disk6/control03.ctl'
(이하 생략)

4) 지정한 경로에 디렉토리 생성 후 Control File 복사

Control File에는 실시간으로 정보가 저장되기 때문에 시간이 지난 Control File들은 사용할 수 없게 됩니다.
그래서 파일을 이동하거나 복사할 때는 가장 최근에 사용했던 파일을 사용해야 합니다.

SQL> !
$
$ cd /home/oracle
$ mkdir disk4 disk5 disk6
$ cp /home/oracle/disk1/control01.ctl /home/oracle/disk4/control01.ctl
$ cp /home/oracle/disk1/control01.ctl /home/oracle/disk5/control02.ctl
$ cp /home/oracle/disk1/control01.ctl /home/oracle/disk6/control03.ctl
$ exit

5) 인스턴스 startup

SQL> startup
ORACLE instance started.

Total System Global Area 1660940992 bytes
Fixed Size                  8897216 bytes
Variable Size             956301312 bytes
Database Buffers          687865856 bytes
Redo Buffers                7876608 bytes
Database mounted.
Database opened.
SQL> select name from v$controlfile;

NAME
--------------------------------------------------------------------------------
/home/oracle/disk4/control01.ctl
/home/oracle/disk5/control02.ctl
/home/oracle/disk6/control03.ctl
profile
Devops Engineer

0개의 댓글