RMAN 백업 실습

AeZan·2023년 11월 22일
0

catalogDB 인스턴스 없이 RMAN 실습

su - oracle

rman target / nocatalog

+) 부하가 좀 걸릴 수 있음

show all;

rman 의 configuration 등록 정보 확인 가능
모두 설정해야 백업되는건 아님

환경설정
autobackup on; 변경 사항 발생 시 자동 백업
autobackup format for device type disk to '/backup/rman/cont/cf_%F';
-> autobackup 위치

channel device type disk format '/backup/rman/database/%U';
//데이터 파일 위치


archive 포맷 확인
show parameter logarchive_format 으로 확인가능
%t
%s_%r.dbf

backup archivelog all format '/backup/rman/arch/%t%s%r.dbs';

list backup; // 백업 받은 파일 확인

report schema; // 우리가 받아야할 대상 정보 확인

RMAN 11g 이상에서는 깨진 BLOCK 을 인지할 수 있음
DB 가 정상적인지 VALIDATION 하는 기능 있음

validate database; //백업 받기 전 확인

문제 생기면 Marked Corrupt 에 count 올라감

오류가 난 block 은 스킵하고 백업함

alert log 에서 위치 확인 가능
어떤 유저의 테이블의 row 데이터인지 정보 확인


catalogDB 인스턴스 생성 후 환경변수 설정
ORA19C 인스턴스 startup 먼저 시키고, catalogDB 에서 startup

인스턴스 확인

테이블 스페이스와 유저 생성

mkdir /archive_catalog
chown -R oralce:dba /archive_catalog
위 명령어로 archive log(아카이빙 백업파일) 저장될 위치 생성

archive log 위치 파라미터 설정

DB 재기동
shutdown immediate
startup mount

archiving 모드 시작 확인
alter database archivelog;
alter database open;
archive log list

ORA19C에서 실행
test_user 유저 생성 및 테이블스페이스 생성

test_user로 세션 접속해서 모든 데이터를 담은 테이블 생성
SQL> connect test_user/test_user
create table test_user.t1 as select * from all_objects;

CATALOGDB에서 실행

프로파일을 catalogdb 가 아닌 ora19c 로 변경해서 들어갈 것
rman 유저로 catalogdb sid로 rman 실행

rman target / catalog rman/rman@CATALOGDB

incarnation 목록 확인, 아직 미생성 상태!

catalog 생성 및 현재 데이터베이스 등록

targetDB 잘못 넣었을 경우 삭제하는 방법
/ target database가 잘못 등록된경우 CATALOG DB의 rman유저로 접속후 package를 사용하여 삭제 /
. .catalogdb
sqlplus rman/rman
(다른세션)RMAN> list incarnation of database;
SQL> execute dbms_rcvcat.unregisterdatabase(1,1324265196);
SQL> select * from db ;
(다른세션)RMAN> list incarnation of database

###RMAN CONFIGURE COMMAND 설정

RMAN> show all;

RMAN> report schema
백업대상 데이터 파일 조회

컨트롤 파일 백업 설정

마지막 구문은 ARCHIVELOG 파일 자동 삭제 여부 결정하는 것 -> 아카이브 로그를 백업한 후 최근 2회분만 남겨놓고 삭제

ARCHIVELOG 파일 자동 삭제 여부 초기화(설정 그냥 해본거)

RMAN Database CONFIGURE
백업 채널 생성, 백업 보존기간, 최소 백업세트 개수 설정

백업 세트를 몇개 유지할건지 설정(그냥 해보는거)
-백업세트 2개 유지

백업 작업시 2개의 복사본 생성(그냥 해보기)

백업 최적화 활성화, 증분 백업 최적화

DB 정보도 확인!

손상된 데이터 블록 검증

현업에선 했다간 성능 부하걸려서 난리남
데이터 용량이 많기 때문

+) 손상된 아카이브 로그 검증

전체 풀 백업

수동 백업 : configuration setting 안하고 백업 받는 경우

RMAN> run { 
     allocate channel c1 type disk;
     backup
     full
     tag full_db_1
     format '/backup/rman/database/%U'
     database ;
     release channel c1;
 }

