[일반 테이블스페이스 물리 장애 발생]
1. 필요없는 테이블스페이스의 경우 offline
2. 필요한 테이블스페이스의 경우 recover 진행
case1) 백업파일이 존재하는 경우
-> 복구 대상만 offline
-> 복구 대상만 restore
-> recover (완전복구)
case2) 백업파일이 존재하지 않는 경우
-> shutdown
-> controlfile 재생성 / restore
-> datafile restore
-> recover
-> open
-> 현재 controlfile은 장애 난 테이블스페이스를 알고 있기 때문에 새로 생성이 불가. 따라서 장애 난 테이블스페이스를 모르는 시점의 controlfile을 restore한 후 장애 난 테이블스페이스가 생긴 시점 및 현재 시점까지의 아카이브를 모두 적용하여 복구해야 함!
[RMAN을 사용한 백업 및 복구]
case3) 일반 tablespace datafile 물리적 손상 (online 중 유실, 백업본이 존재하지 않을 경우)
1. 사전 준비
rman target /
> list backup;
> delete backupset;
> list backup;
cd $ORACLE_HOME/dbs
2. full backup
rman target /
> configure channel device type disk format '/oracle19/backup/ora19db/d_%d_%U_%T.bk';
> backup database;
> list backup;
3. 테이블스페이스 생성
select * from dba_data_files;
create tablespace ts_test2 datafile '/oracle19/app/oracle/oradata/ORA19DB/ts_test02.dbf' size 10m;
create table recover_test2(no number) tablespace ts_test2;
insert into recover_test2 values(100);
insert into recover_test2 values(200);
insert into recover_test2 values(300);
commit;
4. 장애 발생
rm /oracle19/app/oracle/oradata/ORA19DB/ts_test02.dbf
5. DB shutdown abort (immediate로는 안 됨)
6. 복구
1) nomount
RMAN> startup nomount;
2) controlfile restore
RMAN> restore controlfile from '/oracle19/app/oracle/product/19.3.0.1/db_1/dbs/c-73391101-20250121-01';
3) mount
RMAN> alter database mount;
4) restore
RMAN> restore database;
5) recover
RMAN> recover database;
6) open (resetlogs)
RMAN> alter database open resetlogs;
7. 데이터 조회
select * from recover_test2;
case4) 논리 장애 복구 (truncate)
장애 발생 시점 이전으로 되돌리는 시점 복구 진행.
과거로 돌아갈 수 없으므로 과거의 정보를 갖는 최근 백업본으로부터 아카이브를 적용하여 복구시점으로 데이터를 복원하는 복구를 진행
1. 백업 수행
RMAN> configure controlfile autobackup on;
-- 이미 설정되어 있음
RMAN> configure controlfile autobackup format for device type disk to '/oracle19/backup/ora19db/%F';
-- controlfile backup본 위치 변경
RMAN> configure channel device type disk format '/oracle19/backup/ora19db/d_%d_%U_%T.bk';
-- database backupset 위치 변경
RMAN> backup database;
2. 테이블 생성
create table recover_test3(no number);
insert into recover_test3 values(10);
insert into recover_test3 values(20);
insert into recover_test3 values(30);
commit;
3. 시점 확인
select sysdate from dual;
-- 2025/01/21 12:02:12
4. 장애 발생
truncate table recover_test3;
5. 복구
1) DB shutdown
RMAN> shutdown abort
2) nomount
RMAN> startup nomount
3) controlfile restore
방법1) controlfile backupset 직접 지정
RMAN> restore controlfile from '/oracle19/backup/ora19db/c-73391101-20250121-04';
방법2) DBID 전달과 함께 restore -- 근데 이거 controlfile 을 지정해줘야 되는데 방법도 모르고 안해봐서 일단은 안하는게 나을 듯!
RMAN> run {
set dbid 73391101;
restore controlfile from autobackup;
}
** DBID 조회
select DBID from v$database; -- 73391101
4) mount
RMAN> alter database mount;
5) restore
RMAN> restore database;
6) recover
RMAN> run {
set until time "to_date('2025/01/21 12:02:12', 'YYYY/MM/DD HH24:MI:SS')";
recover database;
}
recover database until time to_date('2025/01/21 12:02:12','YYYY/MM/DD HH24:MI:SS'); -- 이런 방식은 안됨
7) open
RMAN> alter database open resetlogs;
6. 조회
RMAN> select * from system.recover_test3;
case5) 논리 장애 복구 (drop table purge)
1. 백업 수행
RMAN> configure controlfile autobackup on;
RMAN> configure controlfile autobackup format for device type disk to '/oracle19/backup/ora19db/%F';
RMAN> configure channel device type disk format '/oracle19/backup/ora19db/d_%d_%U_%T.bk';
RMAN> backup database;
2. 테이블 생성
CREATE TABLE RECOVER_TEST4(NO NUMBER);
INSERT INTO RECOVER_TEST4 VALUES(40);
INSERT INTO RECOVER_TEST4 VALUES(50);
INSERT INTO RECOVER_TEST4 VALUES(60);
COMMIT;
3. 시점 확인
select sysdate from dual;
-- 2025/01/21 12:28:35
4. 장애 발생
drop table RECOVER_TEST4 purge;
5. 복구
1) DB shutdown
RMAN> shutdown abort
2) nomount
RMAN> startup nomount
3) controlfile restore
방법1) controlfile backupset 직접 지정
RMAN> restore controlfile from '/oracle19/backup/ora19db/c-73391101-20250121-07';
방법2) DBID 전달과 함께 restore -- 근데 이거 안되는데?? open에서 막힘!
RMAN> run {
set dbid 73391101;
restore controlfile from autobackup;
}
** DBID 조회
select DBID from v$database; -- 73391101
4) mount
RMAN> alter database mount;
5) restore
RMAN> restore database;
6) recover
RMAN> run {
set until time "to_date('2025/01/21 12:28:35', 'YYYY/MM/DD HH24:MI:SS')";
recover database;
}
7) open
RMAN> alter database open resetlogs;
6. 조회
select * from system.recover_test4;
[recoverdb 만들기]
1. oel8copy 복사해서 recoverdb라고 서버 만들어주고 이름 수정 & .vmx내용 수정
2. 실행 후 hosts, hostname 변경
3. 기존 백업 삭제
cd /oracle19/arch
rm *
cd /oracle19/backup/ora19db
rm *
[RMAN을 사용한 백업 및 복구]
case5) copydb를 사용한 논리 장애 복구(truncate)
0. 사전 준비 oel8copy에서 기존 백업 / 아카이브 삭제
rm /oracle19/backup/ora19db/*
rm /oracle19/arch/*
1. 백업 수행
select sysdate from dual;
-- 2025/01/21 14:47:24
configure controlfile autobackup format for device type disk to '/oracle19/backup/ora19db/%F';
configure channel device type disk format '/oracle19/backup/ora19db/d_%d_%U_%T.bk';
RMAN> backup database;
2. 테이블 생성
create table recover_test5(no number);
insert into recover_test5 values(70);
insert into recover_test5 values(80);
insert into recover_test5 values(90);
commit;
3. 시점 확인
alter system switch logfile;
select sysdate from dual;
-- 2025/01/21 14:56:00
4. 장애 발생
truncate table recover_test5;
alter system switch logfile;
5. copydb (recoverdb) 를 사용한 복구를 위해 파일 전송하기
** 필요 파일
– parameter file
– controlfile script – 선택사항 (없어도 됨)
– archive file
– backup file
-- recoverdb에서 할 일
mkdir -p /home/oracle/backup
-- oel8copy에서 할 일
mkdir -p /home/oracle/backup
su -
vi /etc/hosts
-----------------------------
172.16.124.135 recoverdb
create pfile='/home/oracle/backup/init.ora' from spfile;
alter database backup controlfile to trace as '/home/oracle/backup/control.sql';
scp /home/oracle/backup/* oracle@recoverdb:/home/oracle/backup
scp /oracle19/arch/* oracle@recoverdb:/oracle19/arch
scp /oracle19/backup/ora19db/* oracle@recoverdb:/oracle19/backup/ora19db
6. recoverdb에서 복구
1) init.ora 수정하기
* 수정대상
- 로그위치 수정(실제 물리적인 디렉토리도 생성돼야 함)
- controlfile 위치 수정
- 아카이브 위치 수정
- ORA19DB로 시작하는 모든 파라미터 삭제
- local_listener 설정 삭제
- pluggable 설정 유지
mv /home/oracle/backup/init.ora /home/oracle/backup/initrecoverdb.ora
vi /home/oracle/backup/initrecoverdb.ora
--------------------------------------
*.audit_file_dest='/oracle19/recover/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='/oracle19/recover/data/control01.ctl'
*.db_block_size=8192
*.db_name='ora19db'
*.diagnostic_dest='/oracle19/recover'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ora19dbXDB)'
*.enable_pluggable_database=true
*.log_archive_dest_1='location=/oracle19/arch'
*.memory_target=1192m
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
----------------------------------------
cp initrecoverdb.ora $ORACLE_HOME/dbs
2) directory 만들어주기
mkdir -p /oracle19/recover/adump
mkdir -p /oracle19/recover/data
3) nomount
export ORACLE_SID=recoverdb
startup nomount
4) controlfile restore
RMAN> restore controlfile from '/oracle19/backup/ora19db/c-73391101-20250121-0b';
5) mount
alter database mount;
6) datafile restore
-- backupset 경로를 지정 안 해주면 못 찾음
catalog start with '/oracle19/backup/ora19db';
restore database;
-- 위 명령어가 .bk 파일을 unzip해버리는 느낌이다. 근데 그때 기존에 알고있는 경로에 덮어써버린다. 만약 DB가 돌아가는 게 있다면 장애다. 그래서 실무에서는 아래처럼 각 datafile들의 위치를 지정해주고 restore 해야 된다.
-- 1) 파일넘버를 확인하기 위해 원본 DB에서 체크하기
select file#, name from v$datafile;
-- 2) restore하기
run {
allocate channel ch1 device type disk ;
allocate channel ch2 device type disk ;
set newname for tempfile 1 to '/oracle19/recover/data/temp01.dbf';
set newname for datafile 1 to '/oracle19/recover/data/system01.dbf';
set newname for datafile 3 to '/oracle19/recover/data/sysaux01.dbf';
set newname for datafile 4 to '/oracle19/recover/data/undotbs01.dbf';
set newname for datafile 5 to '/oracle19/recover/data/pdbseed/system01.dbf';
set newname for datafile 6 to '/oracle19/recover/data/pdbseed/sysaux01.dbf';
set newname for datafile 7 to '/oracle19/recover/data/users01.dbf';
set newname for datafile 8 to '/oracle19/recover/data/pdbseed/undotbs01.dbf';
set newname for datafile 9 to '/oracle19/recover/data/orapdb/system01.dbf';
set newname for datafile 10 to '/oracle19/recover/data/orapdb/sysaux01.dbf';
set newname for datafile 11 to '/oracle19/recover/data/orapdb/undotbs01.dbf';
set newname for datafile 12 to '/oracle19/recover/data/orapdb/users01.dbf';
set newname for datafile 13 to '/oracle19/app/oracle/oradata/ORA19DB/ts_test01.dbf';
set newname for datafile 14 to '/oracle19/app/oracle/oradata/ORA19DB/ts_test02.dbf';
restore datafile 1,3,4,5,6,7,8,9,10,11,12,13,14;
switch datafile all;
switch tempfile all;
}
-- 위 명령어에서 set newname~부분은 controlfile에 경로를 수정해주는 느낌의 명령이고,
-- restore datafile~ 부분은 압축해제 느낌의 명령이고,
-- switch~ 부분은 실제로 파일의 위치를 해당 경로로 옮기는 느낌(mv)의 명령이다.
7) recover
run {
set until time "to_date('2025/01/21 14:56:00', 'YYYY/MM/DD HH24:MI:SS')";
recover database;
}
8) open
alter database open resetlogs;
7. 조회
select * from system.recover_test5;
case6) copydb를 사용한 논리 장애 복구(drop table purge)
이번에는 필요한 archive file만 보내서 복구 해보기
0. 사전 준비 oel8copy에서 기존 백업 삭제
rm /oracle19/backup/ora19db/*
1. 백업 수행
select sysdate from dual;
-- 2025/01/21 18:27:38
configure controlfile autobackup format for device type disk to '/oracle19/backup/ora19db/%F';
configure channel device type disk format '/oracle19/backup/ora19db/d_%d_%U_%T.bk';
RMAN> backup database;
2. 테이블 생성
create table recover_test6(no number);
insert into recover_test6 values(700);
insert into recover_test6 values(800);
insert into recover_test6 values(900);
commit;
3. 시점 확인
alter system switch logfile;
select sysdate from dual;
-- 2025/01/21 18:28:23
4. 장애 발생
drop table recover_test6 purge;
alter system switch logfile;
5. copydb (recoverdb) 를 사용한 복구를 위해 파일 전송하기
** 필요 파일
– parameter file
– archive file
– backup file
-- oel8copy에서 할 일
create pfile='/home/oracle/backup/init.ora' from spfile;
alter database backup controlfile to trace as '/home/oracle/backup/control.sql';
scp /home/oracle/backup/* oracle@recoverdb:/home/oracle/backup
scp /oracle19/backup/ora19db/* oracle@recoverdb:/oracle19/backup/ora19db
-- 원하는 archive file만 찾기
select name,
sequence#,
thread#,
resetlogs_id,
first_change#,
round(block_size*blocks/1024/1024,2) as "size(mb)",
completion_time
from v$archived_log
where completion_time between to_date('2025/01/21 18:27:38','YYYY/MM/DD HH24:MI:SS') -- 최근 백업 시점
and to_date('2025/01/21 18:28:23','YYYY/MM/DD HH24:MI:SS') -- 복구 시점
or to_date('2025/01/21 18:28:23','YYYY/MM/DD HH24:MI:SS') between first_time and completion_time
order by completion_time;
-----------------------------------------------------------
scp /oracle19/arch/1_10_1190984017.dbf oracle@recoverdb:/oracle19/arch
scp /oracle19/arch/1_11_1190984017.dbf oracle@recoverdb:/oracle19/arch
scp /oracle19/arch/1_12_1190984017.dbf oracle@recoverdb:/oracle19/arch
scp /oracle19/arch/1_13_1190984017.dbf oracle@recoverdb:/oracle19/arch
scp /oracle19/arch/1_14_1190984017.dbf oracle@recoverdb:/oracle19/arch
scp /oracle19/arch/1_15_1190984017.dbf oracle@recoverdb:/oracle19/arch
6. recoverdb에서 복구
1) init.ora 수정하기
vi /home/oracle/backup/initrecoverdb.ora
--------------------------------------
*.audit_file_dest='/oracle19/recover/adump'
*.audit_trail='db'
*.compatible='19.0.0'
*.control_files='/oracle19/recover/data/control01.ctl'
*.db_block_size=8192
*.db_name='ora19db'
*.diagnostic_dest='/oracle19/recover'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=ora19dbXDB)'
*.enable_pluggable_database=true
*.log_archive_dest_1='location=/oracle19/arch'
*.memory_target=1192m
*.nls_language='AMERICAN'
*.nls_territory='AMERICA'
*.open_cursors=300
*.processes=300
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
----------------------------------------
cp /home/oracle/backup/init.ora $ORACLE_HOME/dbs/initrecoverdb.ora
2) nomount
echo $ORACLE_SID
-- ORACLE_SID 확인 후에
startup nomount
3) controlfile restore
RMAN> restore controlfile from '/oracle19/backup/ora19db/c-73391101-20250121-0c';
4) mount
alter database mount;
5) datafile restore
-- backupset 경로를 지정 안 해주면 못 찾음
catalog start with '/oracle19/backup/ora19db';
-- 1) 파일넘버를 확인하기 위해 원본 DB에서 체크하기
select file#, name from v$datafile;
-- 2) restore하기
run {
allocate channel ch1 device type disk ;
allocate channel ch2 device type disk ;
set newname for tempfile 1 to '/oracle19/recover/data/temp01.dbf';
set newname for datafile 1 to '/oracle19/recover/data/system01.dbf';
set newname for datafile 3 to '/oracle19/recover/data/sysaux01.dbf';
set newname for datafile 4 to '/oracle19/recover/data/undotbs01.dbf';
set newname for datafile 5 to '/oracle19/recover/data/pdbseed/system01.dbf';
set newname for datafile 6 to '/oracle19/recover/data/pdbseed/sysaux01.dbf';
set newname for datafile 7 to '/oracle19/recover/data/users01.dbf';
set newname for datafile 8 to '/oracle19/recover/data/pdbseed/undotbs01.dbf';
set newname for datafile 9 to '/oracle19/recover/data/orapdb/system01.dbf';
set newname for datafile 10 to '/oracle19/recover/data/orapdb/sysaux01.dbf';
set newname for datafile 11 to '/oracle19/recover/data/orapdb/undotbs01.dbf';
set newname for datafile 12 to '/oracle19/recover/data/orapdb/users01.dbf';
set newname for datafile 13 to '/oracle19/app/oracle/oradata/ORA19DB/ts_test01.dbf';
set newname for datafile 14 to '/oracle19/app/oracle/oradata/ORA19DB/ts_test02.dbf';
restore datafile 1,3,4,5,6,7,8,9,10,11,12,13,14;
switch datafile all;
switch tempfile all;
}
6) recover
run {
set until time "to_date('2025/01/21 18:28:23', 'YYYY/MM/DD HH24:MI:SS')";
recover database;
}
7) open
alter database open resetlogs;
7. 조회
select * from system.recover_test6;