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
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 에서도 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';
RMAN> sql 'alter database backup controlfile to trace';
RMAN> list backup
지금까지 백업한 리스트를 보여줌
지금까지 백업한 파일 삭제
RMAN> crosscheck backupset;
데이터베이스 백업 세트의 유효성 검사, 저장 장치에 삭제된 백업 세트나 손상된 백업세트, 유효기간 넘긴 파일 식별
RMAN> delete 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> 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;
}
복구 완료
장애발생시키기
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;
}
장애 발생시키기
테이블 및 시간 확인
테이블 날리기
복구 - 확인한 시간으로 전체 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;
}
복구 완료
RMAN> list failure;
로 오류 확인해보기
지금은 없음!
장애 발생
장애 확인하기
failure advise 자세히 보기
마지막 부분에 recover 를 위한 스크립트 위치를 볼 수 잇음
위 스크립트 참고하여 복구해보기
+) sql 로 오류 내용 보기
복구
위에서 장애 발생 시 테이블 단위로 offline immediate 를 걸었음
사전 점검
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;
}
복구 완료~