IT기술/Oracle

14 Recovery Manager

dobbby 2014. 1. 2. 12:07
반응형

1. RMAN 의 주요 특징

- 자주 실행하는 작업을 스크립트로 저장

- 증분 블록 레벨 백업 가능 지원

- 사용되지 않은 블록 건너뛰고 백업 수행

- 백업 수행 중 훼손된 블록 감지

- ASM 기반 유일한 백업 도구

- 백업 수행 시 압축 지원



2. RMAN 은 기본적으로 PGA 를 사용하며 공간이 부족할 때 SGA (Large Pool, Shared Pool) 을 사용한다.



3. Channel 설정하기

1) 자동 Channel 설정하기 (default)

별도의 경로를 주지 않아도 정해진 위치에 백업을 받는 것 


복구 카탈로그 서버 이용시

$ rman target / catalog rcuser/rcuser@rcserver 

복구 카탈로그 서버 사용 안할 경우

$ rman target sys/oracle 


자동 channel 을 설정

RMAN> configure default device type to disk ;


이렇게  설정하면  default  device가  파라미터  파일의  db_recovery_file_dest  파라미터의  경로로  설정이  됩니다. 



특정 경로를 default 로

$ mkdir /data/backup/rman

$ rman target sys/oracle


RMAN> backup tablespace example ;

기본 경로로 저장됨


기본경로를 다른 곳으로 설정

$ mkdir -p /data/backup/rman

$ rman target sys/oracle


RMAN> configure channel device type disk

2> format '/data/backup/rman/%U_%T' ;


RMAN> backup tablespace example ;


앞으로  특별한  경로  없이  백업을  수행하면  이곳에  백업이  생성될  것입니다. 

%U(대문자  U)  는  파일명이  중복되지  않도록  RMAN이  Unique한  번호로  파일  이름을  생성하면서 백업을  수행하라는  의미이며  

%T는  백업  날짜를  표시하라는  뜻입니다. 



2) 수동 Channel 설정하기

백업 받을 경로를 직접 지정해 주는 것


RMAN> run{

2> allocate channel ch1 type disk

3> format '/data/backup/close/%U_%T' ;

4> backup tablespace example ;

5> ;


위 작업은 아래와 같이 독립형 명령어로도 가능합니다.

RMAN> backup tablespace example format '/data/backup/open/%U_%T' ;


또는 아래와 같이 Backup set  의 이름을 지정할 수 도 있습니다.

RMAN> backup tablespace example

2> format '/data/backup/rman/%T_example.bak' ;


수동 Channel 을 사용하면 RMAN 은 해당 경로의 백업 파일을 관리하지 않습니다.

이  말의  의미는  Retention  Policy  등이  설정이  되어  있더라도  format  파라미터를  사용해서  경로를  변경하게  되면  

해당  정책들이  적용이  안  된다는  것을  의미합니다.  

FRA에  저장한다  하더라도 format  파라미터로  경로가  정해지면  관리자가  수동으로  백업파일을  관리해  주어야만  합니다.




5. RMAN 백업 종류

1) backupset 으로 백업 수행 (default)

backupset - RMAN 이 백업파일을 만들 때 RMAN 만이 알 수 있는 형태로 백업파일을 생성하는 것

이  방법으로  백업을  수행해야  RMAN  백업의 장점들을  모두  사용할  수  있습니다.

backup piece - backupset 의 크기가 너무 클 경우 분할해서 여러 개의 파일로 분할된 파일


2) Image copy 로 백업 수행

Image copy 란 OS 명령어로 begin backup 하는 것과 가장 유사한 방법이다.

이  방법을  사용할  경우  RMAN  백업의  장점인  사용중인  블록만  백업  받는다거나  증분  백업 받는  기능  등  좋은  장점을  사용할  수  없습니다.


RMAN> copy

2> datafile '/app/oracle/oradata/testdb/example01.dbf'

3> to '/data/backup/rman/example01.dbf.bak' ;




6. RMAN 백업시 주의 사항

- open 상태에서 백업을 받으려면 데이터베이스가 archive log mode 로 운영되어야 합니다.

- 데이터베이스가 마운트 또는 오픈되어 있어야 합니다.

- 운영 중인 온라인 리두 로그 파일은 백업이 불가합니다.

- 노 아카이브 모드에서는 Clean 백업만 사용이 가능합니다.

  Clean Backup 이란 오프라인 테이블스페이스나 읽기 전용 테이블 스페이스 백업을 의미합니다.

- 해당 테이블 스페이스는 백업모드여서는 안됩니다.

- RMAN 으로 백업을 수행하는것은 Begin backup 시의 조건과 동일해야 합니다.




7. RMAN 명령어 종류

1) 독립형 명령 (stand alone)

이 명령방식은 RMAN> prompt 에 1개의 명령어만 들어가는 방식입니다.


RMAN> backup tablespace example ;

1 개의 명령어가 입력됩니다.


2) 작업형 명령

프로그램의 스크립트처럼 여러 개의 명령어를 한꺼번에 사용할 수 있는 방법입니다.


RMAN> run {

2> allocate channel ch1 type disk

3> format '/data/backup/close/%T_example.bak' ;

4> backup tablespace example ;

5> }


allocated channel: ch1

channel ch1: SID=48 device type=DISK


현업에서 아주 많이 쓰는 방식입니다.




8. 증분 백업 (Incremental backup)

이전에 받았던 백업파일과 비교해서 변경된 부분만 골라서 백업을 수행하는 것을 말합니다.

이 기능은 Enterprise Edition 에서만 지원됩니다.

10g 버전부터는 Block change tracking 이라는 기능이 지원되어 더 빠른 incremental backup 이 지원됩니다.


자동증분백업

RMAN> run {

2> allocate channel c1 type disk ;

3> backup

4>      incremental level 0        <-- 차등 증분백업을 의미

5> database

6>      format '/data/backup/rman/%U_%T' ;

7> }


누적증분백업

RMAN> run { 

2> allocate channel c2 type disk;

3> backup 

4>     incremental level 3 cumulative    <-- 누적 증분 백업 옵션

5> tablespace example; 

6> } 


Block change tracking 기능 활성화 후 증분백업 수행

Block  change  tracking  기능이란  데이터  블록들의  변경된  블록만  추적하는  기능을  의미합니다.

록들의  변경사항은  특정  파일에  저장되어  관리됩니다. 

이  기능은  oracle 10g Enterprise Edition  에서부터  지원됩니다.

$ sqlplus sys/oracle as sysdba 

SYS>alter database enable block change tracking 

  2   using file '/data/backup/rman/bt.dat' ;