처음에 백업하다가 인터럽트 시켜서.. 내가.. ㅜ 용량이 20G로는 백업하기엔 작아짐... 흑흑
그냥 rm 하면 rman 이 인식 못할거 같은 느낌이 들어서 ... 근데 rman에서 백업파일 어떻게 삭제하는지 몰라서 그냥 파티션 용량 확장 하기로 함..ㅋㅋ;

이상하게 파티션 인식이 안되서 lvm 으로 못바꿈 그래서 그냥 백업셋을 rman으로 지움

진작 이렇게 할걸...

수동 백업 완료... 흑흑

이번엔 다른 방식으로 백업하기!

아카이브 유효성 검사
-> 아카이브로그 존재 여부, 상태 확인해서 디비랑 일치하는지 확인

데이터파일과 아카이브 로그 백업

아카이브 수동으로 백업
RMAN> backup archivelog all format '/backup/rman/arch/%t%s%r.dbf';

RMAN> backup current controlfile;
configuration 설정 확인

백업 동안 Input buffer 내용 조회 (ORA19C 에서 조회)

백업 동안 진행상황 조회 (백업파일 많은 경우 조회됨 내가 할때는 데이터가 적어서 실행했을 때 이미 끝나서 보기 어려움)

select sid , serial# , context , sofar , totalwork , 
round(sofar/totalwork*100,2) "%_Completed"
from v$session_longops
where opname like 'RMAN%'
and opname not like '%aggregate%'
and totalwork != 0
and sofar <> totalwork ; 
       SID    SERIAL#    CONTEXT      SOFAR  TOTALWORK %_Completed
---------- ---------- ---------- ---------- ---------- -----------
        44        497          1      66172     203520       32.51

전체 DB Restore

test 를 위해 test_user의 test_ts 에 테이블 생성해줌

SQL> create tablespace test_tb1 tablespace test_ts as select * from all_objects;

SQL> create table test_tb2 tablespace test_ts as select * from all_objects;

장애 발생

SQL> shutdown immediate (sysdba 로 해줌 권한 때문에)

데이터파일 삭제

rm -rf system01.dbf
rm -rf test_ts.dbf

DB 안올라옴

현재 백업본에는 test_tb1, test_tb2가 없는 상태
restore 후 recover 하기
+) restore 는 load, recover 가 load 한 데이터로 복원

원래 세그멘테이션 오류가 떴었는데 RMAN 세션을 EXIT 한 이후에 다시 접속하니 됐음 왜지...

RMAN 은 복구 정보를 컨트롤 파일에서 읽어오기 때문에 db 가 내려간 상태에서는 해당 파일을 읽을 수 없어서 rman 세션이 킬이 되서 그런것 !!
오라클 기동상태를 보고 RMAN 세션을 다시 맺어주는게 중요~

RECOVER 까지 완료

db 기동해보기

복구 완료!

백업본엔 없던 테이블도 생긴 것을 확인. 원리는 나중에 이론 공부를 더 해야할듯

RMAN Cold Backup

RMAN 에서도 SHUTDOWN/STARTUP 이 됨

RMAN> shutdown immediate

RMAN> startup mount;

+) RMAN> show all 로 configuration 확인

RMAN> backup full database; 마운트 단계에서 풀백업
RMAN> backup controlfile;
RMAN> backup spfile;

현재 db가 pfile 로 기동되고 있어서 백업이 안되서 확인해보니

spfile이 없었다. mv spfileORA19C.ora.back spfileORA19C.ora 로 생성 후 해결

db 가 spfile/pfile 로 기동되는지 확인하는법
show parameter spfile
value 값 비어있으면 pfile 읽고 기동
value 값에 경로 있으면 spfile 읽고 기동

