Oracle 72일차

[일반 테이블스페이스 물리 장애 발생]

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;

Leave a Comment