Redo log 를 관리하는 방법에 따라 archive log mode 와 no archive log mode 로 나뉘게 됩니다.
사용자가 어떤 테이블에 데이터 A를 입력합니다.
Redo log Buffer 에 A가 먼저 입력되고,
Database Buffer Cache 에 A가 입력됩니다.
사용자가 commit 하면
Redo log Buffer 에 있는 내용이 Redo log file 에 SCN과 함께 기록되고
Redo log Buffer 에서 지워질 것입니다.
때마침 Log switch 가 발생하여 다음 그룹으로 넘어가면
Checkpoint 가 발생하겠죠
그럼 Database Buffer Cache 에 있던 A가 Data file 에 저장되고
CKPT 프로세스가 Data file 헤더와 Control file 에
해당 checkpoint SCN 을 기록하게 됩니다.
이 상태에서 Data file 을 백업 받았습니다.
Log switch 가 발생하지 않아도 Control file 내부에 가장 마지막에 발생한 SCN 번호가 저장됩니다.
실습 1. archive Redo Log mode 로 변경하기
20G 하드 추가 후
/data 에 마운트
oracle 계정으로 권한 변경
1. DB 종료 -> 2.Parameter File 수정 -> 3. DB Mount 로 시작 -> 4. mode 변경 -> 5. DB Open
Step 1. DB종료
oracle$ sqlplus / as sysdba
SQL> shutdown immediate;
Step 2. parameter File 수정 <- archive log File 저장경로와 이름 지정
< PFILE 을 사용할 경우>
SQL>!
$ vi $ORACLE_HOME/dbs/inittestdb.ora
( pfile 을 열어서 기존 내용 아래에 아래 내용을 추가합니다)
log_archive_start=true <- 9i까지만 사용함, 10g 이상버전에서는 사용하면 안됩니다!
log_archive_dest_1='location=/data/arc1' <-첫 번째 저장경로 지정
log_archive_dest_2='location=/data/arc2' <-두 번째 저장경로 지정
log_archive_format=%s_%t_%r.arc <- 아카이브 로그파일 이름 지정
….
oracle$ exit
< SPFILE 을 사용할 경우>
SYS>show parameter spfile;
SYS>select status from v$instance;
SYS>show parameter log_archive_dest_1 ;
SYS>alter system set log_archive_dest_1='location=/data/arc1' scope=spfile;
SYS>alter system set log_archive_dest_2='location=/data/arc2' scope=spfile;
SYS>alter system set log_archive_format="%s_%t_%r.arc" scope=spfile ;
SYS> shutdown immediate ;
Step 3. DB를 mount 단계로 시작
SYS> startup mount;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 79694068 bytes
Database Buffers 83886080 bytes
Redo Buffers 2973696 bytes
Database mounted.
Step 4. archive log mode 확인 및 변경하기
SYS> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /data/arc2
Oldest online log sequence 41
Current log sequence 43
SYS> alter database archivelog; <- 아카이브 로그 모드로 변경하기
Database altered.
Step 5. DB 오픈 하기
SYS> alter database open;
Database altered.
Step 6. Log Switch 를 수행하여 파일 생성 여부 확인하기
SYS>alter system switch logfile;
SYS>/
SYS>/
SYS>!ls /data/arc1
* 실습 2. Archive Hang 발생 시 해결하는 방법
이번 실습은 실무에서 archive log mode 로 운영할 때 많이 겪는 Archive Hang 을 DB 종료 없이 해결하는 방법입니다.
주로 Archive log 저장경로가 삭제되거나 저장 공간이 부족하거나 Oracle 계정이 쓸 수 있는 권한이 없을 경우에 많이 발생합니다.
Step 1. 현재 상황 확인
여기서는 아카이브 할 경로를 /data/arc1 , /data/arc2 로 지정하겠습니다.
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /data/arc2
Oldest online log sequence 1
Next log sequence to archive 3
Current log sequence 3
[oracle@localhost ~]$ df -h
Step 2. Archive hang 발생 - 권한을 제어해서 행 걸리게 만들기
[oracle@localhost ~]$ ls -l /data
total 28
drwxr-xr-x 2 oracle dba 4096 Mar 31 07:37 arc1 <--oracle 계정 소유입니다.
drwxr-xr-x 2 oracle dba 4096 Mar 31 07:37 arc2 <--oracle 계정 소유입니다.
drwxr-xr-x 4 oracle dba 4096 Oct 30 16:41 backup
drwx------ 2 oracle dba 16384 Oct 30 16:40 lost+found
[oracle@localhost ~]$ su -
Password: 이곳에 root 암호 입력 후 엔터 치세요. 입력되는 글자는 보안상 안보입니다.
[root@localhost ~]# chown -R root.root /data/arc1 <-- 권한을 root 소유로 변경합니다
[root@localhost ~]# chown -R root.root /data/arc2 <-- 권한을 root 소유로 변경합니다.
[root@localhost ~]# ls -l /data
total 28
drwxr-xr-x 2 root root 4096 Mar 31 07:37 arc1 <-- root 소유로 변경됩니다.
drwxr-xr-x 2 root root 4096 Mar 31 07:37 arc2 <-- root 소유로 변경됩니다.
drwxr-xr-x 4 oracle dba 4096 Oct 30 16:41 backup
drwx------ 2 oracle dba 16384 Oct 30 16:40 lost+found
위와 같이 Archive Log File 이 저장되는 경로에 oracle 계정이 쓸 수 없도록 변경 한 후
Log Switch 를 발생시키면 Archive Hang 이 발생됩니다.
SQL> alter system switch logFile;
SQL> /
SQL> /
< Hang 발생함 >
Step 3. alert log 확인하여 Archive Hang 상태를 확인합니다.
다른 터미널에서 Alert log 의 내용을 확인합니다.
[oracle@localhost ~]$ vi /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log
(지면 관계상 위의 내용은 생략하고 Alert log 의 가장 마지막 부분을 보세요)
Sun Mar 31 07:51:59 2013
Thread 1 advanced to log sequence 47 (LGWR switch)
Current log# 2 seq# 47 mem# 0: /app/oracle/oradata/testdb/redo02.log
Sun Mar 31 07:51:59 2013
ARC1: Error 19504 Creating archive log file to '/data/arc2/46_1_798054423.arc'
ARC1: Error 19504 Creating archive log file to '/data/arc1/46_1_798054423.arc'
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance testdb - Archival Error
ORA-16038: log 1 sequence# 46 cannot be archived
ORA-19504: failed to create file ""
ORA-00312: online log 1 thread 1: '/app/oracle/oradata/testdb/redo01.log'
Thread 1 advanced to log sequence 48 (LGWR switch)
Current log# 3 seq# 48 mem# 0: /app/oracle/oradata/testdb/redo03.log
Sun Mar 31 07:52:00 2013
ARCH: Archival stopped, error occurred. Will continue retrying
ORACLE Instance testdb - Archival Error
ORA-16014: log 1 sequence# 46 not archived, no available destinations
ORA-00312: online log 1 thread 1: '/app/oracle/oradata/testdb/redo01.log'
Thread 1 cannot allocate new log, sequence 49
Checkpoint not complete
위와 같이 에러가 나는 것을 확인했습니다.
지금 에러는 Archive log File 을 저장해야 하는 디렉토리에 oracle 계정이 쓸 (Write) 권한이 없어서
Log Switch 가 발생해도 아카이빙을 못하기 때문에 발생한 에러입니다.
현재 Hang 상태에서 권한을 oracle 계정으로 변경 한 후 다시 확인 합니다.
Step 4. 권한 변경 후 다시 확인
[oracle@localhost ~]$ su - <-- 권한을 변경하기 위해 root 계정으로 switching 합니다.
암호:
[root@localhost ~]# ls -l /data
total 28
drwxr-xr-x 2 root root 4096 Mar 31 07:37 arc1
drwxr-xr-x 2 root root 4096 Mar 31 07:37 arc2
drwxr-xr-x 4 oracle dba 4096 Oct 30 16:41 backup
drwx------ 2 oracle dba 16384 Oct 30 16:40 lost+found
[root@localhost ~]#
[root@localhost ~]# chown -R oracle.dba /data
[root@localhost ~]#
[root@localhost ~]# ls -l /data
total 28
drwxr-xr-x 2 oracle dba 4096 Mar 31 07:37 arc1 <-- 정상적으로 변경되었습니다.
drwxr-xr-x 2 oracle dba 4096 Mar 31 07:37 arc2 <-- 정상적으로 변경되었습니다.
drwxr-xr-x 4 oracle dba 4096 Oct 30 16:41 backup
drwx------ 2 oracle dba 16384 Oct 30 16:40 lost+found
SQL> alter system switch logfile;
만약 위와 같이 했지만 Hang 이 사라지지 않을 경우 아래의 작업을 추가로 해주세요
다른 터미널을 하나 더 열어서 아래와 같이 작업합니다.
Step 5. 파라미터 변경 후 archiver 재 시작
SQL> alter system set log_archive_dest_state_1=defer;
SQL> alter system set log_archive_dest_state_1=enable;
SQL> alter system set log_archive_dest_state_2=defer;
SQL> alter system set log_archive_dest_state_2=enable;
SQL> alter system archive log stop;
SQL> alter system archive log start;
SQL> alter system switch logFile;
System altered. <- log switch 가 잘 되는 것을 확인 할 수 있습니다.
(경우에 따라서는 시간이 약간 소요될 수도 있습니다. 잠시 기다리세요)
위에서 살펴본 바와 같이 Archive log mode 는 Archive log 가 저장될 경로에 Archiving 을 할 수 없게 될 경우
Database 가 Hang이 발생해서 중단되는 경우가 많으니 늘 주의해야 하며 Hang 이 발생할 경우 위와 같은 방법으로 해결 하시면 됩니다.
그리고 위와 같이 해결 하신 후 반드시 전체 백업을 full 로 받으실 것을 권장합니다.
실습 3. Archive log 압축하기
앞에서 살펴본 바와 같이 Archive log mode 로 운영할 경우 Archive log 를 저장해야 할 공간이 가득 찰 경우
Hang 의 문제가 발생할 수도 있고 회사 입장에서는 Archive log 를 저장할
대용량의 스토리지를 별도로 구입해야 하는 등의 현실적인 문제도 있습니다.
그래서 오라클에서는 Archive log 를 생성할 때 압축을 할 수 있는 방법을 제공하며 기본값은 사용안함으로 설정되어 있습니다.
아래와 같이 DB가 Open 상태에서 조회하고 enable / disable 하면 됩니다.
SYS>select archivelog_compression from v$database ;
SYS>alter database archivelog compress enable ;
SYS>select archivelog_compression from v$database ;
SYS>alter database archivelog compress disable ;
SYS>select archivelog_compression from v$database ;
이 기능을 ENABLE 로 설정 할 경우 파일의 내용이나 OS 별로 압축효율이 다르긴 하지만 대체적으로
50% 이상의 압축률을 보입니다. 그래서 저장 공간이 적게 필요해 지는 장점이 있기는 합니다.
단 주의 사항이 있는데 만약에 데이터 복제 솔루션을 사용할 경우 (예를 들어 DataGuard 등) 이 기능으로 인해
문제가 발생할 수도 있다는 점을 염두에 두어야 합니다.
이상으로 No Archive Log Mode 와 Archive Log Mode 에 대해서 살펴보았습니다.