IT기술/Oracle

01 No Archive log mode 와 Archive log mode

dobbby 2013. 12. 16. 12:03
반응형

Redo log 를 관리하는 방법에 따라 archive log modeno 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  에  대해서  살펴보았습니다. 






반응형