Chap 13. Oracle Backup


   1. 백업 대상   

- 필수 백업 대상 : Data file, Control file, Redo log file 

- 선택 백업 대상 : parameter file, password file


1) Data file

- 실제 데이터가 저장되어 있는 파일이다. 아래와 같이 조회가능.

 

SQL> select name, status from v$datafile;

 

   NAME                                                              STATUS  

-------------------------------------------------- -------

/app/oracle/oradata/testdb/system01.dbf         SYSTEM

/app/oracle/oradata/testdb/sysaux01.dbf         ONLINE

/app/oracle/oradata/testdb/undotbs01.dbf        ONLINE  

/app/oracle/oradata/testdb/users01.dbf           ONLINE  

/app/oracle/oradata/testdb/example01.dbf        ONLINE  

/app/oracle/oradata/testdb/ts_webhard.dbf      ONLINE  

/app/oracle/oradata/testdb/ts_web_idx.dbf       ONLINE

2) Control file

- DB를 운영하는데 있어 중요한 설정 파일들이다. 현재 사용중인 파일만 유효하고 과거에 썼던 파일들은 백업 받아도 사용할 수 없다.

 

SQL> select name from v$controlfile;
NAME 
-------------------------------------------------------  
/app/oracle/oradata/testdb/control01.ctl  
/app/oracle/fast_recovery_area/testdb/control02.ctl

3) Redo log file

- 데이터에 변경이 일어난 내용을 복구에 사용하기 위해 저장하고 있는 파일

 

SQL> select a.group#, a.member, b.bytes/1024/1024 MB, b.archived, b.status from v$logfile a, v$log b where a.group#=b.group# order by 1,2; 

          

GROUP#     MEMBER                                                MB        ARC STATUS

---------- ---------------------------------------- ---------- --- ----------------
        1       /app/oracle/oradata/testdb/redo01.log        50         YES INACTIVE
        2       /app/oracle/oradata/testdb/redo02.log        50         YES INACTIVE
        3       /app/oracle/oradata/testdb/redo03.log        50         NO  CURRENT

4) Parameter file / Password file

- Parameter file: Oracle 서버를 운영하는데 있어 필요한 각종 설정 정보를 저장하고 있는 파일. 중요하다!!

- Password file: sysdba 권한의 암호를 저장하는 파일로 일반적으로 사용자의 암호는 dictionary 에 저장되어서 DB가 open 후에 조회 가능하다. (db_users). 하지만 db가 shutdown 상태에서도 조회가 가능해야 하기 때문에 sysdba의 암호를 일반 파일에 저장해 둔다. 


- sys 계정 암호를 항상 물어보도록 설정하기

처음 Oracle 을 설치하면 sys 계정의 암호를 묻지 않는데, 그 이유는 $ORACLE_HOME/network/admin 안에 sqlnet.ora 라는 파일이 없기 때문이다. (정확히는 이 파일안의 sqlnet.authentication_services 설정)

우선 $ORACLE_HOME/network/admin/sqlnet.ora 파일이 없다면 netca 로 파일 생성해 준다.

[oracle@chan ~]$ netca

====> 이 부분은 그래픽 모드, x-window 환경이 필요하므로, VM 안의 oracle 서버에 oracle 계정으로 접속해서 터미널에서 작업하던지, 아니면 xmanger 같은 프로그램을 사용한다. (본인은 xmanager 를 사용했다.)

 

 

 

 

 

 

완료후에, 해당 파일이 생성되었는지 확인한다.

[oracle@chan ~]$ ls -l $ORACLE_HOME/network/admin/sqlnet.ora

-rw-r--r-- 1 oracle oinstall 237 Jul 10 15:33 /app/oracle/product/11g/network/admin/sqlnet.ora


파일이 잘 생성되었으면, 파일을 vi로 열어서 아래 부분을 추가하고 저장한다. 

sqlnet.authentication_services=(none)


그리고 나서 sqlplus / as sysdba 명령으로 (암호 없이) 로그인을 시도하면 암호를 물어보는 프롬프트가 뜰 것이다.


