이전 포스트: [Oracle] Oracle 시작/종료
다음 포스트: [Oracle] Redo Log 관리하기
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
Control File에 문제가 발생하면 심각한 장애가 발생할 수 있기 때문에 평소에 파일이 삭제되지 않도록 주의해야 합니다. 혹여나 삭제되더라도 복구
할 수 있도록 여러 곳에 복사본을 만들어 분산
시켜 사용하면 좋습니다. 이를 다중화라고 합니다.
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
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