글
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
[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 ====
'Oracle > Admin' 카테고리의 다른 글
[Oracle Admin] Chap 15. Parameter File 장애 복구 (0) | 2013.09.26 |
---|---|
[Oracle Admin] Chap 14. Recovery 원리 (0) | 2013.09.23 |
[Oracle Admin] Chap 12. Archive/No Archive log mode (0) | 2013.09.22 |
[Oracle Admin] Chap 11. DBMS_JOB & DBMS_SCHEDULER (0) | 2013.09.18 |
[Oracle Admin] Chap 10. Oracle 사용자 관리 (0) | 2013.09.17 |