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