[oracle@chan ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.2.0 Production on Wed Jul 10 15:59:20 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:

ORA-01031: insufficient privileges

Enter user-name: 


이럴 경우 암호를 입력해서 접속하면 된다.

Enter user-name: sys/암호 as sysdba


Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production

With the Partitioning option


SYS> 

 

   2. 백업의 종류   

1) 닫힌 백업 (cold backup / closed backup)

- 백업 대상 확인하기

 

SYS> select name, status from v$datafile;

  
NAME                            STATUS  
------------------------------------------------------- -------  
/app/oracle/oradata/testdb/system01.dbf         SYSTEM  
/app/oracle/oradata/testdb/sysaux01.dbf         ONLINE  
/app/oracle/oradata/testdb/undotbs01.dbf        ONLINE  
/app/oracle/oradata/testdb/users01.dbf          ONLINE  
/app/oracle/oradata/testdb/example01.dbf        ONLINE  
/app/oracle/oradata/testdb/ts_webhard.dbf       ONLINE  
/app/oracle/oradata/testdb/ts_web_idx.dbf       ONLINE    


SYS> select a.group#, a.member, b.bytes/1024/1024 MB, b.archived, b.sequence#, b.status from v$logfile a, v$log b where a.group#=b.group#;          


GROUP#       MEMBER                                              MB ARC  SEQUENCE#  STATUS  
---------- ----------------------------------------- --- ---  -------------- ----------------
        1 /app/oracle/oradata/testdb/redo01.log              50 YES          4            INACTIVE
        2 /app/oracle/oradata/testdb/redo02.log              50 YES          5            INACTIVE
        3 /app/oracle/oradata/testdb/redo03.log              50 NO            6           CURRENT
   


SYS> select name from v$controlfile;  

 

NAME 

-------------------------------------------------------

/app/oracle/oradata/testdb/control01.ctl
/app/oracle/fast_recovery_area/testdb/control02.ctl


/* =====> 테스트 편의성을 위해서 control file 을 control01.ctl 하나만 쓰도록 설정하겠다. */  


SYS> shutdown immediate;  

ORA-01109: database not open  

   

Database dismounted.  

ORACLE instance shut down. 

 

SYS>     

SYS> !vi $ORACLE_HOME/dbs/inittestdb.ora  

/* ~~~~ 아래 부분처럼 수정 후 저장 */

 

*.control_files='/app/oracle/oradata/testdb/control01.ctl'

 

SYS> 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.  

 

SYS>   

SYS> select name from v$controlfile; 

     

NAME 
-------------------------------------------------------
/app/oracle/oradata/testdb/control01.ctl

- DB 종료하기 (정상 종료)

SYS> shutdown immediate;  
ORA-01109: database not open 
Database dismounted.  
ORACLE instance shut down.

- /data/backup/close 의 경로로 파일 copy

[oracle@chan ~]$ mkdir -p /data/backup/close