RMAN> backup archivelog all format '/backup/rman/arch/%t_%s_%r.dbf';

  • controlfile to trace 파일 생성
    RMAN> sql 'alter database backup controlfile to trace';
  • pfile 생성
    `RMAN> sql 'create pfile from spfile';

RMAN> list backup
지금까지 백업한 리스트를 보여줌


지금까지 백업한 파일 삭제
RMAN> crosscheck backupset;
데이터베이스 백업 세트의 유효성 검사, 저장 장치에 삭제된 백업 세트나 손상된 백업세트, 유효기간 넘긴 파일 식별

RMAN> delete backupset;

crosscheck backupset 테스트

SQL> alter database open; 데이터 베이스 open 으로 전환 (cold backup 하느라 mounted 상태임)

rman 세션도 재접속 ! rman target / catalog rman/rman@catalogdb

database+archivelog, controlfile, spfile 백업 후 백업셋 조회
RMAN> crosscheck backupset;

os 에서 /backup/rman/database 하위에 있는 데이터+아카이브로그 파일 중 하나 제거

다시 백업셋 조회 해보기
RMAN> crosscheck backupset;

삭제된 파일이 EXPIRED 된 것을 확인할 수 있음
EXPIRED 된 파일 삭제
RMAN> delete expired backupset;

다시 백업셋 조회해보기

RMAN> crosscheck backupset;


RMAN을 이용한 상황별 Recovery

  • datafile 복구

백업 먼저 하기!
RMAN> backup database plus archivelog;

장애 발생시키기 - 파일 유실
/oracle/oradata/ORA19C
rm -rf test_ts.dbf

복구

RMAN> run {                                              
 allocate channel c1 type disk;
 sql "ALTER DATABASE DATAFILE 6 OFFLINE";
 restore datafile 6;
 recover datafile 6;
 sql "ALTER DATABASE DATAFILE 6 online";
 release channel c1;
 }


복구 완료

  • Tablespace 복구

장애발생시키기
sqlplus / as sysdba

tablespace offline 시킴
alter tablespace test_ts offline immediate;
immediate 옵션을 주면 현재 진행 중인 작업을 완료하지 않고 바로 파일을 오프라인으로 설정 (dirty block 의 데이터 파일 동기화를 수행하지 않고 테이블 스페이스를 비정상적으로 offline)

데이터 유실
rm -rf test_ts.dbf

복구

RMAN> run {
 allocate channel c1 type disk;
 sql "alter tablespace test_ts offline immediate";
 restore tablespace test_ts;
 recover tablespace test_ts;
 sql "alter tablespace test_ts online";
 release channel c1;
}

  • Drop 테이블 후 복구하기 - 같은경로에 보구!

장애 발생시키기

테이블 및 시간 확인

테이블 날리기

복구 - 확인한 시간으로 전체 DB 복구

RMAN> run {
startup mount ; 
sql 'alter session set nls_date_format="YYYY-MM-DD:HH24:MI:SS"';
set until time='2023-10-25:15:57:34';
restore database ;
recover database ; 
alter database open resetlogs; 
}

복구 완료

  • Recovery advisor - 장애 오류 발생시 원인 분석

RMAN> list failure; 로 오류 확인해보기
지금은 없음!

장애 발생

장애 확인하기

failure advise 자세히 보기


마지막 부분에 recover 를 위한 스크립트 위치를 볼 수 잇음
위 스크립트 참고하여 복구해보기

+) sql 로 오류 내용 보기

복구

위에서 장애 발생 시 테이블 단위로 offline immediate 를 걸었음

  • block corruption

사전 점검
RMAN> validate database;
RMAN> validate tablespace users
RMAN> validate datafile 5;
RMAN> validate datafile 5 block 1;

block corruption 복구

RMAN> BACKUP AS COPY DATAFILE 5 tag corrup_file FORMAT '/backup/corrup_test_%f' ;

위 파일 변환 (손상)시키기

RMAN> sql "alter database datafile 5 offline";

RMAN> RUN
{ 
SET MAXCORRUPT FOR DATAFILE 5 TO 2;
RESTORE DATAFILE 5 FROM TAG 'corrup_file' ;
RECOVER DATAFILE 5;
}

RMAN> sql "alter database datafile 5 online";


블록 확인
RMAN> run
 {
  allocate channel d1 type disk;
  backup check logical validate tablespace test_ts;
  release channel d1;
 }

복구 완료~

0개의 댓글

관련 채용 정보