alter system reset log_archive_dest_2 scope=spfile;
log_archive_dest 파라미터는 static 파라미터이다.
archive mode에서는 DB가 운영중인 상태에서도 RMAN으로 backup database를 할 수 있다.

online backup 받은걸 확인하면 datafile 과 control file의 scn번호가 다른걸 확인할 수있는데, user managed 방식에서는 scn 차이때문에 복구가 안됬지만 RMAN에서는 SCN이 달라도 복구가 가능하다.

테이블 생성
수동으로 log switch 발생해서 아카이크 로그 파일 생성
데이터파일 삭제로 장애유발

rman 에서 controlfile의 정보를 확인해보면 user 데이터파일은 없기 때문에 사이즈가 0으로 조회된다.
report schema

어떤 문제로 장애가 발생되었는지 RMAN에서 확인하는 방법
1) list failure; : 장애 원인을 알려준다

2) list failure 장애번호 detail; : 장애에 대해 자세히 알려준다.

RMAN 에서 아카이브로그 파일 확인하는 방법
list archivelog all;

문제가 있는 테이블스페이스를 offline 모드로 변경한다
sql 'alter tablespace users offline immediate';
- immediate를 하면 해당 테이블스페이스에 checkpoint를 발생하지 않는다.

문제있는 테이블스페이스의 데이터파일만 restore 해준다.
restore tablespace users;

해당 테이블스페이스를 recover 해서 완전복구
recover tablespace users;

복구가 완료됬으면 online으로 모드 변경
sql 'alter tablespace users online';

테이블스페이스를 생성하는데 다른 위치로 생성

신규 테이블스페이스에 신규 테이블 생성

RMAN 에서 특정한 테이블스페이스만 백업
backup tablespace insa_tbs;

백업 리스트 확인
list backup;

특정한 테이블스페이스에 대한 백업정보만 확인하고 싶을때
list backup of tablespace insa_tbs;

특정 데이터파일 삭제로 장애유발

DB 비정상 종료 후 MOUNT 단계까지 재실행 후 문제되는 데이터파일을 OFFLINE으로 변경

DB OPEN

RMAN에서 복구해야할 데이터파일의 위치를 변경 후 restore을 하고 recover 까지 한번에 수행
run {
--sql 'alter tablespace insa_tbs offline immediate'; 우리는 이미 이전에 문제있는 데이터파일을 offline 모드로 변경하였기 때문에 수행하지 않는다.
set newname for datafile 4 to '/u01/app/oracle/oradata/ORA19C/insa_tbs01.df';
restore tablespace insa_tbs;
switch datafile 4;
recover tablespace insa_tbs;
sql 'alter tablespace insa_tbs online';
}

이제 필요가 없다고 생각되어 테이블스페이스를 삭제

rman에서 정책상 필요없는 백업정보, 아카이브 정보 확인
report obsolete;

