다른 명령
RMAM 백업/복구 시나리오
RMAN 백업 설정
DB 아카이브 모드 변경
- rman은 아카이브 로그 모드에서 동작
SQL> STARTUP MOUNT SQL> ALTER DATABASE ARCHIVELOG; SQL> ARCHVIE LOG LIST SQL> ALTER DATABASE OPEN;
RMAN 설정/백업
RMAN 접속
$rman target / -- nocatalog
device 에 대한 채널 설정
- configure 명령어로 파라미터를 수정
RMAN> configure channel device type disk format '/oracle/app/oracle/backup/orcl_%U';
controlfile Auto backup channel 설정
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/oracle/app/oracle/backup/control/%F';
백업 최적화 옵션
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
controlfile Auto Backup 설정
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
백업보관주기 설정
RMAN> configure retention policy to recovery window of 5 days;
백업 설정 확인
RMAN> show all
rman FULL 백업
RMAN> backup as compressed backupset database spfile plus archivelog delete input;
RMAN 장애복구 시나리오
- RMAN은 archive mode 에서만 백업 가능
장애 상황
system01.dbf datafile 삭제
$rm -rf /oracle/app/oracle/oradata/system01.dbf
DB 재기동
SQL> SHUTDOWN ABORT SQL> STARTUP ...... 에러 발생 ......(data file 오류 내용 확인) SQL> startup ORACLE instance started. Total System Global Area 2533359616 bytes Fixed Size 8922088 bytes Variable Size 687868952 bytes Database Buffers 1828716544 bytes Redo Buffers 7852032 bytes Database mounted. ORA-01157: cannot identify/lock data file 1 - see DBWR trace file ORA-01110: data file 1: 'D:\APP\CYKIM\ORADATA\ORCL\SYSTEM01.DBF'
RMAN 복구
RMAN에서 datafile 번호 확인
RMAN> list backup;
restore 작업 진행
- 백업된 파일로 복원
- restore 후 recover 로 복구
RMAN> restore datafile 1; -- /tablespace/database/ Starting restore at 08-JAN-20 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=11 device type=DISK channel ORA_DISK_1: starting datafile backup set restore channel ORA_DISK_1: specifying datafile(s) to restore from backup set channel ORA_DISK_1: restoring datafile 00001 to D:\APP\CYKIM\ORADATA\ORCL\SYSTEM01.DBF channel ORA_DISK_1: reading from backup piece D:\APP\BACKUP\ORCL_0EULFSPM_1_1 channel ORA_DISK_1: piece handle=D:\APP\BACKUP\ORCL_0EULFSPM_1_1 tag=TAG20200108T174110 channel ORA_DISK_1: restored backup piece 1 channel ORA_DISK_1: restore complete, elapsed time: 00:00:55 Finished restore at 08-JAN-20
recover 작업 진행
- 복원된 파일에서 문제 복원 작업
RMAN>recover datafile 1; -- /tablespace/database/
DB 오픈
RMAN> sql 'alter database open'; RMAN> exit;
DB 오픈 확인
$sqlplus / as sysdba SQL> SELECT INSTANCE_NAME, STATUS FROM V$INSTANCE;
케이스별 장애 복구 방법(완전복구)
(DB 종료없이) 삭제된 파일 복구 방법
- ( offline 되는 데이터 파일 삭제된 경우 ) - DB 종료없이 복구
- 1. 전체 full 백업
- 2. 파일 삭제
- 3. 복구
RMAN> sql 'alter tablespace test offline immediate' ; <-- 해당 데이터파일이 속한 테이블 스페이스 offline RMAN> restore tablespace test ; <-- 백업파일에서 복원 해옴 RMAN> recover tablespace test ; <-- 복구 RMAN> sql 'alter tablespace test online' ; <-- 복구완료후 다시 online
(DB 종료 후) 삭제된 파일 복구 방법
- ( offline 안되는 데이터 파일 삭제된 경우 ) - DB 종료 후 복구
- 1. 전체 full 백업
- 2. 파일 삭제
- 3. 복구
RMAN> shutdown abort ; RMAN> restore tablespace system ; RMAN> recover tablespace database ; <-- 비정상 종료했기때문에 전체 데이터베이스 복구 RMAN> alter database open ;
임시 경로에서 복구하기
- 기존 경로가 아닌 다른 위치로 복구
1. 전체 full 백업 2. 파일 삭제 3. 임시경로로 복원후 복구
RMAN> run { sql 'alter tablespace test offline immediate' ; set newname for datafile '/app/oracle/oradata/testdb/test01.dbf' to '/data/temp/test01.dbf' ; restore tablespace test ; switch datafile 6 ; <-- 이 파일번호는 report schema 에서 확인 할 수 있음 ( 컨트롤파일의 내용변경 ) recover tablespace test ; sql 'alter tablespace test online' ; }
3,4 번 줄에서 복원하기전 미리 경로를 지정한 후 5번 줄에서 백업파일을 새로운 경로로 복원, 6번 줄에서 control file 에 있는 경로를 새로운 경로로 변경.
임시 경로에 필요한 데이터 파일만 복원 후 복구하기
1. 전체 full 백업 2. 파일 삭제 3. 임시경로로 복원 후 복구 ( 데이터파일=백업파일, 컨트롤,리두는 현재사용중인 파일 복사)
파라미터 파일의 컨트롤파일 경로 변경
RMAN> run{ startup mount; sql "alter database rename file ''/data/temp7/redo01_a.log'' <-- 리두 경로 부터 변경 to ''/data/temp/redo01_a.log''"; sql "alter database rename file ''/data/temp7/redo01_b.log'' to ''/data/temp/redo01_b.log''"; sql "alter database rename file ''/data/temp7/redo02_a.log'' to ''/data/temp/redo02_a.log''"; sql "alter database rename file ''/data/temp7/redo02_b.log'' to ''/data/temp/redo02_b.log''"; sql "alter database rename file ''/data/temp7/redo03_a.log'' to ''/data/temp/redo03_a.log''"; sql "alter database rename file ''/data/temp7/redo03_b.log'' to ''/data/temp/redo03_b.log''"; set newname for datafile 1 to '/data/temp/system01.dbf'; <-- 데이터파일중 필요한 파일만 임시 경로로 변경 set newname for datafile 2 to '/data/temp/sysaux01.dbf'; set newname for datafile 3 to '/data/temp/undotbs01.dbf'; sql "alter database datafile ''/data/temp7/users01.dbf'' offline drop" ; <-- 필요없는 파일은 offline drop sql "alter database datafile ''/data/temp7/example01.dbf'' offline drop" ; sql "alter database create datafile ''/data/temp7/test01.dbf'' <-- 백업이 없는 삭제된 파일을 신규로 생성 as ''/data/temp/test01.dbf''"; restore tablespace system; <-- 필요한 테이블 스페이스만 복원 restore tablespace sysaux; restore tablespace undotbs1; switch datafile all; <-- 파일 위치 변경내용을 control file 에 반영 recover tablespace system; <-- 필요한 테이블스페이스만 복구 recover tablespace sysaux; recover tablespace undotbs1; recover tablespace test; alter database open; sql "alter database test online"; }
여기 까지 완전 복구 방법
케이스별 장애 복구 방법(불완전복구)
삭제 테이블 (Drop table) 후 복구하기
- 임시경로 사용
- 전체 full 백업
- > drop table 장애 발생
- > DB 종료 후 임시경로에서 복구
- > 파라미터 파일의 컨트롤 파일 경로 변경
RMAN> run { startup mount; sql "alter database rename file ''/data/temp7/redo01_a.log'' to ''/data/temp/redo01_a.log''"; sql "alter database rename file ''/data/temp7/redo01_b.log'' to ''/data/temp/redo01_b.log''"; sql "alter database rename file ''/data/temp7/redo02_a.log'' to ''/data/temp/redo02_a.log''"; sql "alter database rename file ''/data/temp7/redo02_b.log'' to ''/data/temp/redo02_b.log''"; sql "alter database rename file ''/data/temp7/redo03_a.log'' to ''/data/temp/redo03_a.log''"; sql "alter database rename file ''/data/temp7/redo03_b.log'' to ''/data/temp/redo03_b.log''"; set newname for datafile 1 to '/data/temp/system01.dbf'; set newname for datafile 2 to '/data/temp/sysaux01.dbf'; set newname for datafile 3 to '/data/temp/undotbs01.dbf'; set newname for datafile 4 to '/data/temp/users01.dbf'; set newname for datafile 5 to '/data/temp/example01.dbf'; restore database; switch datafile all; sql 'alter session set nls_date_format="yyyy-mm-dd:hh24:mi:ss"'; set until time='2014-11-12:07:41:41'; recover database; alter database open resetlogs; }
삭제 테이블스페이스 (Drop tablespace) 복구하기
백업 파일이 있을 경우
- 테스트용 Tablespace 생성
- > 전체 Full backup
- > 예제 데이터 입력후 Tablespace drop 장애 발생
- > 임시 경로로 복구에 필요한 파일 복원 후 복구
- Full 백업중 알아둘것!
- piece handle = /data/backup/rman/03pndnfs_1_1_full_20141112 tag=TAG20141112T115300 <- 복구에 사용될 백업셋이름
- piece handle = /data/backup/rman/04pndnir_1_1_full_20141112 tag=TAG20141112T115300 <- 복구에 사용될 controlfile이름
- 임시경로로 복구에 필요한 파일 복원 후 복구 ( 파라미터 파일의 controlfile 위치 바꾸고, 현재 사용중인 로그파일만 이동 )
RMAN> run { startup nomount; restore controlfile from '/data/backup/rman/07pne4hj_1_1_20141112'; alter database mount; sql "alter database rename file ''/data/temp3/redo01_a.log'' to ''/data/temp4/redo01_a.log''"; sql "alter database rename file ''/data/temp3/redo01_b.log'' to ''/data/temp4/redo01_b.log''"; sql "alter database rename file ''/data/temp3/redo02_a.log'' to ''/data/temp4/redo02_a.log''"; sql "alter database rename file ''/data/temp3/redo02_b.log'' to ''/data/temp4/redo02_b.log''"; sql "alter database rename file ''/data/temp3/redo03_a.log'' to ''/data/temp4/redo03_a.log''"; sql "alter database rename file ''/data/temp3/redo03_b.log'' to ''/data/temp4/redo03_b.log''"; set newname for datafile 1 to '/data/temp4/system01.dbf'; set newname for datafile 2 to '/data/temp4/sysaux01.dbf'; set newname for datafile 3 to '/data/temp4/undotbs01.dbf'; set newname for datafile 4 to '/data/temp4/users01.dbf'; set newname for datafile 5 to '/data/temp4/example01.dbf'; set newname for datafile 7 to '/data/temp4/rtest04.dbf'; sql 'alter session set nls_date_format="yyyy-mm-dd:hh24:mi:ss"'; set until time='2014-11-12:12:52:34'; restore database from tag 'TAG20141112T124903'; switch datafile all; recover database ; alter database open resetlogs; }
백업 파일이 없을 경우
- DB 전체 Full backup
- > 신규 Tablespace 생성 후 데이터 생성
- > Drop Tablespace 삭제/ 백업파일 없음
- > Tablespace 복구
- Full 백업중 알아둘것 !
- piece handle = /data/backup/rman/03pndnfs_1_1_full_20141112 tag=TAG20141112T115300 <- 복구에 사용될 백업셋이름
- piece handle = /data/backup/rman/04pndnir_1_1_full_20141112 tag=TAG20141112T115300 <- 복구에 사용될 controlfile이름
- 신규 테이블스페이스 생성 후 테스트용 테이블 생성하고 시간확인
- Drop tablespace 수행해서 장애 발생
- DB 종료 후 임시경로로 필요한 파일 이동 후 복구 ( 현재 사용중인 로그파일만 복사 )
- 파라미터 파일의 컨트롤 파일 경로 변경
- RMAN 에 접속하여 Control File 복원한 후 MOUNT 상태로 변경하여 파일위치 변경 하고 복원
RMAN> run { startup nomount; restore controlfile from '/data/backup/rman/04pndnir_1_1_full_20141112'; <-- 컨트롤파일 복원 alter database mount; sql "alter database rename file ''/data/temp/redo01_a.log'' to ''/data/temp3/redo01_a.log''"; sql "alter database rename file ''/data/temp/redo01_b.log'' to ''/data/temp3/redo01_b.log''"; sql "alter database rename file ''/data/temp/redo02_a.log'' to ''/data/temp3/redo02_a.log''"; sql "alter database rename file ''/data/temp/redo02_b.log'' to ''/data/temp3/redo02_b.log''"; sql "alter database rename file ''/data/temp/redo03_a.log'' to ''/data/temp3/redo03_a.log''"; sql "alter database rename file ''/data/temp/redo03_b.log'' to ''/data/temp3/redo03_b.log''"; set newname for datafile 1 to '/data/temp3/system01.dbf'; set newname for datafile 2 to '/data/temp3/sysaux01.dbf'; set newname for datafile 3 to '/data/temp3/undotbs01.dbf'; set newname for datafile 4 to '/data/temp3/users01.dbf'; set newname for datafile 5 to '/data/temp3/example01.dbf'; sql 'alter session set nls_date_format="yyyy-mm-dd:hh24:mi:ss"'; set until time='2014-11-12:09:12:19'; restore database from tag 'TAG20141112T090811'; switch datafile all; }
복원 완료 -> 복구 시작
RMAN> run { sql 'alter session set nls_date_format="yyyy-mm-dd:hh24:mi:ss"'; set until time='2014-11-12:09:12:19'; recover database; }
관리자가 직접 복구할때는 삭제된 데이터파일을 수동으로 생성해 준 후 복구 시도 했지만 RMAN 으로 복구 할때는 자동으로 생성해서 복구 됨