Chap 12. Archive/No Archive log mode


   1. 데이터 베이스 복구 원리 설명 (Archive/No Archive log mode)    

데이터의 복구 원리를 설명하기 전에 우선, 데이터가 저장되는 원리를 먼저 보자. 사용자가 A라는 데이터를 테이블에 입력한다고 하면, 

- Redo log buffer 에 A 에 먼저 들어가고, 

- 사용자가 commit 을 하면 Redo log buffer 에 A 가 Redo log file 에 SCN 과 함께 저장이 되고 (SCN 을 1이라고 가정한다. ) Redo log buffer 에서는 A 가 지워질 것이다. 

- 이 때, log switch 같은 것이 발생해서 checkpoint  가 일어나면 DB buffer cache 에 있던 A 가 Data file 로 내려써 지게 되면서 CKPT (check point) 프로세스가 Data file 헤더와 Control file 헤더에 각각 동일한 SCN (여기서는 1) 을 기록하게 된다. 

- 이 상태에서 DB backup 을 받고 (Data 파일에 SCN 이 1인 상태), 그 이후로 데이터 B, C 가 들어와서 SCN 이 2~3 으로 증가 후 Data/control file의 헤더에 이제 SCN 이 3인 상태가 되었다고 가정하자. 

- 여기서 새로운 데이터 D와 E 가 들어와서 commit 이 발생, 그리고 LGWR 이 해당 데이터들을 Redo log file 내려써야 하는데, 빈 공간이 없다면 기존의 A, B 가 들어가 있는 공간 (inactive redo log file) 에 덮어 쓸 것이다. 그러면서 또 다시 checkpoint 가 일어나서 data/control header 에도 SCN 이 4->5 로 증가했다고 가정하자. 

=====================================================================================================

만약, 이 상황에서 예기치 않게 DB 서버에 장애가 생겨서 데이터 파일이 날아갔다고 하면, 기존에 backup 해 둔 데이터를 복사해 와서 (Restore) DB 를 Recover 해야한다.

하지만 위의 상황에서 backup data 에는 A 가 입력 되었을 때의 데이터, 즉, Data file 의 SCN 이 1 일때의 상태이고, 현재 Control file 의 SCN 이 5 번이다. 

SCN 이 서로 다르므로 Recover 를 할 때는 2~5 번까지의 작업을 Redo log file 이나 Archive log file 을 뒤져서 Recover 를 해야하는데 (2~5 번 순서대로 하고, 만약 2번이 없으면 더 이상 진행되지 않는다.) Redo log 에서 SCN 2번이 저장되어 있는 부분을 (즉, 데이터 B 를 입력했던 부분) 데이터 D 가 덮어써 버렸으니, SCN 2번 부분을 복구 할 수 없게 된다. 

이런 경우는 no archive log mode 라고 하고 Oracle 을 처음 설치하면 기본 모드이다. 

이런 문제를 막기 위해서 Redo log file 에 덮어쓰기 전에 다른 곳으로 복사해 두고 덮어쓰는 방법을 쓸 수 있는데 이런 방법을 archive log mode 라고 한다. 


   2, Archive redo log mode로 변경하는 테스트   

- pfile 을 사용한다고 전제하에, 처음 오라클 설치 후 archive mode 로 변경하는 순서는 아래와 같다. 

DB 종료 -> Parameter file (pfile) 변경 -> DB Mount 로 시작 -> mode 변경 -> DB open

 

-- 현재 log mode 조회
SQL> archive log list;
Database log mode          No Archive Mode
Automatic archival         Disabled
Archive destination        USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     32
Current log sequence           34


-- DB 종료
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

 

-- Parameter file 변경
SQL> !vi $ORACLE_HOME/dbs/inittestdb.ora

 

-- 아래 내용 추가

log_archive_dest_1='location=/data/arc1'
log_archive_dest_2='location=/data/arc2'
log_archive_format=%s_%t_%r.arc

 

-- 해당 폴더 생성
SQL> !mkdir /data/arc1 /data/arc2

 