[oracle@chan ~]$ cp -av /app/oracle/oradata/testdb/*.dbf /data/backup/close/

`/app/oracle/oradata/testdb/example01.dbf' -> `/data/backup/close/example01.dbf'
`/app/oracle/oradata/testdb/sysaux01.dbf' -> `/data/backup/close/sysaux01.dbf'
`/app/oracle/oradata/testdb/system01.dbf' -> `/data/backup/close/system01.dbf'
`/app/oracle/oradata/testdb/temp01.dbf' -> `/data/backup/close/temp01.dbf'
`/app/oracle/oradata/testdb/temp_web.dbf' -> `/data/backup/close/temp_web.dbf'
`/app/oracle/oradata/testdb/ts_webhard.dbf' -> `/data/backup/close/ts_webhard.dbf'
`/app/oracle/oradata/testdb/ts_web_idx.dbf' -> `/data/backup/close/ts_web_idx.dbf'
`/app/oracle/oradata/testdb/undotbs01.dbf' -> `/data/backup/close/undotbs01.dbf'
`/app/oracle/oradata/testdb/users01.dbf' -> `/data/backup/close/users01.dbf'

 

[oracle@chan ~]$ cp -av /app/oracle/oradata/testdb/*.log /data/backup/close/
`/app/oracle/oradata/testdb/redo01.log' -> `/data/backup/close/redo01.log'
`/app/oracle/oradata/testdb/redo02.log' -> `/data/backup/close/redo02.log'  `/app/oracle/oradata/testdb/redo03.log' -> `/data/backup/close/redo03.log'

 

[oracle@chan ~]$ cp -av /app/oracle/oradata/testdb/*.ctl /data/backup/close/
`/app/oracle/oradata/testdb/control01.ctl' -> `/data/backup/close/control01.ctl'

 

[oracle@chan ~]$ cp -av /app/oracle/product/11g/dbs/inittestdb.ora /data/backup/close/
`/app/oracle/product/11g/dbs/inittestdb.ora' -> `/data/backup/close/inittestdb.ora'


[oracle@chan ~]$ cp -av /app/oracle/product/11g/dbs/orapwtestdb /data/backup/close/
`/app/oracle/product/11g/dbs/orapwtestdb' -> `/data/backup/close/orapwtestdb'

- DB open

[oracle@chan ~]$ exit

exit


SYS> startup

ORACLE instance started.

 

Total System Global Area  422670336 bytes

Fixed Size          1344616 bytes

Variable Size         260049816 bytes

Database Buffers      155189248 bytes

Redo Buffers            6086656 bytes

Database mounted.  

Database opened.

2) 열린 백업 (hot backup / open backup / begin backup)

- 닫힌 백업 같은 경우는 DB 를 종료해야만 가능하다는 치명적인 단점이 있다. 하지만 서비스 중인 DB 를 내리지 않고 백업을 받아야 할 경우 열린 백업 (hot backup) 을 이용할 수 있다. 

- 열린 백업 같은 경우는 tablespace 단위로 백업을 수행한다. 11g 부터는 database 전체를 한번에 백업 모드로 설정할 수 있는 옵션이 있지만 redo log 량이 많이 생기기 때문에 권장하지는 않는다. 

- 열린 백업을 받기 위해서는 반드시 DB 가 archive log mode 여만 한다. 

- 열린 백업은 Data file 과 Control file 은 백업이 가능하지만, online redo log file 은 불가능 하다. 

 

- users tablespace 를 열린 백업으로 받기

 

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

 


SYS> alter tablespace users begin backup;      

 

Tablespace altered.      

 

SYS> !mkdir -p /data/backup/open                    

 

SYS> !cp /app/oracle/oradata/testdb/users01.dbf /data/backup/open/      

 

SYS> !ls -l /data/backup/open 

total 7700  

-rw-r----- 1 oracle oinstall 7872512 Jul 10 16:44 users01.dbf      

 

SYS> alter tablespace users end backup;      


Tablespace altered.

- end backup 이 수행되었는지 여부 확인. 

SYS> select a.file#, a.name, b.status, to_char(b.time, 'YYYY-MM-DD:HH24:MI:SS') as time from v$datafile a, v$backup b where a.file#=b.file#           


FILE# NAME                           STATUS          TIME 


---------- -------------------------------------------------- --------------- -------------------
        1 /app/oracle/oradata/testdb/system01.dbf        NOT ACTIVE
        2 /app/oracle/oradata/testdb/sysaux01.dbf        NOT ACTIVE
        3 /app/oracle/oradata/testdb/undotbs01.dbf       NOT ACTIVE
        4 /app/oracle/oradata/testdb/users01.dbf         NOT ACTIVE      2013-07-15:15:03:30
        5 /app/oracle/oradata/testdb/example01.dbf       NOT ACTIVE
        6 /app/oracle/oradata/testdb/ts_webhard.dbf          NOT ACTIVE
        7 /app/oracle/oradata/testdb/ts_web_idx.dbf          NOT ACTIVE


     8 rows selected.

- hot backup 수행 테스트 (script 이용)

SYS> !vi /app/oracle/open_backup.sql

 

/* ### 아래 내용 입력 후 저장 */  

conn / as sysdba;  
alter tablespace system begin backup;  
!cp -av /app/oracle/oradata/testdb/system01.dbf /data/backup/open/  
alter tablespace system end backup;      