delete obsolete;
system datafile 삭제로 장애유발
DB 비정상 종료 후 재시동 하지만 mount 단계까지만 실행 후 오류 발생
system 파일은 offline으로 변경해도 DB를 OPEN 할 수는 없다.
RMAN 에서 system datafile만 restore
restore 한 system 파일을 recover 해준다.
system 파일을 online으로 변경 후 DB OPEN 해주면 된다.
control 파일에 변경사항이 생겨 자동으로 새롭게 백업이 되었다. rman 에서 정책상 필요없는 백업정보를 확인해보면 이전 control file 백업본이 조회된다.
report obsolete;
이전 control file 백업본은 필요 없기 때문에 삭제해줘도 된다.
delete obsolete;
RMAN 으로 받은 가장 최근의 백업본 SCN 이후에 대한 아카이브 로그 파일이 있는지 확인
모든 데이터파일 삭제로 장애유발
DB 비정상적인 종료
rman으로 현재 schema 정보 확인
컨트롤파일에 데이터파일, 템프 파일 위치 변경 후 restore 하고 recover 후 DB OPEN 까지 하면 된다.
run {
set newname for datafile 1 to '/home/oracle/oradata/system01.dbf';
set newname for datafile 2 to '/home/oracle/oradata/undotbs01.dbf';
set newname for datafile 3 to '/home/oracle/oradata/sysaux01.dbf';
set newname for datafile 5 to '/home/oracle/oradata/example01.dbf';
set newname for datafile 7 to '/home/oracle/oradata/users01.dbf';
set newname for tempfile 1 to '/home/oracle/oradata/temp01.dbf';
restore database;
switch datafile all;
switch tempfile all;
recover database;
alter database open;
}
새로운 테이블스페이스 생성 후 해당 테이블스페이스에 테이블을 생성
백업 받지 않았는데 데이터파일을 삭제해버려 장애유발
DB를 정상적으로 종료 시도 하지만 오류 발생
DB를 비정상 종료 후 RMAN 으로 접속
startup 하지만 손상된 데이터파일이 있기 때문에 open 되지않는다. 하지만 다른 업무들은 수행해야 하기 때문에 문제있는 데이터파일만 offline 으로 변경 후 DB OPEN
문제있는 데이터파일은 백업파일이 없기 때문에 redo 정보를 받을 데이터파일을 생성해줘야 한다.
alter database create datafile '/u01/app/oracle/oradata/ORA19C/data_tbs01.dbf';
생성된 데이터파일로 redo 정보를 recover 해주면 된다.
recover datafile '/u01/app/oracle/oradata/ORA19C/data_tbs01.dbf';
recover 되었으면 online으로 변경할 수 있고 정상적으로 조회가 된다.
data tbs 테이블스페이스에 데이터파일을 추가
alter tablespace data_tbs add datafile '/u01/app/oracle/oradata/ORA19C/data_tbs02.dbf' size 5m;

신규 테이블 생성
create table hr.emp_2024 tablespace data_tbs as select * from hr.employees;
select f.tablespace_name, f.file_name,count(*)
from dba_extents e, dba_data_files f
where f.file_id = e.file_id
and e.segment_name = 'EMP_2024'
and e.owner = 'HR'
group by f.tablespace_name, f.file_name;

대량의 데이터를 추가하여 데이터파일을 추가한 데이터파일을 쓰도록 유도

추가한 데이터파일은 백업을 안해놨기 때문에 데이터파일 레벨로 백업

추가한 데이터파일 삭제로 장애 유발

DB 종료하려고 하는데 오류발생
RMAN으로 접속 후 MOUNT 단계까지 실행
list failure로 문제되는 파일 확인
문제되는 데이터파일 offline 으로 변경 후 DB OPEN

hr.new는 data_tbs01 에만 존재하기 때문에 조회가 가능하지만 hr.emp_2024는 data_tbs01에도 존재하지만 data_tbs02에도 존재하기 때문에 조회하려고 하면 오류가 발생한다.'
rman에서 recover 필요한 데이터파일만 restore 작업
restore 되면 recover도 데이터파일 레벨로 수행
recover 된 데이터파일은 online으로 변경하면 끝난다.
이후 아까 조회 오류가 났던 hr.emp_2024테이블을 조회해보면 정상적으로 조회된다.

테이블스페이스 삭제 후 백업파일도 필요없어졌으니 정책상 필요없는 백업파일 및 아카이브 로그 파일을 조회 후 삭제해준다.
DB 정상적인 종료 후 UNDO 파일 삭제로 장애유발
DB를 재실행 하지만 OPEN 하지 못하고 MOUNT 단계에서 오류발생
undo 데이터파일은 offline 으로 변경 후 DB OPEN
RMAN 실행 후 undo 데이터파일을 RESTORE
데이터파일 레벨로 UNDO 파일 RECOVER
UNDO 파일 ONLINE 으로 변경
새로운 테이블스페이스 생성

생성된 테이블스페이스 확인
select a.file#, b.name ,a.name, a.status, a.checkpoint_change#
from v$datafile a, v$tablespace b
where a.ts# = b.ts#;

신규 테이블스페이스를 기반으로한 테이블 생성

전체 파일 백업

정책상 이제는 필요 없는 백업과 아카이브파일 삭제
report obsolete;
delete obsolete;
새롭게 백업을 받은 후에는 current한 리두로그 파일을 아카이브로그파일로 생성하는 습관을 가져야한다.
alter system archive log current;
신규 테이블스페이스를 기반으로 한 두번째 테이블 생성

테이블스페이스 삭제
drop tablespace data_tbs including contents and datafiles;

