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 의 주요 기능을 살펴보았습니다. 아주 좋은 기능들이 많으므로 꼭 익혀두길 바랍니다