alter tablespace sysaux begin backup;  
!cp -av /app/oracle/oradata/testdb/sysaux01.dbf /data/backup/open/  
alter tablespace sysaux end backup;      


alter tablespace undotbs1 begin backup;  
!cp -av /app/oracle/oradata/testdb/undotbs01.dbf /data/backup/open/ 
alter tablespace undotbs1 end backup;      


alter tablespace users begin backup;  
!cp -av /app/oracle/oradata/testdb/users01.dbf /data/backup/open/  
alter tablespace users end backup;      


alter tablespace example begin backup;  
!cp -av /app/oracle/oradata/testdb/example01.dbf /data/backup/open/  
alter tablespace example end backup;      


alter tablespace ts_webhard begin backup;  
!cp -av /app/oracle/oradata/testdb/ts_webhard.dbf /data/backup/open/  
alter tablespace ts_webhard end backup;      


alter tablespace ts_web_idx begin backup;  
!cp -av /app/oracle/oradata/testdb/ts_web_idx.dbf /data/backup/open/  
alter tablespace ts_web_idx end backup;      


alter database backup controlfile to '/data/backup/open/control01.ctl';  
:wq!      


SYS> @/app/oracle/open_backup.sql  
Connected.  
Tablespace altered. 
`/app/oracle/oradata/testdb/system01.dbf' -> `/data/backup/open/system01.dbf'
Tablespace altered.  
Tablespace altered.  
`/app/oracle/oradata/testdb/sysaux01.dbf' -> `/data/backup/open/sysaux01.dbf'
Tablespace altered.  
Tablespace altered.  
`/app/oracle/oradata/testdb/undotbs01.dbf' -> `/data/backup/open/undotbs01.dbf'
Tablespace altered.  
Tablespace altered.  
`/app/oracle/oradata/testdb/users01.dbf' -> `/data/backup/open/users01.dbf' 
Tablespace altered. 
Tablespace altered.  
`/app/oracle/oradata/testdb/example01.dbf' -> `/data/backup/open/example01.dbf'
Tablespace altered. 
Tablespace altered. 
`/app/oracle/oradata/testdb/ts_webhard.dbf' -> `/data/backup/open/ts_webhard.dbf'
Tablespace altered.
Tablespace altered.
`/app/oracle/oradata/testdb/ts_web_idx.dbf' -> `/data/backup/open/ts_web_idx.dbf'
Tablespace altered. 
Database altered.


SYS> alter system checkpoint;
System altered.

- 일자별로 자동 백업 디렉토리를 생성해서 begin backup 하는 테스트

위의 hot backup script 는 tablespace 직접 다 써주어야 하기 때문에 불편하다. 다음을 참고해서 5개의 script 로 편리하게 backup 받자!

 

* 일자별로 자동 백업 디렉토리를 생성해서 begin backup 하는 테스트

(참고: 오라클 백업과 복구의 정석1 - 서진수 저자)


1. main_backup.sh

main script 로 다른 script 들을 호출

 

#!/bin/bash


export LANG=C
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/11g
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=testdb  


touch $ORACLE_BASE/total.log
echo ""
echo "==== set begin backup mode ===="
time sh $ORACLE_BASE/begin_backup.sh >> $ORACLE_BASE/total.log
echo ""
echo "==== end backup mode ===="
echo ""
echo "==== start file copy ===="
time sh $ORACLE_BASE/copy_backup.sh >> $ORACLE_BASE/total.log
echo "==== end file copy ===="
echo ""
echo "==== set end backup mode ===="
time sh $ORACLE_BASE/end_backup.sh >> $ORACLE_BASE/total.log
echo "==== complete hot backup ===="

 

2. begin_backup.sh

tablespace 를 begin backup 상태로 만들기

 

#!/bin/bash  


export LANG=C
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/11g
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=testdb  


sqlplus /nolog<<EOF1
conn / as sysdba  


set head off
set feedback off
set time off
set timing off
set echo off
spool /tmp/online.tmp  


select 'alter tablespace '|| tablespace_name ||' begin backup;' \
from dba_tablespaces \
where status='ONLINE' \
and contents != 'TEMPORARY';  


spool off  