RMAN 에서 백업정보를 확인해보면 물리적으로 삭제된 데이터파일의 이름은 보여주지 않는다.

timebase recovery 하기 위해서 DB 종료

복구해야하는 테이블스페이스에 대한 정보는 과거 백업 컨트롤 파일이 가지고 있다. 따라서 과거 백업 컨트롤파일을 restore해야 하기 때문에 DB는 일단 nomount 단계로 실행해야한다.
startup nomount
백업 컨트롤파일 restore
restore controlfile from '/u01/app/oracle/fast_recovery_area/ORA19C/autobackup/2024_09_19/o1_mf_s_1180086756_mgpxgng2_.bkp';

백업컨트롤파일을 가지고 mount 단계로 변경
alter database mount;
alert log에서 데이터파일 삭제 시간을 확인 후 time base recover를 수행한다.
2024-09-19T10:07:17.492380+09:00
Deleted file /u01/app/oracle/oradata/ORA19C/data_tbs01.dbf
Completed: drop tablespace data_tbs including contents and datafiles
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
run {
set until time '2024-09-19 10:07:00';
restore database;
recover database;}
복구 완료되었으면 DB를 OPEN 하고 복구된 데이터를 확인

DB를 RESETLOGS로 OPEN 하였기 때문에 이전 백업파일 및 아카이브파일은 필요가 없기 때문에 정책상으로 필요없는 파일들 확인
report obsolete;

확인 후 삭제 시도
delete obsolete;

- 삭제를 진행하다 보면 control파일이 가지고 있는 논리적인 archive 정보와 물리적인 archive 정보가 맞지 않아 경고가 발생한다.
crosscheck를 통해 맞지 않는 archive 파일은 expired 시킨다.
crosscheck archivelog all;

그 후 expired 된 archive log 파일 확인
list expired archivelog all;
delete expired archivelog all;
새롭게 전체 파일 백업
backup database;
테이블 생성 후 로그스위치 발생으로 아카이브로그 파일 생성

시간 확인후 생성했던 테이블 삭제

clone 디렉터리 생성
mkdir clone
init파일을 clone DB에 맞게 수정

아카이브로그 파일들 전체 clone 디렉터리로 복사

백업 컨트롤 파일 피스 & 데이터파일 피스도 clone 디렉터리로 복사

oracle 환경변수 변경

DB를 clone pfile을 이용하여 nomount 단계까지 실행
startup pfile='$ORACLE_HOME/dbs/initclone.ora' nomount

RMAN을 auxiliary로 열기

run{
set newname for datafile 1 to '/home/oracle/clone/system01.dbf';
set newname for datafile 2 to '/home/oracle/clone/undotbs01.dbf';
set newname for datafile 3 to '/home/oracle/clone/sysaux01.dbf';
set newname for datafile 5 to '/home/oracle/clone/example01.dbf';
set newname for datafile 7 to '/home/oracle/clone/users01.dbf';
set newname for tempfile 1 to '/home/oracle/clone/temp01.dbf';
duplicate target database to 'clone'
pfile='$ORACLE_HOME/dbs/initclone.ora'
nofilenamecheck
backup location '/home/oracle/clone'
until time "to_date('2024-09-19 11:22:00','yyyy-mm-dd hh24:mi:ss')"
logfile '/home/oracle/clone/redo01.log' size 50m,
'/home/oracle/clone/redo02.log' size 50m,
'/home/oracle/clone/redo03.log' size 50m; }

새로운 테이블 생성

생성한 테이블 삭제 후 log miner를 통해 삭제 시간 확인
clone DB 생성할때 current한 log도 분석 대상이기 때문에 archive log파일로 떨어트린다.
alter system archive log current;
clone DB 생성을 위한 pfile 생성
create pfile='$ORACLE_HOME/dbs/initclone.ora' from spfile;
백업 컨트롤파일&데이터파일, 아카이브로그파일을 담을 clone 디렉터리 생성
mkdir clone
clone pfile 수정
*.compatible='19.0.0'
*.control_files='/home/oracle/clone/control01.ctl'
*.db_name='clone'
*.log_archive_dest_1='location=/home/oracle/clone mandatory'
*.log_archive_format='arch_%t_%s_%r.arc'
*.undo_tablespace='UNDOTBS1'
# 파일들의 위치가 동일하면 해당 방법으로 변경 가능하지만, 파일들의 위치가 다르면 set newname을 해야한다.
DB_FILE_NAME_CONVERT=(/u01/app/oracle/oradata/ORA19C/, /home/oracle/clone/)
LOG_FILE_NAME_CONVERT=(/u01/app/oracle/oradata/ORA19C/, /home/oracle/clone/)