-- mount 상태로 startup
SQL> startup mount
ORACLE instance started.

 

Total System Global Area  422670336 bytes
Fixed Size          1344616 bytes
Variable Size         289409944 bytes
Database Buffers      125829120 bytes
Redo Buffers            6086656 bytes
Database mounted.

 

-- archive log mode 경로 변경 내용 확인
SQL> archive log list;

Database log mode          No Archive Mode

Automatic archival         Disabled

Archive destination        /data/arc2

Oldest online log sequence     32

Current log sequence           34

 

-- archive mode 로 변경하기

SQL> alter database archivelog;

 

Database altered.

 

SQL> archive log list;

Database log mode          Archive Mode

Automatic archival         Enabled

Archive destination        /data/arc2

Oldest online log sequence     32

Next log sequence to archive   34

Current log sequence           34

 

-- DB open

SQL> alter database open;  

 

Database altered.

   3. Archive Hang 발생 시 해결 방법   

- archive log 가 저장되는 폴더에 권한을 oracle 에서 root 로 변경해서 archive hang 을 만든 후 복구해 보자.

 

-- 현재 archive 확인

SYS> archive log list;
Database log mode          Archive Mode
Automatic archival         Enabled
Archive destination        /data/arc2
Oldest online log sequence     101
Next log sequence to archive   103
Current log sequence           103

 

-- /data/arc1 과 /data/arc2 의 권한을 root 로 변경해 보자
[oracle@chacha ~]$ su -
[root@chacha ~]# chown -R root:root /data/arc1 /data/arc2
[root@chacha ~]# ls -l /data/arc*
/data/arc1:
total 76
-rw-r----- 1 root root 72192 Jul 10 14:34 104_1_819630962.arc

 

/data/arc2:
total 76
-rw-r----- 1 root root 72192 Jul 10 14:34 104_1_819630962.arc

 

-- Hang 을 유도하게 log switch

SYS> alter system switch logfile;

 

-- 더 이상 프롬프트가 떨어지지 않고 아무 메세지도 없고, 멈춘 상태로 될 것이다.
-- alert log 를 확인

 

[oracle@chacha ~]$ vi /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log

 

-- 아래 부분에 보면, 아래와 같은 메세지가 있다. (ORA-19504: failed to create file "")
-- 디렉토리가 root 로 되어 있었어서 archive log 파일을 만들지 못했다.

 

ARC3: Error 19504 Creating archive log file to '/data/arc2/105_1_819630962.arc'
ARC3: Error 19504 Creating archive log file to '/data/arc1/105_1_819630962.arc'
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance testdb - Archival Error
ORA-16038: log 1 sequence# 105 cannot be archived
ORA-19504: failed to create file ""
ORA-00312: online log 1 thread 1: '/app/oracle/disk4/redo01_a.log'
ORA-00312: online log 1 thread 1: '/app/oracle/disk5/redo01_b.log' 

 

-- 이제  /data/arc1 과 /data/arc2 의 권한을 다시 oracle 로 변경
[root@chacha ~]# chown -R oracle:oinstall /data/arc1 /data/arc2
[root@chacha ~]# ls -l /data/arc*
/data/arc1:
total 76
-rw-r----- 1 oracle oinstall 72192 Jul 10 14:34 104_1_819630962.arc

 

/data/arc2:
total 76
-rw-r----- 1 oracle oinstall 72192 Jul 10 14:34 104_1_819630962.arc

 

-- 파라미터 변경 후 archive 재시작
SYS> alter system set log_archive_dest_state_1=defer;
System altered.

SYS> alter system set log_archive_dest_state_1=enable;
System altered.

SYS> alter system set log_archive_dest_state_2=defer;
System altered.  

SYS> alter system set log_archive_dest_state_2=enable;
System altered.  

SYS> alter system archive log stop;
System altered.  

SYS> alter system archive log start;
System altered.  

SYS> alter system switch logfile;
System altered.

by 짱구를꼭말려 2013. 9. 22. 23:49