!cat /tmp/online.tmp | egrep -v spool | egrep -v SQL | egrep -v [2-4] > $ORACLE_BASE/begin.sh
@/app/oracle/begin.sh
!sh $ORACLE_BASE/status.sh
exit
EOF1

3. copy_backup.sh

data file 과 control file 을 날짜 이름으로 디렉토리를 만들어서 복사

 

#!/bin/bash  


export LANG=C
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/11g
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=testdb  


sqlplus /nolog <<EOF3
conn / as sysdba


set head off
set time off
set timing off
set feedback off
set echo off
set line 200
col name for a100
spool /app/oracle/cp.tmp


select 'mkdir /data/backup/open' || to_char(sysdate, 'YYYY-MM-DD-HH24-MI-SS') from dual;
select 'cp -av '||name||' /data/backup/open/'||to_char(sysdate, 'YYYY-MM-DD-HH24-MI-SS')
"name" from v\$datafile;
spool off  


spool /app/oracle/control.tmp
alter session set nls_date_format='YYYY-MM-DD-HH24-MI-SS';
select 'alter database backup controlfile to '' /data/backup/open/'||sysdate||\
'/'||sysdate||'.ctl''; ' form dual;
spool off; 


!cat /app/oracle/cp.tmp | egrep -v SQL > /app/oracle/cp.sh
!cat /app/oracle/control.tmp | egrep -v SQL > /app/oracle/control.sql
!sh /app/oracle/cp.sh
 @/app/oracle/control.sql
exit
EOF3

4. end_backup.sh

위의 복사가 끝나면 end backup 상태로 변경

#!/bin/bash  


export LANG=C
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/11g
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=testdb  


sqlplus /nolog <<EOF4
conn / as sysdba  


set head off
set feedbackup off
set time off
set timing off
set echo off
spool /tmp/online.tmp


select 'alter tablespace '|| tablespace_name ||' end backup;' \
from dba_tablespaces \
where status='ONLINE' \
and contents != 'TEMPORARY';
spool off  

!cat /tmp/online.tmp | egrep -v spool | egrep -v SQL | egrep -v [2-4] > /app/oracle/end.sh
@/app/oracle/end.sh
!sh /app/oracle/status.sh
exit
EOF4

5. status.sh

begin backup 모드 상태를 확인하는 script 

#!/bin/bash  


export LANG=C
export ORACLE_BASE=/app/oracle
export ORACLE_HOME=/app/oracle/product/11g
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=testdb  


sqlplus /nolog <<EOF2
conn / as sysdba  


set head on
set echo off
set feedback off
spool /tmp/status.tmp
set line 200
col name for a50
col status for a15


select a.file#, a.name, b.status, to_char(b.time, 'YYYY-MM-DD:HH24:MI:SS') "Time" \
from v\$datafile a, v\$backup b \
 where a.file#=b.file#;
spool off
exit
EOF2

▼ 해당 script 들에 실행 권한을 주고 (chmod 755 *.sh) main_backup.sh 을 실행해 본 결과이다.

[oracle@chan ~]$ cd /app/oracle
[oracle@chan oracle]$ ls -l *.sh
-rw-r--r--  1 oracle oinstall  602 Jul 15 19:49 begin_backup.sh
-rw-r--r--  1 oracle oinstall  945 Jul 15 19:57 copy_backup.sh
-rw-r--r--  1 oracle oinstall  595 Jul 15 20:00 end_backup.sh
-rw-r--r--  1 oracle oinstall  619 Jul 15 19:44 main_backup.sh
-rw-r--r--  1 oracle oinstall  476 Jul 15 20:03 status.sh


[oracle@chan oracle]$ 
[oracle@chan oracle]$ chmod 755 *.sh
[oracle@chan oracle]$ 
[oracle@chan oracle]$ ./main_backup.sh   


==== set begin backup mode ====  

real    0m0.157s
user    0m0.017s
sys 0m0.016s  

==== end backup mode ====  


==== start file copy ====  
real    0m12.046s
user    0m0.012s
sys 0m0.007s
==== end file copy ====  


==== set end backup mode ====  
real    0m0.249s
user    0m0.009s
sys 0m0.023s
==== complete hot backup ====

 

 

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

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