새로운 세션창에서 oraenv 환경변수 설정

clone DB를 pfile을 이용해 nomount 단계까지 실행

아직 target DB가 없기 때문에 RMAN을 auxiliary로 실행

run 집합문을 통해 복제 DB 생성
run{
duplicate target database to 'clone'
skip tablespace users
pfile='$ORACLE_HOME/dbs/initclone.ora'
nofilenamecheck
backup location '/home/oracle/clone'
until time "to_date('2024-09-19 14:50:00','yyyy-mm-dd hh24:mi:ss')"; }
- default tablespace인 users를 skip하고 DB를 복제생성시 system이 default tablespace가 된다.


SKIP한 테이블스페이스는 존재하지 않는다.

이후 clone DB에서 import 후 운영DB에 export 해주면 된다.
export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss' 설정백업파일의 scn을 확인후 몇번 시퀀스의 아카이브로그파일부터 필요하지 확인


DB 정상 종료 후 특정 데이터파일 및 특정 아카이브파일 삭제

startup 하지만 특정데이터파일이 없어 오류 발생(mount 단계까지는 실행됨)

rman에서 오류 확인
list failure
손상된 데이터파일을 백업파일에서 restore 후 recover을 시도

run {
set until scn=6632865;
restore database;
recover database;}


신규 테이블 생성

수동으로 로그스위치 발생

control file, data file 삭제로 장애유발

DB는 비정상적으로 종료
DB는 nomount 단계까지 실행 후 RMAN 실행
가장 최근에 백업받아놓은 control file을 restore
restore controlfile from autobackup;restore한 백업 control file을 이용해 mount 단계까지 실행
alter database mount;

백업받아놓은 데이터파일 restore
restore database;

redo는 정상적으로 남아있기 때문에 redo를 이용해서 완전복구 recover 수행
recover database;

복구가 완료된 후 DB는 RESETLOGS로 OPEN 한다.

RESETLOGS로 DB OPEN 후 이전 백업파일과 아카이브로그파일은 의미가 없기 때문에 삭제 하는걸 권장한다.
report obsolete;
delete obsolete;
crosscheck archivelog all;
list expired archivelog all;
delete expired archivelog all;

로그스위치 발생

두번째 신규 테이블 생성

control file, redo log file 삭제로 장애유발

DB 비정상적인 종료 후 RMAN으로 DB를 nomount 단계까지 실행

가장 최근에 백업받은 control file을 restore 한 후 mount 단계로 변경

redo가 손상된줄 모르고 recover를 하지만 현재 current한 리두가 없기 때문에 오류발생

살아있는 아카이브로그파일까지는 recover이 가능하기때문에 scn base recovery를 수행 후 DB OPEN은 RESETLOGS로 해야한다.

복구 데이터를 확인해보면 아카이브로그파일에 저장되어있던 fri 테이블은 살아있지만 current한 리두로그에 저장되어있던 sat 테이블은 손실된걸 확인 할 수 있다.

DB ID값 확인

또는
select dbid,name, log_mode from v$database;

DB 정상 종료

spfile, pfile을 삭제

DB를 startup 해보지만 초기파라미터 파일이 없기때문에 불가능

RMAN 에서는 초기파라미터 파일이 없지만 RMAN에서 제공하는 샘플 메모리를 이용해서 nomount 단계까지는 실행 가능하다.

이전 확인했던 DBID를 설정 해야한다.

spfile을 restore 할때 from autobackup으로 시도해보지만 오류가 발생 시 수동으로 위치를 설정해주면 spfile을 restore 할 수 있다.

spfile은 원래 위치인 $ORACLE_HOME/dbs에 restore 되었으니 DB를 내린다음 다시 startup 하면 정상적으로 DB가 올라온걸 확인 할 수 있다.