SYS>!ls -lSh /data/backup/rman/*.dat

SYS>!vi   /data/backup/rman/bt.dat 

SQL> alter database disable block change tracking ;


Block change tracking  기능을  확인하려면  control file  을  조회하시면  됩니다. 

SYS>set line 200 

SYS>col status for a10 

SYS>col filename for a50 

SYS>col MB for 999999 

SYS>select status , filename , bytes/1024/1024 MB 

  2   from v$block_change_tracking;


실제  RMAN  이  이  기능을  사용했는지  여부를  조회해  보겠습니다. 

v$backup_datafile  을  보면  used_change_tracking  컬럼이  있는데 그  값을  조회하면  됩니다. 

SQL> select file#, 

 2   avg(datafile_blocks) “blocks”, 

 3   avg(blocks_read) “reads”, 

 4   round(avg(blocks_read/datafile_blocks) * 100,3)|| ‘%’   as "Read for Backup" 

 5   from v$backup_datafile 

 6   where incremental_level > 0 

 7   and used_change_tracking = 'YES' 

 8   group by file# 

 9   order by file# ; 


이  기능은  사용하기  전에  많은  고려를  해야  합니다. 

왜냐하면  이  기능을  사용할  경우  블록에  변경이  생기게  되면  해당  변경을  유발한  서버  프로세스들이  이  파일에  변경된  블록  명단을  적어야  합니다.  

만약  대량의  데이터에  변경이  생길  경우  이 파일에  내용을  기록하는  부분에서  병목현상이  생길  수  있기  때문입니다.  

그래서  기본값은  사용안함입니다.  

다음  실습을  위해  이  기능을  disable  하세요. 




9. 압축하면서 백업 수행하기 (10g, 11g 공통)

10g RMAN 부터 백업을 수행할 때 압축할 수 있습니다.

RMAN 에서 지원하는 압축은 기본값은 BZip2 이고 ZLIB 는 옵션으로 선택할 수 있습니다.

BZip2 방법은 압축효율이 가장 좋지만 CPU 부하가 많이 걸릴 수 있고 속도가 느립니다.

11g R1 부터는 Zlib 압축이 추가되었는데 CPU 부하는 적고 속도는 빠르지만 압축효율이 Bzip2 에 비해 상대적으로 좋지 못합니다.

그리고 ZLIB 를 사용하려면 11g 버전부터 Advanced Compression Option 이 설치되어야 합니다.


1) 압축하지 않고 기본 모드로 전체 Database 백업 수행

RMAN> backup database format '/data/backup/rman/%T_full_%U';


2) 압축하면서 전체 Database 백업 수행

RMAN> backup as compressed backupset database

2> format '/data/backup/rman/%T_full_comp_%U' ;


3. 압축하면서 전체 Archive log file 파일 백업

RMAN> backup as compressed backupset archivelog all

2> format '/data/backup/rman/%U_%T' ;




10. MultiSection Backup (11g New Feature)

한개의 파일이 아주 클 경우는 Channel 별로 분할해서 받을 수 없습니다.

MultiSection Backup 기능은 하나의 큰 파일을 여러 개의 프로세스가 동시에 다른 백업셋을 생성해서 백업을 받을 수 있는 아주 유용한 기능입니다.


RMAN> report schema ;


RMAN> backup as compressed backupset

2> section size 100m

3> format '/data/backup/rman/%U_%T'

4> datafile 1 ;





11. 그 외 각종 백업 옵션들 사용하기


1) keep - backup 수행시 backupset 보존기간 설정하기

RMAN> backup as compressed backupset tablespace example

2> format '/data/backup/rman/%U_%T'

3> keep until time 'sysdate+90' ;


2) Not backed up - 백업 안된 데이터파일만 골라서 백업하기

이 옵션은 특정 시점 이후 추가된 테이블 스페이스나 데이터 파일이 없을 경우 그 부분만 백업을 수행하는 기능입니다.

RMAN> backup as compressed backupset database

2> format '/data/backup/rman/%U_%T' ;


위와 같이 데이터 파일 백업 수행 후 아래와 같이 추가


SYS> create tablespace test

  2     datafile '/app/oracle/oradata/testdb/test01.dbf' size 10m ;


SYS> alter tablespace users add datafile

  2     '/app/oracle/oradata/testdb/users02.dbf' size 5m ;


RMAN> backup as compressed backupset database

2> format '/data/backup/rman/%U_%T'

3> not backed up ;


위와 같이 추가된 부분만 백업이 수행됩니다.

만약 기준일을 주고 싶으면


RMAN> backup as compressed backupset database

2> format '/data/backup/rman/%U_%T'

3> not backed up since time='sysdate - 5 ' ;





12. RMAN 백업 작업 진행사항 확인하기

SYS> SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK, 

  2   ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE" 

  3   FROM V$SESSION_LONGOPS 

  4   WHERE OPNAME LIKE 'RMAN%' 

  5   AND OPNAME NOT LIKE '%aggregate%' 

  6   AND TOTALWORK != 0 

  7   AND SOFAR <> TOTALWORK ; 





13. 주요 백업 예제들


예제  1.  전체  데이터베이스를  백업  받으세요. (독립형,  작업형  각각  수행하세요) 

-  독립형  명령 

RMAN> backup as compressed backupset database  

2>    format '/data/backup/rman/%U_%T' ; 


-  작업형  명령 

RMAN> run {  

2> allocate channel c1 device type disk  

3> format   ‘/data/backup/rman/%U_%T’; 

4> backup as compressed backupset database;  

5> }



예제  2. Channel 3개를  할당해서  Example, users, system, control file  만  백업  받으세요. 

RMAN> run {  

2> allocate channel c1 device type disk;  

3> allocate channel c2 device type disk;  

4> allocate channel c3 device type disk;  

5> backup as compressed backupset    

6>    tablespace example,users,system  

7> include current controlfile;

8>



예제  3.  전체  데이터  파일의  위치를  확인  한  후  파일  번호로  백업을  수행하세요. 

RMAN> report schema ;


RMAN> run { 

2> allocate channel c1 type disk; 

3> backup as compressed backupkset datafile 1,2

4>



예제  4.  현재  사용중인  Control file만  백업  받으세요. 

RMAN> run { 

2> allocate channel c1 type disk; 

3> backup current controlfile; 



예제  5.  아래의  조건으로  RMAN  백업  받으세요 

* RMAN  을  사용하여  sysaux, example ,system  테이블  스페이스를  백업하세요. 

*  백업  경로는   sysaux -> /data/backup/open/ 

                       example -> /data/backup/rman/ 

                       system -> /data/backup/close/ 


*  독립형  명령어  3번  수행하지  말고  작업형  명령어로  한번에  백업하세요. 

* Channel은  3개로  병렬작업  하세요. (Channel  이름은  각자  알아서  정하세요) 

*  각  Channel은  백업  파일  하나의  크기가  최대  10M  를  넘지  않도록  설정하세요 


RMAN> run { 

2> allocate channel ch10 type disk ; 

3> allocate channel ch11 type disk ; 

4> allocate channel ch12 type disk ; 

5> backup as compressed backupset 

6>   tablespace example channel ch10 

7>     format '/data/backup/rman/%U_%T

8>   tablespace sysaux channel ch11 

9>     format '/data/backup/close/%U_%T' 

10>   tablespace users channel ch12 

11>     format '/data/backup/open/%U_%T'; 

12>



예제  6.  차등  증분  백업  실습  

1. level 0으로  데이터베이스를  전체  백업  받기 

RMAN> run { 

2> allocate channel c1 type disk; 

3> backup as compressed backupset 

4>     incremental level 0

5> database 

6>    format '/data/backup/rman/%U_%T'; 

7> } 


2. level 3으로  users tablespace  만  차등  증분  백업  받기 

RMAN> run { 

2> allocate channel c1 type disk; 

3> backup as compressed backupset 

4>     incremental level 3

5> tablespace users; 

6> } 



예제  7.  누적  증분  백업  하기 

RMAN> run { 

2> allocate channel c2 type disk; 

3> backup as compressed backupset 

4>     incremental level 3 cumulative 

5> tablespace example; 

6>



예제  8.  전체  데이터파일을  백업하면서  Archive log file  까지  함께  백업하기 

RMAN> backup as compressed backupset database plus archivelog

2> format '/data/backup/rman/%U_%T'; 



예제  9. Archive log file  만  백업하기 

RMAN> backup   as   compressed   backupset   archivelog   all ;


이상으로  RMAN  을  사용하여  다양한  방법과  옵션을  사용하여  백업을  수행하는  방법을  살펴보았습니다.  

다음으로는  RMAN  을  사용하여  각종  장애를  복구하는  방법을  살펴보겠습니다.





14. RMAN 으로 복구하기

RMAN  복구  방법  역시  전통적인  방법과  동일하게  Restore  와  Recovery  라는  개념으로  나뉘게 됩니다. 

Restore  는  백업  파일로부터의  복원이고  

Recovery  는  Redo Log /ArchiveLog  를  적용시켜 복구  하는  것입니다.  

전통적인  방법과의  차이라면  순서와  원리는  동일하지만  

전통적인  방법은  이 과정을  관리자가  수동으로  수행했던  것을  RMAN  유틸리티가  수행한다는  것입니다.  

아래에서  자세히  각  Case  별로  어떻게  복구하는  지  살펴  보겠습니다. 


* Case 1.   Offline  되는  데이터  파일이  삭제된  경우  - DB  종료없이  복구  가능   

Step 1.  실습을  위해  신규  테이블  스페이스를  생성  후  full backup  을  수행합니다. 

SYS>create tablespace rtest 

  2   datafile '/app/oracle/oradata/testdb/rtest01.dbf' size 10M; 

Tablespace created. 


SYS>@dd 


RMAN으로  접속해서  전체  백업을  수행합니다. 


RMAN> backup as compressed backupset database 

2> format '/data/backup/rman/%T_full_%U'; 


Step 2. rtest01.dbf  파일을  삭제  합니다. 

RMAN> report schema; 


-- rtest01.dbf  파일을  삭제합니다. 


RMAN> exit 

$ rm -f /app/oracle/oradata/testdb/rtest01.dbf 

$ ls /app/oracle/oradata/testdb/rtest01.dbf 


Step 3.  삭제된  파일을  복구합니다. 

1)  독립형  명령어로  복구해  보겠습니다. 

RMAN> sql 'alter tablespace rtest offline immediate' ;

RMAN> restore tablespace rtest ; 

RMAN> recover tablespace rtest ; 

RMAN> sql 'alter tablespace rtest online' ; 

sql statement: alter tablespace rtest online 


2)  같은  장애를  한번  더  발생시켜서  작업형  명령어로  복구합니다. 

RMAN> exit 

$ rm -f /app/oracle/oradata/testdb/rtest01.dbf 

$ ls /app/oracle/oradata/testdb/rtest01.dbf 


$ rman target sys/oracle 

RMAN> run { 

2> sql 'alter tablespace rtest offline immediate'; 

3>      restore tablespace rtest ; 

4>      recover tablespace rtest ; 

5> sql 'alter tablespace rtest online'; 

6>


위의  예에서  보듯이  독립형  명령어는  하나의  과정이  끝나면  관리자가  다음  명령어를  계속  입력해야  해서  불편한  부분이  많습니다.  

그러나  작업형  명령어는  관리자가  작업  순서대로  명령어 여러  개를  한꺼번에  적어주면  RMAN이  순서대로  알아서  수행합니다.  

중요한  것은  관리자는  복구 작업의  순서를  알고  있어야  한다는  부분입니다.  

익숙해  지면  아주  편리해서  작업형  명령어를  더 많이  사용합니다.  

여기서도  앞으로의  실습은  작업형  명령어를  사용하도록  하겠습니다. 



Case 2.Offline  이  안되는  데이터  파일이  삭제된  경우  - DB  종료  후  복구 

이번  경우는  Offline  이  안되는  system tablespace  를  삭제  한  후  복구를 하겠습니다. 

Step 1.  현재  상태  확인  후  system01.dbf  삭제하기 

RMAN> report schema;


RMAN> exit 

$ rm -f /app/oracle/oradata/testdb/system01.dbf 

$ ls /app/oracle/oradata/testdb/system01.dbf 


Step 2. DB   종료  후  재시작하여  에러  확인 

$ rman target sys/oracle

RMAN> shutdown immediate ;

Additional information: 3   <---  정상  종료가  안되는  것이  확인  됩니다. 

RMAN> shutdown abort;   <---  강제로  비정상  종료를  시킵니다. 

RMAN> startup 

system01.dbf  파일이  없어서   open  이  안됩니다.


Step 3.  파일을  복원합니다. 

RMAN> restore tablespace system ; 

RMAN> recover database; <--  비정상  종료가  되었기에  전체  데이터베이스를 복구합니다.

RMAN> alter database open;


정상적으로  복구  완료되었습니다. 

위에서는  독립형  명령어로  작업을  했지만  당연히  작업형  명령어로도  가능합니다. 

직접  해  보시기  바랍니다.



Case 3.  임시  경로에서  복구하기 

rtest  테이블  스페이스를  삭제  한  후  기존  파일  경로  말고  다른  위치에  restore  하고  recover 하는  실습을  해보겠습니다.   

복원  경로를  다른  위치로  지정하는  명령어는  set new name for datafile <번호  또는  경로> to <  새  위치  경로  및 파일명> 입니다. 

그리고  복원  한  후  반드시  Control file의  내용을  switch datafile <파일번호> 명령어로  변경해야  합니다.  

이  책에서는  임시  복원  장소를  /data/temp  디렉토리로  하겠습니다.



Step 1.  현재  상태를  확인  후  파일을  삭제합니다. 

RMAN> report schema; 

RMAN> exit 

$ rm -f /app/oracle/oradata/testdb/rtest01.dbf 

$ ls /app/oracle/oradata/testdb/rtest01.dbf 



Step 2.  임시경로로  파일을  복원  한  후  복구합니다. 

$ mkdir /data/temp   <-  없을  경우  이렇게  새로  만드세요. 

$ rman target sys/oracle


--  파일을  복원하기  전에  복원할  경로를  먼저  지정해  준  후에  restore  명령을  내립니다. 

작업형  명령어로  복구를  하겠습니다. 


RMAN> run { 

2> sql 'alter tablespace rtest offline immediate' ;

3> set newname for datafile '/app/oracle/oradata/testdb/rtest01.dbf' 

4> to '/data/temp/rtest01.dbf'; 

5> restore tablespace rtest; 

6> switch datafile 6;  <-  이  파일번호는  report schema  에서  확인했습니다. 

7> recover tablespace users; 

8> sql 'alter tablespace rtest online'; 

9> }



위  명령에서  3-4  번줄로  복원하기  전에  미리  경로를  지정  한  후  

5번  줄에서  백업된  파일을 새  경로에  복원하고  

6번  줄에서  control  file  에  있는  경로를  새  경로로  변경해  주는  순서를  꼭  기억하세요.  

사람이  하는  작업과  비교하면  3,4,5  번줄은  새로운  경로로  복사하는  과정이고  

6번  줄은  복사  후  alter tablespace rtest rename datafile   하는  과정과  동일합니다. 




* Case 4.  임시경로에  필요한  데이터  파일만  복원  후  복구하기 

-  이번  실습은  삭제된  data  file이  삭제되어   RMAN  백업을  사용하여  복구를  하는데 

모든  데이터 파일을  복원하는  것이  아니라  반드시  복구에  필요한  데이터파일만  복원하여  복구하는  방법을  익힙니다.

그리고  데이터파일  중  일부가  백업이  없는  상태에서  rm  으로  삭제되어  해당  파일을  새로 생성해서  복구하는  과정을  RMAN  으로  수행하겠습니다. 



Step1 .  현재  상태를  확인  후  전체  Full Backup  을  수행합니다. 

RMAN> report schema; 

RMAN> backup as compressed backupset database 

2> format '/data/backup/rman/%U_FULL_%T'; 



Step 2.  새로운  테이블  스페이스  (rtest2)  를  생성하고  장애를  만듭니다

RMAN> exit

$ sqlplus   sys/oracle   as   sysdba 

SYS>create tablespace rtest2 

  2   datafile '/app/oracle/oradata/testdb/rtest02.d bf' size 10M;

SYS>create table scott.tt310 (no number) tablespacertest02; 

SYS>insert into scott.tt310 values (1); 

SYS>commit;


SYS>select * from scott.tt310 ; 

SYS>!rm   /app/oracle/oradata/testdb/rtest02.dbf 

SYS>!ls   /app/oracle/oradata/testdb/rtest02.dbf 


SYS>alter tablespace rtest2 offline; 

SYS>alter tablespace rtest2 online; 

에러 발생


SYS>select * from scott.tt310 ;

에러발생



Step 3. DB  종료  후  임시경로(/data/temp)로  필요한  파일만  복사합니다. 

( Data File - Backup File  에서  복원  , Control File / Redo Log File -  최근  사용중이던  파일  복사  ) 

SYS>shutdown immediate; 

SYS>! 

$ cp /app/oracle/oradata/testdb/*.log   /data/temp/ 

$ cp /app/oracle/oradata/testdb/*.ctl   /data/temp/ 

$ vi $ORACLE_HOME/dbs/inittestdb.ora

#control_files=("/app/oracle/oradata/testdb/control01.ctl",    <--  기존  내용  주석  처리 

#              "/app/oracle/oradata/testdb/control02.ctl",    <--  기존  내용  주석  처리 

#              "/app/oracle/oradata/testdb/control03.ctl")    <--  기존  내용  주석  처리 

control_files="/data/temp/control01.ctl"    <--  임시  경로로  위치를  지정합니다. 



Step 4. RMAN  으로  복구합니다. 

$ rman target sys/oracle 


RMAN> run { 

## Redo log file위치부터  먼저  변경합니다 

##  아래  2-13   번  줄에서  ''/app  부분과  “/data , log “  는  single Quote  를  두  번  쓰셔야  합니다. 

2> startup mount ; 

3> 

4> sql "alter database rename file ''/app/oracle/oradata/testdb/redo01_a.log''

5>      to ''/data/temp/redo01_a.log''"; 

6> sql "alter database rename file ''/app/oracle/oradata/testdb/redo01_b.log''

7>      to ''/data/temp/redo01_b.log'' "; 

8> sql "alter database rename file ''/app/oracle/oradata/testdb/redo02_a.log'' 

9>      to ''/data/temp/redo02_a.log''"; 

10> sql "alter database rename file ''/app/oracle/oradata/testdb/redo02_b.log''

11>     to ''/data/temp/redo02_b.log''"; 

12> sql "alter database rename file ''/app/oracle/oradata/testdb/redo03_a.log'' 

13>     to ''/data/temp/redo03_a.log''"; 

14> sql "alter database rename file ''/app/oracle/oradata/testdb/redo03_b.log''

15>     to ''/data/temp/redo03_b.log'' "; 

16>##  필요한  파일만  경로를  임시경로로  변경합니다 

17> set newname for datafile 1 to '/data/temp/system01.dbf' ; 

18> set newname for datafile 2 to '/data/temp/sysaux01.dbf' ; 

19> set newname for datafile 3 to '/data/temp/undotbs01.dbf' ; 

20>##  필요없는  파일은  Offline Drop   처리. Single Quote  와  Double Quote  를  주의하세요 

21> sql "alter database datafile ''/app/oracle/oradata/testdb/users01.dbf'' offline drop" ; 

22> sql "alter database datafile ''/app/oracle/oradata/testdb/example01.dbf''offline drop" ; 

23>##  백업이  없는  파일을  신규로  생성. Single Quote  와  Double Quote  를  주의하세요 

24> sql "alter database create datafile ''/app/oracle/oradata/testdb/rtest02.dbf''

25> as ''/data/temp/rtest02.dbf''"; 

26>##  필요한  테이블  스페이스만  복원합니다. 

27> restore tablespace system ; 

28> restore tablespace sysaux ; 

29> restore tablespace undotbs1; 

30>##  파일위치  변경내용을  Control File  에  반영합니다. 

31> switch datafile all ; 

32>##  필요한  테이블스페이스만  복구합니다. 

33> recover tablespace system ; 

34> recover tablespace sysaux ; 

35> recover tablespace undotbs1 ; 

36> recover tablespace rtest2 ; 

37> 

38> alter database open; 

39> 

40> sql "alter tablespace rtest2 online" ; 

41>


RMAN> exit 



Step 5.  확인합니다. 

$ sqlplus sys/oracle as sysdba;

SYS>@dd

SYS>select * from scott.tt310 ;


이번  실습의  핵심은  RMAN  을  사용해서  복구에  필요한  파일들만  임시  경로로  복원  하는  것입니다.

아주  중요한  내용이므로  꼭  반복  연습하시기  바랍니다. 


참고로  아래와  같이  set  newname  for  database  to   '  새경로  ';  또는  set  newname  for 

tablespace users to '  새경로'   의  형식도  사용  가능합니다


RMAN> run { 

2> startup mount ; 

3> set newname for database to '/data/temp/%b'; 

4> restore database ; 

5> switch datafile all ; 

6> recover database ; 

7>


위와  같은  경우  모든  데이터파일  전부를  /data/temp/원래이름으로  복원  한  후에  복구를 수행하게 됩니다.

이상으로  RMAN  으로  완전  복구하는  내용을  살펴보았습니다. 

다음으로는  RMAN  으로  불완전  복구를  하는  경우를  알아보겠습니다.




* Case 5. Drop table후  복구하기  –  임시  경로  사용 

이번  실습은  불완전  복구의  대표적  예로  

drop  table  장애가  발생한  경우  원래  경로가  아닌  임시경로를  이용해서  복구하는  방법을  실습하겠습니다.

이번  실습의  핵심은  기존  경로가  아닌  다른경로(여기서는  /data/temp)의  Control File  ,  Redo  Log File,  Data  File  을  사용하여  

장애난  테이블을  복구해  내는  것입니다.  

현업에서  많이  사용하는  방법이며  이  방법으로  해야  원본  데이터를  손상시키지  않고  복구를  할  수  있습니다.

이  방법을  완전히  익혀야  뒷부분에  나오는  RMAN  을  사용하여  DB  무정지  응급복구를  할  수  있습니다.



Step 1.  전체  데이터베이스를  백업합니다. 

$ rman target sys/oracle 

RMAN> report schema;

RMAN> backup as   compressed backupset database 

2> format '/data/backup/rman/%T_full_%U'



Step 2.  예제  테이블  생성  후  Table drop  장애  발생 

RMAN> exit 

$ sqlplus sys/oracle as sysdba 

SYS>create table scott.tt320 (no number) tablespace users ; 

SYS>drop tablespace rtest3 ;

SYS>insert into scott.tt320 values (1);

SYS> commit;

SYS>select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS')from dual;

복구에 사용할 시간


SYS>select * from scott.tt320 ; 

SYS>drop table scott.tt320 purge; 

SYS>select * from scott.tt320 ; 

에러 발생



Step 3. DB  종료  후  임시경로  (/data/temp)  에서  복구합니다. 

SYS>shutdown immediate;

SYS>exit 


$ cp /app/oracle/oradata/testdb/*.ctl   /data/temp/ 

$ cp /app/oracle/oradata/testdb/*.log   /data/temp/ 


$ vi $ORACLE_HOME/dbs/inittestdb.ora

#*.control_files='/app/oracle/oradata/testdb/control01.ctl'   <-  기존  파일  주석처리 

*.control_files='/data/temp/control01.ctl'   <-  새  경로로  지정함 



3.2 RMAN  을  사용하여  파일을  새  경로로  복원

$ rman target sys/oracle

RMAN> run { 

2> startup mount ; 

3>##single quote  와  double quote  를  주의하세요 

4> sql "alter database rename file ''/app/oracle/oradata/testdb/redo01_a.log''

5>      to ''/data/temp/redo01_a.log'' "; 

6> sql "alter database rename file ''/app/oracle/oradata/testdb/redo01_b.log''

7>      to ''/data/temp/redo01_b.log''"; 

8> sql "alter database rename file ''/app/oracle/oradata/testdb/redo02_a.log''

9>      to ''/data/temp/redo02_a.log''"; 

10> sql "alter database rename file ''/app/oracle/oradata/testdb/redo02_b.log''

11>     to ''/data/temp/redo02_b.log''"; 

12> sql "alter database rename file ''/app/oracle/oradata/testdb/redo03_a.log''

13>     to ''/data/temp/redo03_a.log'' "; 

14> sql "alter database rename file ''/app/oracle/oradata/testdb/redo03_b.log''

15>     to ''/data/temp/redo03_b.log'' "; 

16> ##  모든  데이터파일의  위치를  임시경로로  변경합니다

17> set newname for datafile 1 to '/data/temp/system01.dbf' ; 

18> set newname for datafile 2 to '/data/temp/sysaux01.dbf' ; 

19> set newname for datafile 3 to '/data/temp/undotbs01.dbf' ; 

20> set newname for datafile 4 to '/data/temp/users01.dbf' ; 

21> set newname for datafile 5 to '/data/temp/example01.dbf' ; 

22> ##  데이터  파일을  복원합니다

23> restore database ; 

24> switch datafile all ; 

25> ##  복구할  시간을  미리  지정을  합니다

26> sql 'alter session set nls_date_format="YYYY-MM-DD:HH24:MI:SS"'; 

27> set until time='2013-08-18:15:10:51' ; 

28> ##  복구합니다

39> recover database ; 

30> 

31> alter database open resetlogs; 

32> } 



Step 4.  확인합니다 

RMAN> exit 

$ sqlplus sys/oracle as sysdba

SYS>@dd 

SYS>select * from scott.tt320 ;


무사히  복구  완료  되었습니다. 

이  예에서는  drop  table  만  복구했지만  이와  같은  방법으로  drop  user  ,  truncate  table  ,  

잘못된 udpate  나  delete  후  commit  을  수행한  장애들을  모두  복구  할  수  있습니다.

지면  관계상  모든  예들을  다  언급하진  못했지만  방법은  동일하므로  꼭  스스로  테스트  해서  자신의  실력으로  만들기  바랍니다. 




* RMAN  연습문제  - Drop User  복구하기 

Step 1.  현재  상황  확인  후  전체  백업  수행 

RMAN> backup as compressed backupset database 

2> format '/data/backup/rman/%U_%T'; 



Step 2. tuser  를  생성한  후  테스트  테이블  을  생성합니다. 

SYS>create user tuser identified by oracle 

  2   default tablespace users 

  3   temporary tablespace temp 

  4   quota unlimited on users ; 

SYS>grant connect , resource to tuser; 

SYS>conn tuser/oracle 


TUSER>create table test1 (no number) ; 

TUSER>insert into test1 values (1); 

TUSER>commit; 

TUSER>conn sys/oracle as sysdba


SYS>select * from tuser.test1 ; 

SYS>@t 



Step 3. Drop user  장애를  발생시킵니다. 

SYS>drop user tuser cascade ; 

SYS>select * from tuser.test1 ; 

에러 발생


RMAN  을  사용하여  위  Step 3.  에서  삭제된  tuser  계정을  복구하세요. 




* Case 6. Drop tablespace  복구하기  -  백업  파일이  있을  경우 

이번  Case  는  RMAN  으로  복구하기  어려운  Drop Tablespace  복구입니다. 

먼저  살펴본  사용자  복구에서  Drop  Tablespace  는  백업된  Control  File  을  가져와야  한다는  것을 

배웠습니다. RMAN  도  동일한  원리로  작업이  진행  되므로  유의해서  잘  익히시길  바랍니다. 



Step 1.  테스트용  테이블  스페이스  생성  

SYS>create tablespace rtest4 

  2   datafile '/app/oracle/oradata/testdb/rtest04.dbf' size 10M; 


SYS>@dd 



Step 2. RMAN  으로  전체  백업을  수행합니다. 

$ rman target sys/oracle 

RMAN> backup as compressed backupset database 

2> format '/data/backup/rman/%U_%T' ; 


piece handle=/data/backup/rman/07oprbnn_1_1_20131125 tag=TAG20131125T110527  

##  데이터  파일을  복원할  때  이  TAG  이름을  사용하여  복원할  예정입니다. 


piece handle=/data/backup/rman/08oprbpo_1_1_20131125 tag=TAG20131125T110527  

## Control file  을  복원할  때  이  이름을  사용하여  복원할  예정입니다.



Step 3.  예제  데이터  입력  후  Tablespace drop  장애  발생합니다. 

RMAN>exit 

$ sqlplus sys/oracle as sysdba 

SYS>create table scott.tt330 (no number) tablespacertest4 ; 

SYS>insert into scott.tt330 values (1); 

SYS>commit; 


SYS>select * from scott.tt330; 

SYS>select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS')from dual; 

 복구에  사용할  시간입니다. 


위와  같이  시간  조회하지  말고  앞에서  배운대로  

Drop  Tablespace  는  Alert  log  에  Tablespace  가 Drop  된  시간이  기록되니  

그  파일에서  찾아도  됩니다. 


SYS>drop tablespace rtest4 including contents and datafiles; 

SYS>select * from scott.tt330 ; 

에러 발생



Step 4.  임시  경로로  복구에  필요한  파일을  복원후  복구합니다. 

이  과정에서  순서가  아주  중요합니다.  

이  책에서는  원본  데이터는  보존하고  임시  경로를  활용해서  복구를  하는  방법을  권장합니다.  

그래서  파라미터  파일에서  Control  file  의  경로를  

복구  임시 경로인  /data/temp2/  로  변경한  후  Control File  을  restore  해서  복구를  진행하겠습니다. 



4.1 Parameter file  에서  Control File  위치  변경후  Control File Restore  하기. 

SYS>shutdown immediate; 

SYS>

$ vi $ORACLE_HOME/dbs/inittestdb.ora

#control_files=("/app/oracle/oradata/testdb/control01.ctl",   <--  기존  내용  주석  처리 

#              "/app/oracle/oradata/testdb/control02.ctl",   <--  기존  내용  주석  처리 

#              "/app/oracle/oradata/testdb/control03.ctl")   <--  기존  내용  주석  처리 

control_files="/data/temp2/control01.ctl"   <--  임시  경로로  지정합니다. 


$ cp /app/oracle/oradata/testdb/*.log   /data/temp2/



4.2  백업파일로  부터  Control file  을  복원한  후  파일  경로  바꾸고  복구합니다. 

아래  스크립트를  잘  살펴보세요. 


$ rman target sys/oracle 

RMAN> run { 

2>   startup nomount ; 

3> ##  아래  Control File  의  from  경로는  위에서  백업받은  내용에서  나오는  경로입니다. 

4>   restore controlfile from '/data/backup/rman/08oprbpo_1_1_20131125' ;

5> 

6>   alter database mount ; 

7>##  아래에서  Single Quote  와  Double Quote  를  주의하세요. 

8>   sql "alter database rename file ''/app/oracle/oradata/testdb/redo01_a.log''

9>        to ''/data/temp2/redo01_a.log'' "; 

10>   sql "alter database rename file ''/app/oracle/oradata/testdb/redo01_b.log''

11>       to ''/data/temp2/redo01_b.log''"; 

12>   sql "alter database rename file ''/app/oracle/oradata/testdb/redo02_a.log''

13>       to ''/data/temp2/redo02_a.log''"; 

14>   sql "alter database rename file ''/app/oracle/oradata/testdb/redo02_b.log''

15>       to ''/data/temp2/redo02_b.log''"; 

16>   sql "alter database rename file ''/app/oracle/oradata/testdb/redo03_a.log''

17>       to ''/data/temp2/redo03_a.log''";

18>   sql "alter database rename file ''/app/oracle/oradata/testdb/redo03_b.log''

19>       to ''/data/temp2/redo03_b.log''"; 

20> ##  복원할  데이터  파일의  경로를  변경합니다 

21>   set newname for datafile 1 to '/data/temp2/system01.dbf' ; 

22>   set newname for datafile 2 to '/data/temp2/sysaux01.dbf' ; 

23>   set newname for datafile 3 to '/data/temp2/undotbs01.dbf' ; 

24>   set newname for datafile 4 to '/data/temp2/users01.dbf' ; 

25>   set newname for datafile 5 to '/data/temp2/example01.dbf' ; 

26>   set newname for datafile 6 to '/data/temp2/rtest04.dbf' ; 

27>##  복구할  시간을  미리  지정합니다.  이때  아래처럼  format  을  미리  지정해야  합니다. 

28>   sql 'alter session set nls_date_format="YYYY-MM-DD:HH24:MI:SS"'; 

29>   set until time='2013-11-25:11:09:37' ; 

30> ## TAG  옵션을  이용하여  복원에  사용할  백업셋을  지정할  수  있습니다. 

31>   restore database from tag 'TAG20131125T110527'; 

32>   switch datafile all ; 

33> 

34>   recover database   ; 

35>   alter database open resetlogs ; 

36> }



Step 5.  확인합니다.  

$ sqlplus sys/oracle as sysdba 

SYS>@dd

SYS> select * from scott.tt330 ;


정상적으로 복구완료 되었습니다. 

이번 case 와 같이 drop tablespace 일 경우에는 삭제된 tablespace 의 정보를 가지고 있는

control file 을 복원하는 과정이 추가되었고

data file 을 복원할 때 특정 backupset 을 지정해서 복원하는 내용이 추가되었으니 잘 기억하시기 바랍니다.





Case 7 Drop tablespace 복구하기 - 백업 파일이 없을 경우

이번 경우는 삭제된 tablespace 의 정보가 전혀 없는 상태에서 복구하는 과정을 RMAN 으로 구현하는 경우입니다.



Step 1.   A  시점으로  현재  상황을  확인  후  전체  RMAN Full Backup  을  수행합니다. 

SYS>@dd 

SYS>exit 

$ rman target sys/oracle 

RMAN> backup as compressed backupset database 

2> format '/data/backup/rman/%U_full_%T';


piece handle=/data/backup/rman/03opregs_1_1_full_20131125 tag=TAG20131125T115300  

##  복구에  사용될  백업셋  TAG  이름  입니다


piece handle=/data/backup/rman/04opreiu_1_1_full_20131125 tag=TAG20131125T115300  

##  복구에  사용될  Control File  이름  입니다


RMAN> exit 



Step 2. B  시점으로  신규  테이블스페이스  rtest5  와  테스트용  테이블을  생성합니다.

$ sqlplus sys/oracle as sysdba 

SYS>create tablespace rtest5 

  2   datafile '/app/oracle/oradata/testdb/rtest05.d bf' size 5M;  

SYS>create table scott.tt340 (no number) tablespacertest5 ; 

SYS>insert into scott.tt340 values (1); 

SYS>commit; 

SYS>select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS')from dual; 

복구에  사용될  시간입니다. 

SYS>select * from scott.tt340 ; 



Step 3. C  시점으로  Drop Tablespace  를  수행해서  장애를  발생시킵니다. 

SYS>@dd 

SYS>drop tablespace rtest5 including contents and datafiles; 

SYS>@dd 

SYS>select * from scott.tt340 ; 

에러발생



Step 4. DB  종료  후  임시경로  (/data/temp3/)로  필요한  파일을  이동  후  복구합니다. 


4.1  먼저  Parameter file  에서  Control File  의  경로를  변경한  후  Control File  을  백업파일로부터  복원합니다. 

여기서  중요한  부분은  복원할  Control  file  에  삭제된  Tablesapce rtest5  의  정보가  없다는  것입니다. 

작업형  명령어로  한번에  실행해도  되지만  설명의  편의상  나누어서  단계별로  진행하겠습니다. 


SYS>shutdown immediate; 

SYS>! 

$ vi /app/oracle/product/11g/dbs/inittestdb.ora 

#control_files=("/app/oracle/oradata/testdb/control01.ctl", <--  기존  내용  주석  처리 

#              "/app/oracle/oradata/testdb/control02.ctl", <--  기존  내용  주석  처리 

#              "/app/oracle/oradata/testdb/control03.ctl") <--  기존  내용  주석  처리 

control_files="/data/temp3/control01.ctl"   <--  이렇게  변경합니다. 

:wq! 

$ cp   /app/oracle/oradata/testdb/*.log   /data/temp3/ 


4.2  RMAN  에  접속하여  Control  File  을  복원  한  후  MOUNT  상태로  변경하여  파일들의  위치를 변경하고  복원합니다. 

$ rman target sys/oracle 

RMAN> run { 

2> startup nomount ; 

3>##  위  백업  내역에서  Control file  백업  이름을  확인  하면  됩니다. 

4> restore controlfile from '/data/backup/rman/04opreiu_1_1_full_20131125'; 

5> alter database mount ; 

7>##  아래에서  Single Quote  와  Double Quote  를  주의하세요. 

8> sql "alter database rename file ''/app/oracle/oradata/testdb/redo01_a.log'' 

9>       to ''/data/temp3/redo01_a.log''"

10> sql "alter database rename file ''/app/oracle/oradata/testdb/redo01_b.log''

11>      to ''/data/temp3/redo01_b.log'' "; 

12> sql "alter database rename file ''/app/oracle/oradata/testdb/redo02_a.log''

13>      to ''/data/temp3/redo02_a.log''"; 

14>   sql "alter database rename file ''/app/oracle/oradata/testdb/redo02_b.log''

15>      to ''/data/temp3/redo02_b.log'' "; 

16>   sql "alter database rename file ''/app/oracle/oradata/testdb/redo03_a.log''

17>      to ''/data/temp3/redo03_a.log''"; 

18>   sql "alter database rename file ''/app/oracle/oradata/testdb/redo03_b.log''

19>      to ''/data/temp3/redo03_b.log''"; 

20> ##  복원할  파일의  경로를  변경합니다.  복구하려는  rtest4  내역은  없습니다. 

21> set newname for datafile 1 to '/data/temp3/system01.dbf' ; 

22> set newname for datafile 2 to '/data/temp3/sysaux01.dbf' ; 

23> set newname for datafile 3 to '/data/temp3/undotbs01.dbf' ; 

24> set newname for datafile 4 to '/data/temp3/users01.dbf' ; 

25> set newname for datafile 5 to '/data/temp3/example01.dbf' ;

26> 

27> sql 'alter session set nls_date_format="YYYY-MM-DD:HH24:MI:SS"'; 

28> set until time='2013-11-25:12:03:13' ; 

29> 

30> restore database from tag 'TAG20131125T115300' ; 

31> switch datafile all; 

32> } 


RMAN> report schema ; 


4.3  복구를  시도합니다.  복구  도중에  rtest04.dbf  파일  관련한  부분을  잘  보세요.

RMAN> run { 

2> sql 'alter session set nls_date_format="YYYY-MM-DD:HH24:MI:SS"'; 

3> set until time='2013-11-25:12:03:13' ; 

4> recover database ; 

5> } 


관리자가  직접  수행하는  수동  복구의  경우는  위  rtest05.dbf  를  수동으로  생성  해  준 후  

다시  복구를  재  시도  했었지만  RMAN  에서는  자동으로  생성을  하는  것을  확인  할  수  있습니다. 


Step 5.  복구  후  데이터를  확인합니다. 

RMAN> alter database open resetlogs ; 

RMAN> exit 

$ sqlplus sys/oracle as sysdba 

SYS>@dd 

SYS>select * from scott.tt340 ; 

정상적으로  복구  완료되었습니다. 


여기까지  RMAN  을  사용하여  물리적인  장애와  논리적인  장애를  복구하는  다양한  방법을  살펴보았습니다. 

지면  관계상  모든  경우를  다  볼수  없어서  대표적인  경우만  살펴보았지만  이  방법을  활용해서  나머지  장애  유형들도  꼭  연습하시기  바랍니다. 




15. RMAN  백업을  사용하여  무정지  응급  복구  진행하기 

이번  장에서는  drop  table  장애가  발생했을  때  RMAN  을  사용하여  운영중인  서버에서 무정지  상태로  응급  복구하는  방법을  살펴보겠습니다. 

이번장의  내용은  현재  열심히  현업에서  활동중인  김범준  님이  소개하는  방법으로  김범준님의  동의를  구해서  소개  해  드립니다. 

아래  실습은  10g  RMAN  기반과  11g  RMAN  기반으로  나누어서  테스트가  되었으니  실습 도중  경로를  잘  보시기  바랍니다.  


1) Drop Table   장애  복구하기  - 10g RMAN  에서  테스트  되었습니다. 

RMAN의  DUPLICATE기능을  이용하면  손쉽게  Clone  DB를  생성하여  삭제된  테이블을 복구  할  수 있습니다.

복구시  사용하는  시점의  기준은  시간,  SCN,  Sequence를  사용하여  특정시점으로  복원하려면  Archive log모드로  운영되는  DB여야  합니다. 


-장애상황 

김범준  엔지니어는  고객사에서  gogak  테이블이  삭제되었다는  연락을  받고  긴급  복구작업을  위해 고객사에  방문했습니다. 

운영서버를  정지할  수  없는  상황이며  DB는  아카이브로그  모드로  운영되고  있습니다. 

백업파일은  전날  저녁에  RMAN으로  받아둔  파일이  존재합니다. 

gogak  테이블  이  삭제된  시간은  2013-03-28-21:54:58  입니다.  



Step1. RMAN으로  전체  데이터베이스  백업 

$ rman target / 

RMAN> backup as compressed backupset database; 



Step2. gogak테이블  생성  및  drop 

$ sqlplus / as sysdba

SQL> create table scott.gogak

  2   (no number, 

  3   name varchar2(10),

  4   addr varchar2(20));

SQL> insert into scott.gogak values (1,'서진수','서울  강남구');

SQL> insert into scott.gogak values (2,'김범석','경기도  부천시');

SQL> insert into scott.gogak values (3,'김범준','경기도  부천시');

SQL> commit;

SQL> select * from scott.gogak;

SQL> alter system switch logfile;

SQL> /

SQL> /

SQL> select to_char(sysdate,'YYYY-MM-DD-HH24:MI:SS') from dual;

복구에  사용될  시간입니다. 

SQL> drop table scott.gogak purge;

SQL> select * from scott.gogak;

에러 발생



Step3. Clone DB용  Parameter File  생성  및  수정 

Clone DB에서  사용된  Parameter  파일을  생성하여  환경에  맞게  수정해줍니다. 


-- Spfile을  사용할  경우 

SQL>   create pfile='/home/oracle/product/10g/dbs/initclone.ora' from spfile;


-- Pfile을  사용할  경우 

SQL> !cp /home/oracle/product/10g/dbs/inittestdb.ora /home/oracle/product/10g/dbs/initclone.ora

SQL> !vi /home/oracle/product/10g/dbs/initclone.ora

#아래  두줄  꼭  추가 

#(‘운영DB파일경로,’클론DB파일경로’)  의  형식입니다. 

db_file_name_convert=(/home/oracle/db/testdb/,/home/oracle/db/clone/) 

log_file_name_convert=(/home/oracle/db/testdb/,/home/oracle/db/clone/) 



Step4. Clone DB  구성용  디렉터리  생성 

Clone DB에서  사용될  디렉토리  구조를  만들어  줍니다. 


$ mkdir -p /home/oracle/db/clone

$ mkdir -p /home/oracle/admin/clone

$ cd /home/oracle/admin/clone/

$ mkdir adump bdump cdump dpdump udump



Step5. Listener  설정 

( Oracle Network  관련사항은  저자의  다른  저서인  오라클  관리실무를  참고하세요) 

Target  데이터베이스  (운영DB)쪽의  listener와  tnsnames.ora  파일을  수정해줍니다. 


$ vi /home/oracle/product/10g/network/admin/listener.ora 


# listener.ora Network Configuration File: /home/oracle/product/10g/network/admin/listener.ora 

# Generated by Oracle configuration tools. 

SID_LIST_LISTENER = 

  (SID_LIST = 

    (SID_DESC = 

      (SID_NAME = PLSExtProc) 

      (ORACLE_HOME = /home/oracle/product/10g) 

      (PROGRAM = extproc) 

    ) 

  ) 

LISTENER = 

  (DESCRIPTION_LIST = 

    (DESCRIPTION = 

      (ADDRESS = (PROTOCOL = TCP)(HOST = oraserver) (PORT = 1521))

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) 

    ) 

  ) 

:wq! 


$ vi /home/oracle/product/10g/network/admin/tnsnames.ora 

# tnsnames.ora Network Configuration File:  

/home/oracle/product/10g/network/admin/tnsnames.ora

# Generated by Oracle configuration tools. 

TESTDB = 

  (DESCRIPTION = 

    (ADDRESS_LIST = 

      (ADDRESS = (PROTOCOL = TCP)(HOST = oraserver) (PORT = 1521)) 

    ) 

    (CONNECT_DATA = 

      (SERVICE_NAME = testdb) 

    ) 

  )

:wq! 



Step6. RMAN의  DUPLICATE를  이용하여  시간기반  무정지  복구 

$ export ORACLE_SID=clone 

$ export NLS_DATE_FORMAT=’YYYY-MM-DD-HH24:MI:SS’

$ sqlplus / as sysdba

SQL> startup nomount

SQL> exit

$ rman nocatalog

RMAN> connect target sys/oracle@testdb #운영DB로  접속

RMAN> connect auxiliary sys/oracle #보조DB (SID=clone)로  접속

RMAN> duplicate target database to 'clone'

2> until time '2013-03-28-21:54:58';

RMAN> exit 

$ sqlplus / as sysdba

SQL> select instance_name from v$instance; 

SQL> select * from scott.gogak;

복구가  완료되었습니다. 



Step7. Export / Import로  복구한  테이블  운영DB에  입력 

$ exp scott/tiger file=/home/oracle/gogak.dmp tables=gogak

$ export ORACLE_SID=testdb 

$ imp scott/tiger file=/home/oracle/gogak.dmp ignore=y

$ sqlplus / as sysdba

SQL> select instance_name from v$instance; 

SQL> select * from scott.gogak; 

복구가  완료되었습니다. 


2) ‘Targetless DUPLICATE’ - 11g New Features 

기존의  Duplicate  방식으로  Clone  DB를  구성하려면  Target  DB에  접속하기  위해  Listener와 tnsnames를  수정해야만  했습니다. 

11g에서  새롭게  추가된  Targetless Duplicate기능으로  

target DB에  접속하지  않고  Backupset과  Archive  log파일만을  이용해  손쉽게  Clone DB를  구성할  있습니다. 


-장애상황 

김범준  엔지니어는  고객사에서  gogak  테이블이  삭제되었다는  연락을  받고  긴급  복구작업을  위해 고객사에  방문했습니다.

운영서버를  정지할  수  없는  상황이며  DB는  아카이브로그  모드로  운영되고  있습니다.  

백업파일은  전날  저녁에  RMAN으로  받아둔  파일이  존재합니다.  

리스너를  재시작  할  수  없는  상황이라  target  DB에  네임서비스를  구성하기  어려운  상황입니다. 

gogak  테이블  이  삭제된  시간은  2013-03-14-23:43:06  입니다


Step1. RMAN으로  전체  데이터베이스  백업 

$ rman target /

RMAN> backup as compressed backupset format '/data/rman/data_%U_%T'

2> database;

RMAN> exit



Step2. gogak테이블  생성  및  drop 

$ sqlplus / as sysdba

SQL> create table scott.gogak

  2   (no number,

  3   name varchar2(10),

  4   addr varchar2(20));

SQL> insert into scott.gogak values (1,'서진수','서울  강남구');

SQL> insert into scott.gogak values (2,'김범석','경기도  부천시');

SQL> insert into scott.gogak values (3,'김범준','경기도  부천시');

SQL> commit;

SQL> select * from scott.gogak;

SQL> alter system switch logfile;

SQL> /

SQL> /

SQL> /

SQL> select to_char(sysdate,'YYYY-MM-DD-HH24:MI:SS') from dual;

복구에  사용될  시간입니다. 

SQL> drop table scott.gogak purge;

SQL> select * from scott.gogak;

에러 발생

SQL> alter system switch logfile;

SQL> /

SQL> /

SQL> /



Step3. Clone DB용  Parameter File  생성  및  수정 

Clone DB에서  사용된  Parameter  파일을  생성하여  환경에  맞게  수정해줍니다. 


-- Spfile을  사용할  경우 

SQL>   create pfile='/app/oracle/product/11g/dbs/initclone.ora' from spfile;

File created. 


-- Pfile을  사용할  경우 

SQL> !cp /app/oracle/product/11g/dbs/inittestdb.ora   /app/oracle/product/11g/dbs/initclone.ora 

SQL> !vi /app/oracle/product/11g/dbs/initclone.ora 


#*.memory_target=823132160 # memory_target Parameter는  꼭  주석처리  합니다.


db_file_name_convert=('/data/db/testdb/','/data/db/clone/') <--  반드시  추가해주세요 

log_file_name_convert=('/data/db/testdb/','/data/db/clone/') <--  반드시  추가해주세요

 


Step4. Clone DB  구성용  디렉토리  생성 

Clone DB에서  사용될  디렉토리  구조를  만들어  줍니다. 

$ mkdir -p /data/db/clone

$ mkdir -p /app/oracle/admin/clone

$ mkdir -p /app/oracle/admin/clone/adump

$ mkdir -p /app/oracle/admin/clone/dpdump



Step5. Archive log  파일을  backupset  파일이  있는  디렉토리로  복사 

$ cd /data/arc1

$ cp -av * /data/rman/

`1_1_810085029.dbf' -> `/data/rman/1_1_810085029.dbf' 

`1_2_810085029.dbf' -> `/data/rman/1_2_810085029.dbf' 

`1_3_810085029.dbf' -> `/data/rman/1_3_810085029.dbf' 

`1_4_810085029.dbf' -> `/data/rman/1_4_810085029.dbf' 

`1_5_810085029.dbf' -> `/data/rman/1_5_810085029.dbf' 

`1_6_810085029.dbf' -> `/data/rman/1_6_810085029.dbf' 

`1_7_810085029.dbf' -> `/data/rman/1_7_810085029.dbf' 


[oracle@oraserver arc1]$ cd /data/rman

[oracle@oraserver rman]$ ll



Step6. RMAN의  Targetless DUPLICATE를  이용하여  시간기반  무정지  복구

[oracle@oraserver ~]$ export ORACLE_SID=clone 

[oracle@oraserver ~]$ export NLS_DATE_FORMAT=’YYYY-MM-DD-HH24:MI:SS’

[oracle@oraserver ~]$ sqlplus / as sysdba 

 

SQL> startup nomount

SQL> exit

[oracle@oraserver ~]$ rman auxiliary /

RMAN> duplicate database to 'clone'

2> pfile='/app/oracle/product/11g/dbs/initclone.ora'

3> nofilenamecheck

4> backup location '/data/rman'

5> until time '2013-03-14-23:43:06';

RMAN> exit

[oracle@oraserver ~]$ sqlplus / as sysdba 

SQL> select * from scott.gogak


SQL> exit



Step7. Export / Import로  복구한  테이블  운영DB에  입력 

[oracle@oraserver ~]$ exp scott/tiger file=/home/oracle/gogak.dmp tables=gogak

[oracle@oraserver ~]$ export ORACLE_SID=testdb

[oracle@oraserver ~]$ imp scott/tiger file=/home/oracle/gogak.dmp ignore=y

[oracle@oraserver ~]$ sqlplus / as sysdba

SQL> select instance_name from v$instance;

SQL> select * from scott.gogak;


복구가  정상적으로  완료되었습니다. 

이상으로  RMAN  을  사용하여  논리적인  장애들을  서비스의  중단없이  복구하는  것을  살펴보았습니

다.  아주  유용한  기능이므로  꼭  익혀두세요. 




17. RMAN으로  Block Corruption Recovery  수행하기

SQL> select * from emp; 

select * from emp 

ERROR at line 1: 

ORA-01578: ORACLE data block corrupted (file # 4, block # 24165) 

ORA-01110: data file 4: ‘/home/oracle/oradata/testdb/example01.dbf’


쿼리를  수행할  때  위와  같이  ORA-01578  에러가  발생하면서  Block  corruption  이  발생한  경우를 가끔씩  접할  수  있습니다.  

데이터를  저장하고  있는  Block  에  문제가  생긴  경우로  해결하기가  아주 어려운  장애입니다.  

이럴  경우  RMAN의  Block Recovery  기능을  이용하여  복구를  할  수  있습니다. 

거의  대부분의  경우에  블록에서  에러가  발견되면  발견한  시점에  해당  블록에  에러가  났다는  표시를  해  둡니다.  

그리고  다음부터  그  블록이  완전히  복구가  될  때까지는  사용하지  않게  됩니다.


1) recover …. Block  명령을  사용하여  복구하기  - 11g New Feature

일반적으로  Block  Corruption  이  발생하면  해결  방법은  백업된  정상적인  백업  파일을  복원  한  후 

해당  데이터파일을  recover  하는  것입니다.  그러나  정상적으로  백업된  백업  파일이  없을  경우에는 

복구를  할  수  없는데  RMAN  의  block Recovery  기능을  활용해서  복구해  보겠습니다. 

이  실습은  10g RMAN  에서와  11g RMAN  에서  각각  실행해서  비교하겠습니다. 


Step 1.  현재  상태를  RMAN  으로  전체  백업을  수행합니다. 

[oracle@localhost ~]$ rman target sys/oracle 

RMAN> backup as compressed backupset database 

2> format '/data/backup/rman/%U_%T' ; 

RMAN> exit 


Step 2.  테스트용  장애를  발생시킵니다. 

SYS>@dd 

SYS>!dd if=/dev/zero of=/app/oracle/oradata/testdb/users01.dbf bs=8k 

dd: writing `/app/oracle/oradata/testdb/users01.dbf':  장치에  남은  공간이  없음 

301223+0 records in 

301222+0 records out 

2467614720 bytes (2.5 GB) copied, 15.9298 seconds, 155 MB/s 


SYS>alter tablespace users offline; 

에러 발생


SYS>alter tablespace users online; 

에러 발생



Step 3.  에러  내용을  확인합니다. 

Alert log  를  확인하여  보다  자세한  내용을  살펴보겠습니다. 


[oracle@localhost ~]$ vi $ORACLE_BASE/diag/rdbms/testdb/testdb/trace/alert_testdb.log 

Corrupt block relative dba: 0x01000001 (file 4, block 1) 

Corrupt block relative dba: 0x01000001 (file 4, block 1) 

위  에러를  보면  4번  파일  1번  블록에서  에러가  발생했다는  내용을  알  수  있습니다. 



Step 4. RMAN  으로  복구  합니다. 

[oracle@localhost ~]$ rman target sys/oracle 

RMAN> report schema; 

RMAN> recover datafile 4 block 1; 


복구가  완료되었습니다. 

단  이  기능은  10g RMAN  까지는  지원  되지  않습니다.    

RMAN  Block  Recovery  기능이  막강하긴  하지만  이  기능이  가능한  이유는  

항상  정상적인  백업파일에서  장애난  블록을  가져와서  Redo log  정보를  이용해서  Recovery  한다는  사실을  반드시  기억  하셔야  합니다. 

즉  정상적인  백업  없이는  Block Recover  기능을  사용할  수  없습니다!!!! 

Block Recovery  에  대한  더  자세한  내용은  이  책의  Block Recovery  부분을  참고하세요. 




18. Control file  재  생성시  대처방법 

앞에서  살펴본  모든  복구의  기본은  RMAN  이  사용하는  Recovery Catalog  가  

Control File  안에  저장이  되어  있어서  복구시에  그것을  보고  복구를  하는  상황이었습니다.  

그런데  만약  부득이한  사정으로  Control  file  이  삭제  된다던지  혹은  재  생성이  되어서  Recovery  Catalog  가  삭제된다면  큰 문제가  될  수  있습니다.  

이번  장에서는  Control  File  이  삭제되어  Recovery  Catalog  까지  함께  삭제  된  경우 Recover Catalog  를  재  생성해서  사용하면  됩니다.  

Recovery  Catalog  를  재생성하는  원리는  RMAN  백업  파일에서  필요한  정보만  추출해서  Catalog 에  다시  등록하면  됩니다. 

Control file  을  재생성  한  후  아래와  같이  작업하면  됩니다. 

RMAN> catalog start with '/data/backup/rman'; 




19. RMAN  관련  주요  환경  변수  정리  


1) CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF1 DAYS ; 

이  파라미터는  복구에  사용할  백업  파일의  보존기간을  설정하는  것으로  1 days  하면  1일치만                 

복구하기  위해  보존한다는  의미입니다.  이  정책을  넘어선  즉  1일이  지난  백업  파일을  모두  

지우려면  DELETE OBSOLETE  명령어를  사용하면  됩니다.  

RMAN> CONFIGURE RETENTION POLICY TO RECOVERY WINDOWOF 1 DAYS; 


2) CONFIGURE RETENTION POLICY TO REDUNDANCY 1 ; 

이  명령어는  백업본의  개수를  지정합니다.  만일의  경우  백업파일이  손상될  수  있기  때문에   

Redundancy  숫자만큼  백업파일을  다중화해서  생성하라는  의미이며  여기서는  1개로  했습니다. 

RMAN> CONFIGURE RETENTION POLICY TO REDUNDANCY 1; 


3) CONFIGURE DEVICE TYPE DISK PARALLELISM 2 ; 

이  설정은  기본Channel에  백업을  받을  때  백업  수행  프로세스의  병렬도를  설정하는  것입니다. 

이  예제처럼  설정하시면  기본Channel로  백업  받으실  때  백업  프로세스가  2개가  생성이  되어 

백업을  동시에  진행  할  것입니다. 

RMAN> CONFIGURE DEVICE TYPE disk parallelism 2; 


4) CONFIGURE CONTROLFILE AUTOBACKUP ON ; 

이  설정은  다른  파일을  백업  받을  때  Control  file까지  자동으로  백업을  수행하라는  의미입니다. 

이렇게  설정할  경우  기본  Channel에  백업이  수행되어서  불편한  점이  있으므로  아래의  2번 방법

을  더  많이  사용합니다. 

(1)RMAN> configure   controlfile   autobackup   on; 

(2)RMAN> configure   controlfile   autobackup 

    2> format   for   device   type   disk   to   '/data/backup/rman/cf_%F'; 


5) CONFIGURE MAXSETSIZE TO UNLIMITED ; 

해당  Channel에서  백업  받아지는  백업셋의  최대  크기를  unlimited로  설정하는  명령어입니다. 

RMAN> CONFIGURE MAXSETSIZE TO UNLIMITED; 


6) CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/data/backup/open/%F' ; 

이  설정은  만약  RMAN이  control  file  을  백업하고  있는  도중에  control  file  의  내용이  변경된다면 

백업전의  control  file  과  백업후의  control  file  의  내용이  달라서  에러가 발생할  것입니다.  그래서 

그런  상황이  되면  백업  받던  control  file  의  스냅샷을  위  경로에  생성하고  백업  후에  control  file 

을  재  동기화  시켜서  에러를  막아줍니다. 

RMAN> CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/data/backup/rman/%F' ; 


7) CONFIGURE BACKUP OPTIMIZATION ON ; 

이  설정은  만약  백업  받는  경로에  같은  백업  파일이  존재하면  그  파일은  백업  받지  말고  넘어가

라는  의미입니다.  RMAN이  해당  백업파일이  같은  파일인지  어떻게  구별하느냐면  백업되어  있는

파일과  지금  백업하려는  파일의  DBID , Checkpoint SCN , Creation SCN , Resetlogs SCN and time 

을  서로  비교해서  모든  것이  완벽하게  맞으면  동일  파일로  인정하게  Skip  하게  됩니다.  기본값은 

OFF  입니다. 

RMAN> CONFIGURE BACKUP OPTIMIZATION ON; 


8) CONFIGURE   CHANNEL   DEVICE   TYPE   DISK   MAXPIECESIZE 50M ; 

이  설정은  해당  Channel로  백업  받을  때  백업  파일  하나의  최대  크기를  지정하는  명령입니다.  백

업파일  하나가  너무  크면  이동할  때나  관리하기가  힘들기  때문에  최대값을  2G  이하로  설정하시

는  것이  좋습니다. 

RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK MAXPIECESIZE 50M; 


9) Show all ;  <-  현재까지의  모든  설정  내역을  확인하는  명령어입니다. 

RMAN> show all; 





20. Data Recovery Advisor (11g New Feature) 

11g부터  추가된  기능으로  장애가  발생했을  경우  장애를  해결하는  데  도움을  주는  기능입니다.

OEM  을  이용해서  사용할  수  있고  command  line  을  사용할  수도  있는  데  여기서는 command line  을  사용해서  작업하겠습니다. 

먼저  장애를  발생시킨  후  테스트  하겠습니다. 



Step 1.  장애  발생  (ts_b  테이블  스페이스  Offline후  삭제함) 

SQL> @dd 

TS_B                    /app/oracle/oradata/testdb/ts_b01.dbf   <- offline  되어  있음. 


SQL> !rm -fr /app/oracle/oradata/testdb/ts_b01.dbf   <-  장애  발생함 

SQL> !ls /app/oracle/oradata/testdb/ts_b01.dbf 

ls: /app/oracle/oradata/testdb/ts_b01.dbf:  그런  파일이나  디렉토리가  없음 

SQL> exit 

[oracle@localhost ~]$ rman target sys/oracle 

RMAN> list failure; 



Step 2.  상세한  에러  내용  확인 

위  에러의  정확한  내용을  확인하겠습니다. 

RMAN> list failure 622 detail; 



Step 3.  해결  방법을  찾습니다. 

이  부분이  Data recovery Advisor  의  놀라운(?)  기능입니다. 

RMAN> advise failure; 


위  내용을  보면  Data  Recovery  Advisor  가  원인을  찾고  가장  마지막  부분에  보면  완전복구가  가능하고  데이터  손상이  없다고  조언하고  있습니다.  

다른  터미널을  하나  더  열어서  여기서  제시하는  가장  마지막  부분의  Repair script  를  살펴보겠습니다. 

[oracle@localhost ~]$ vi /app/oracle/diag/rdbms/testdb/testdb/hm/reco_909812309.hm 

   # restore and recover datafile 

   sql 'alter database datafile 6 offline'; 

   restore datafile 6; 

   recover datafile 6; 

   sql 'alter database datafile 6 online';

또는  아래  명령어를  수행하셔도  동일한  결과를  볼  수  있습니다. 


RMAN> repair failure preview; 


contents of repair script: 

   # restore and recover datafile 

   sql 'alter database datafile 6 offline'; 

   restore datafile 6; 

   recover datafile 6; 

   sql 'alter database datafile 6 online'; 


RMAN  에서  DB가  Open  상태일  때  Tablespace  를  Offline  시킨  후  Recover  하는  방법이  정확하

게  제시되고  있습니다.   제시하는  방법대로  복구해  보겠습니다. 


RMAN> repair failure; 

복구되었습니다.  복구  원리나  방법을  잘  몰라도  Data Recovery Advisor  가  시키는  대로  하니  복구를  할  수  있게  되었습니다. 




21. Database  사전  예방  점검  기능  ( 11g New Feature) 

데이터베이스가  장애가  발생하기  전에  (Bad  Block  등)  사전에  미리  점검  할  수  있다면 정말  좋을 것입니다. 

11g RMAN  부터는  사전  예방  점검  기능을  제공합니다. 


RMAN> validate database; 


위  결과를  보면  모든  파일을  전부  자세히  검사하는  것을  알수  있습니다. 

그리고  가장  마지막  부분처럼  spfile  하고  control file  까지  함께  검사하는  것을  알수  있습니다. 

특정  테이블  스페이스만  지정  할  수도  있습니다. 


RMAN> validate tablespace ts_b; 


특정  데이터  파일만  지정할  수도  있습니다. 

RMAN> validate datafile 6; 


데이터  파일의  블록만  지정해서  검사할  수도  있습니다. 

RMAN> validate datafile 6 block 1;





22. RMAN  과  Datapump  를  사용하여   데이터  이동하기 

OS  가  다를  경우와  Oracle  버전이  다를  경우  데이터를  이전  할  때  신경써야  할  부분이 아주  많고  힘든  작업이  됩니다.

다행히도  RMAN  에서  convert  라는  명령어를  지원해서  Cross-platform 끼리  데이터를  이전  할  수  있도록  지원을  하고  있습니다.  

지원  가능한  platform  목록은 아래와  같이  조회하면  알  수  있습니다. 


SYS>set pagesize 50 

SYS>col PLATFORM_ID for 99999999999999 

SYS>col PLATFORM_NAME for a40 

SYS>col ENDIAN_FORMAT for a10 

SYS>select * from v$transportable_platform 

  2   order by 1; 


사용  예  ) RHEL4 + 10g R2(32bit) -> RHEL5+11gR2(32bit)  로  데이터  이동하기 

- Source DB (RHEL4+10g R2(32bit))에서  작업합니다. 


Step 1.  현재  플랫폼을  확인  후  테스트용  데이터를  생성합니다. 

[oracle@localhost ~]$ sqlplus / as sysdba 


SYS>col platform_name for a20 

SYS>col endian_format for a20 

SYS>select d.platform_name,endian_format 

  2   from v$transportable_platform tp , v$database d 

  3   where tp.platform_name=d.platform_name ; 

PLATFORM_NAME    ENDIAN_FORMAT 

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

Linux IA (32-bit)      Little    <---  현재  플랫폼과  엔디안을  확인합니다. 


SYS>create tablespace conv_test 

  2   datafile '/home/oracle/oradata/testdb/conv_test01.dbf' size 10M; 

SYS>create table scott.ctest1(no number) tablespaceconv_test ; 

SYS>insert into scott.ctest1 values (1); 

SYS>insert into scott.ctest1 values (2); 

SYS>commit; 

SYS>select * from scott.ctest1; 



Step 2. DBMS_TTS  패키지를  이용해서  이동을  원하는  Tablespace  를  점검합니다. 

SYS>exec dbms_tts.transport_set_check('CONV_TEST',true); 

SYS>select * from transport_set_violations ; 

SYS>exit 



Step 3. datapump  용  작업을  합니다. 

[oracle@localhost ~]$ mkdir   /home/oracle/dp_conv 

[oracle@localhost ~]$ sqlplus   / as sysdba


SYS>create   directory   dp_conv   as   '/home/oracle/dp_conv'; 

SYS>grant   read,write   on directory   dp_conv   to   system; 



Step 4.  이관할  Tablespace  를  read only  로  변경  한  후  expdp  를 수행합니다. 

SYS>alter   tablespace   conv_test   read only; 

[oracle@localhost  ~]$  expdp  system/oracle  dumpfile=conv.dmp  directory=dp_conv 

[oracle@localhost  ~]$  expdp  system/oracle  dumpfile=conv_meta.dmp  directory=dp_conv  full=y 

include=user,role,role_grant,profile content=metadata_only



Step 5. RMAN  으로  이관할  dump  파일을  Convert  합니다. 

(  이  작업은  OS나  Oracle  버전이  다를  경우만  수행합니다) 

-이관할   Target DB Server  의  platform  은  Target DB  로그인해서 아래와  같이  조회하면  됩니다. 


[oracle@localhost ~]$ sqlplus sys/oracle as sysdba;

SYS>col platform_name for a20 

SYS>col endian_format for a20 

SYS>select d.platform_name,endian_format 

  2   from v$transportable_platform tp , v$database d 

  3   where tp.platform_name=d.platform_name ; 

PLATFORM_NAME     ENDIAN_FORMAT 

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

Linux IA (32-bit)     Little 


[oracle@localhost dp_conv]$ rman target / 

RMAN> convert tablespace 'CONV_TEST' to platform 'Linux IA (32-bit)'

2> format '/home/oracle/dp_conv/%U'; 



--  여기서부터는  Target DB  에서  작업합니다. 

Step 6.  변환  된  데이터를  가져  옵니다. 

[oracle@localhost ~]$ mkdir   /data/dp_conv 

[oracle@localhost ~]$ scp 192.168.47.133:/home/oracle/dp_conv/*   /data/dp_conv/ 

oracle@192.168.47.133's password: 

conv.dmp                                                         100%    72KB   72.0KB/s    00:00 

conv.log                                                           100% 1021      1.0KB/s    00:00 

conv_meta.dmp                                                    100%   208KB 208.0KB/s    00:00 

data_D-TESTDB_I-2580604172_TS-CONV_TEST_FNO-6_03noe2ad        100%    10MB   10.0MB/s    00:01 

export.log                                                         100% 1029      1.0KB/s    00:00  



Step 7. datapump  용  작업을  합니다. 

[oracle@localhost ~]$ sqlplus sys/oracle as sysdba 

SYS>create directory dp_conv   as '/data/dp_conv'; 

SYS>grant read,write on directory dp_conv to system; 

SYS>exit 



Step 8. Source  에서  변환된  파일을  한번  더  변환합니다. 

[oracle@localhost ~]$ rman   target   sys/oracle 

RMAN> convert datafile '/data/dp_conv/data_D-TESTDB_I-2580604172_TS-CONV_TEST_FNO-6_03noe2ad' 

2> format "/app/oracle/oradata/testdb/conv_test01.dbf" ; 


--  위  작업으로  Source DB에서  사용하던  파일을  Target DB  파일로  변환  및  재생성합니다. 



Step 9.  변환된  meta data  및  실제  data를  impdp  합니다 

[oracle@localhost ~]$ impdp system/oracle directory=dp_conv dumpfile=conv_meta.dmp full=y 

[oracle@localhost  ~]$  impdp  system/oracle  directory=dp_conv  dumpfile=conv.dmp 



Step 10.  데이터  확인  후  이전  완료된  Tablespace  를  read write  모드로  변경합니다. 

[oracle@localhost ~]$ sqlplus sys/oracle as sysdba 

SYS>@dd 

SYS>select * from scott.ctest1; 

SYS>insert into scott.ctest1 values (3); 

insert into scott.ctest1 values (3) 

                  * 

ERROR at line 1: 

ORA-00372: file 6 cannot be modified at this time 

ORA-01110: data file 6: '/app/oracle/oradata/testdb/conv_test01.dbf' 

SYS>alter tablespace conv_test read write ; 

SYS>insert into scott.ctest1 values (3); 

SYS>commit; 

SYS>select * from scott.ctest1; 

  

정상적으로  이전작업이  완료되었습니다. 

이  방법을  이용해서  다양한  플랫폼으로  이전이  가능합니다. 

그러나  간혹  

ORA-39322:  Cannot  use  transportable  tablespace  with  timestamp  with  timezone columns and different timezone version.  

이라는  에러가  나오면서  작업이  실패하는  경우도  있는데 이것은  TTS  기능의  버그입니다.  

이럴  경우는  TTS  기능을  사용할  수  없습니다. 

이번  실습에서  살펴본  방법과  순서로  다양한  플랫폼  이전이  가능하므로  꼭  테스트를  해  보시기 바랍니다.




23. 12C RMAN New Features  


(1) SYSBACKUP   권한  생성 

11g  까지는  RMAN  을  사용해서  Database  전체  백업과  복구작업을  수행할  경우에  SYSDBA  권한을  사용했으나  

12c  부터는  백업  및  복구  작업  전용  권한인  SYSBACKUP  권한이  생성되었습니다. 

아래와  같이  접속해서  어떤  권한을  가지고  있는지  확인  해  보겠습니다. 


[oracle@dbserver ~]$ sqlplus / as sysbackup ;

SQL> select privilege from dba_sys_privs where grantee='SYSBACKUP'; 


새로운  권한이  생성되긴  했으나  기존에  사용되던  SYSDBA  권한도  기본값으로  계속  사용할  수 있습니다. 


(2) RMAN  에서  SQL  문장을  실행할  수  있게  되었습니다. 

아주  반가운  기능  중  한가지로  기존  RMAN  에서는  SQL  문장을  치려면  번거로운  과정을  거쳐야 했습니다.

그러나  12c RMAN  부터는  SQL  문장을  편하게  사용할  수  있게  개선되었습니다. 

아래의  테스트로  확인  해  보겠습니다. 


* Test 1) 11g RMAN  에서  SQL  문장  실행하기 

[oracle@localhost ~]$ rman target sys/oracle 

RMAN> select sysdate from dual;


*Test 2) 12c RMAN  에서  SQL  문장  실행하기 

[oracle@dbserver ~]$ rman target / 

RMAN> select sysdate from dual ; 

using target database control file instead of recovery catalog 

SYSDATE 

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

21-JUL-13 


RMAN> select tablespace_name,bytes/1024/1024 MB, file_name   from dba_data_files ; 


잘  수행되는  것이  확인됩니다.  그러나  모든  SQL  을  다  실행할  수  있는  것은  아닙니다. 

일부  관리용  SQL  문장들만  수행  되므로  확인하고  사용하세요.


(3) Multisection Backup  기능이  향상되었습니다. 

시간이  지날수록  데이터가  대용량화  되어  가면서  하나의  데이터파일이  아주  커지는  경우가  생겨나고  있습니다.

그래서  11g  RMAN  부터  한  개의  큰  데이터파일을  작은  조각(Section)으로  나누어 

병렬로  동시에  여러  프로세스들이  백업을  진행하는  Multisection Backup  기능이  추가  되었습니다. 

RMAN  Backup  수행시  Section  size  라는  값을  지정하게  되면  각  크기별로  여러개의  채널이  생성되어  

각  채널별로  각각의  독립된  백업셋을  생성해서  백업을  동시에  진행을  하게  됩니다. 

11g  에서는  Backupset  으로  백업을  수행  할  경우만  이  기능이  가능했지만  

12c  부터는  Backup set  은  기본적으로  가능하고  추가로  image  copy  방식이나  Incremental  Backup  에서도  이  기능을 지원하도록  개선되었습니다. 


[oracle@dbserver ~]$ rman target / 

RMAN> backup as compressed backupset 

2        incremental   level   1 

3        section size 100M 

4        format   '/home/oracle/backup/rman/%U_%T' 

5        database ; 

(  지면  관계상  백업  수행  과정은  생략합니다  ) 


(4) Cross-Platform Backup and Restore  기능이  향상되었습니다.

OS  가  서로  다른  Oracle  환경에서의  마이그레이션  과정은  아주  복잡하고  힘든  작업입니다. 

그런데  12c  RMAN  을  사용하면  복잡했던  과정들을  보다  수월하게  데이터  이전  작업이나  이기종간의  백업  및  복구를  진행할  수  있게  되었습니다. 

11g   RMAN  까지는  이기종으로  데이터파일을  전송할  경우  (  앞에서  살펴본  TTS  기능을 쓰지  않고  RMAN  기능만을  사용할  경우  ) 

image Copy  만  사용 할 수  있었습니다. 

그러나  12c  부터는  Backup  set  을  사용할  수  있게  되었습니다.  

이는  용량이  훨씬  적게  줄어  들 수  있다는  뜻입니다.  

자연스럽게  네트워크  부하나  작업속도가  많이  빨라진다는  의미입니다. 

특히  이전하기를  원하는  원본  데이터를  RMAN  으로  백업을  수행할  때  압축  옵션이나 

Multisection  옵션을  함께  사용할  경우  훨씬  이전  작업이  빨라질  수  있습니다. 

또한  Tablespace  를  이전  할  때  11g  까지는  반드시  해당  Tablespace를  Read Only  모드로  변경  한 후  이전을  해야  했지만  

12c  부터는  Read Write  모드도  지원하도록  개선되었습니다. 

이런  기능을  지원하기  위해  아래와  같은  옵션이  추가로  제공됩니다.


*  FOR  TRANSPORT: 이  옵션으로  Backup을  수행할  경우  RMAN 은  데이터  전송을  목적으로 backupset  을  생성하게  됩니다.

만약  현재  원본(AS-IS)의  endian  과  목표  (TO_BE)의  endian  이  다를  경우  대상  서버의  endian  으로  변환됩니다. 


*  DATAPUMP:  이  옵션은  RMAN  백업을  수행할  때  datapump  용  dump  file  로  생성됩니다.  

각의  Backup set  이  dump file  로  만들어집니다. 



(5) Recover table  명령어로  drop table  복구하기- 12c RMAN New Feature 

운영중인  DB  에서  drop table  장애가  발생할  경우  일반적인  복구  과정은  아래와  같습니다. 

(아래는  Clone DB  로  무  정지  응급복구의  경우의  예  입니다) 

1.  임시경로로  필요한  파일  복원 

2.  파일  경로  변경  후  삭제된  테이블  복구 

3.  임시경로에서  복구  된  테이블을  추출  (Exp  또는  Expdp  사용) 

4.  추출된  데이터를  운영  서버로  입력  (Imp  또는  Impdp  사용) 

5.  복구에  사용된  DB  종료후  관련  파일  삭제 

그러나  12c  부터  RMAN  의  recover  table  이란  명령을  수행하면  위  작업들을  RMAN  이  자동으로 다  처리를  해서  데이터를  복구해  주게  됩니다.  

즉  운영  DB  에는아래의  실습으로  확인해  보겠습니다. 


Step 1.  테스트용  데이터  생성하기 

SYS>archive log list; 

SYS>set line 200 

SYS>col tablespace_name for a10 

SYS>col file_name for a45 

SYS>select tablespace_name,bytes/1024/1024 MB, file_name 

  2   from dba_data_files ;

SYS>create table scott.test200 (no number) tablespace users; 

SYS>insert into scott.test200 values (1); 

SYS>commit; 

SYS>select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS')from dual; 

복구에  사용될  시간입니다 



Step 2.  다른  터미널에서  RMAN  에  접속해서  전체  백업을  수행합니다. 

[oracle@dbserver ~]$ rman target / 

RMAN> backup as compressed backupset database 

2> format '/data/backup/rman/%U_%T'; 



Step 3. Drop Table  장애  발생 

SYS>select * from scott.test200 ; 

SYS>drop table scott.test100 purge; 

SYS>select * from scott.test100 ; 

에러발생



Step 4. recover table  명령으로  복구합니다. 

(  운영  DB  가  Open  인  상태에서  실행합니다) 

RMAN>  recover  table  scott.test200  until  time  "to_date('2013-07-21:11:31:48','yyyy-mmdd:hh24:mi:ss')"   auxiliary   destination   '/data/temp'; 

위  명령에서  auxiliary   destination  부분이  복구에  사용될  임시  경로를  지정하는  부분입니다. 

당연히  저  디렉토리에는  oracle  계정이  read/write  권한이  있어야  합니다. 

(  지면  관계상  중간  복구  과정은  너무  길어서  필요한  부분만  살펴보겠습니다  ) 


# Clone database  에서  데이터를  복구  후  OPEN  하는  과정입니다 

# set requested point in time 

set until   time "to_date('2013-07-21:11:31:48','yyyy-mm-dd:hh24:mi:ss')"; 

# online the datafiles restored or switched 

sql clone "alter database datafile   6 online"; 

# recover and open resetlogs 

recover clone database tablespace   "USERS", "SYSTEM", "UNDOTBS1", "SYSAUX" delete archivelog; 

alter clone database open resetlogs; 

sql statement: alter database datafile   6 online 

(  중간  내용은  생략합니다  ) 


#  복구한  테이블을  expdp  로  unloading  하는  과정입니다. 

EXPDP> . . exported "SCOTT"."TEST200"                            5.031 KB        1 rows 

EXPDP> Master table "SYS"."TSPITR_EXP_cqnz_zEzn" successfully loaded/unloaded 

EXPDP> ****************************************************************************** 

(  중간  내용은  생략합니다  ) 


# clonedb  를  종료  후  expdp  한  테이블을  impdp  하는  과정입니다. 

# shutdown clone before import 

shutdown clone abort 

executing Memory Script 

Oracle instance shut down 

Performing import of tables... 

   IMPDP> Master table "SYS"."TSPITR_IMP_cqnz_tpet"successfully loaded/unloaded 

   IMPDP> Starting "SYS"."TSPITR_IMP_cqnz_tpet": 

   IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE 

   IMPDP> Processing object type TABLE_EXPORT/TABLE/TABLE_DATA 

IMPDP> . . imported "SCOTT"."TEST200"                        5.031 KB        1 rows 

   IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS 

   IMPDP> Processing object type TABLE_EXPORT/TABLE/STATISTICS/MARKER 

   IMPDP> Job "SYS"."TSPITR_IMP_cqnz_tpet" successf ully completed at Sun Jul 21 11:39:47 2013 

elapsed 0 00:00:04 

Import completed 


#  복구에  사용되었던  파일들을  자동으로  지우는  과정입니다. 

Removing automatic instance 

Automatic instance removed 

auxiliary instance file /data/temp/DB12C/datafile/o1_mf_temp_8yplcctz_.tmp deleted 

auxiliary instance file /data/temp/CQNZ_PITR_DB12C/onlinelog/o1_mf_3_8ypldtp9_.log deleted 

auxiliary instance file /data/temp/CQNZ_PITR_DB12C/onlinelog/o1_mf_2_8ypldkg6_.log deleted 

(  지면  관계상  중간  출력  과정은  생략합니다)



Step 5.  복구가  완료되었는지  확인합니다 

RMAN> select * from scott.test200; 

        NO 

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

         1 

이상으로  RMAN  의  주요  기능을  살펴보았습니다.  아주  좋은  기능들이  많으므로  꼭  익혀두길  바랍니다 

반응형