Oracle 67일차

[control file 장애]

1) DB 정상 종료 후 controlfile 손상의 경우 recover 필요없음.
2) 운영 중에 controlfile 손상의 경우 DB 정상 종료 불가 & recover 필요.

모든 control file 손상 시 해결 방법
1) old control file을 사용한 복구
2) controlfile 재생성 스크립트로 재생성

SQL> alter database backup controlfile to trace as '/backup/oradb/control.sql';

실습

DB 정상 종료 후 controlfile 손상의 경우.

1. 백업

alter database backup controlfile to trace as '/backup/oradb/control.sql';

2. srvctl stop database -d oradb

3. 장애 발생

asmcmd rm '+DATA/ORADB/CONTROLFILE/current.257'
asmcmd rm '+DATA/ORADB/CONTROLFILE/current.258'

4. 복구 – 1번 instance 에서

1) nomount

startup nomount

2) exclusive mode 전환 (single instance로 가정하고 복구 진행)

alter system set cluster_database=false scope=spfile;
shutdown immediate
startup nomount

3) control file 재생성 – noresetlogs 사용하기.

SQL> @control.sql  -- 바로 mount 단계까지 가짐.

4) recover – 근데 지금은 data file 건드린 게 없어서 recover할 게 없음. 생략해도 됨.

recover database

5) open

alter database open;

5. exclusive mode 전환

alter system set cluster_database=true scope=spfile;
shutdown immediate

6. 모든 instance open

srvctl start database -d oradb

7. temp tbs 추가하기

-- 조회 쿼리
SELECT TABLESPACE_NAME, FILE_NAME FROM DBA_TEMP_FILES;

> alter tablespace temp add tempfile size 137363456 autoextend on maxsize 32767m;
-- 42일차 자료에 내용 있음. 내 주관대로 asm 환경에서 쓸 수 있을 법하게 바꿈.
-- 새로운 temp file이 생성되었음. 기존의 것은 지워도 괜찮을듯..?

[redo 장애]

모든 redo log file 손상.

해결 방법) current redo log의 손상은 불완전 복구를 수행해야 open 가능

실습 전 준비

0. ORACLE DB 설치파일 삭제

용량 이슈.

cd /oracle/media
rm *
ll

1. 불필요 테이블스페이스 삭제 – 용량 이슈.

select * from dba_tablespaces;
drop tablespace 테이블스페이스명 including contents and datafiles;

2. redo member 정리 – 용량때문에 다중화했던 걸 그룹별 1개씩으로 정리.

vi log.sql
---------------------------------------
set pages 1000
set lines 1000
col member format a45
col group# format 99
col archived format a8
col status format a7
col seq# format 999

select a.group#,
       a.member,
       b.bytes/1024/1024 as size_mb,
       b.archived,
       b.status,
       b.sequence# as seq#
from v$logfile a, v$log b
where a.group# = b.group#
order by 1, 2;
-------------------------------------

alter database drop logfile member '+DATA/ORADB/ONLINELOG/group_1.279.1190300593';
alter database drop logfile member '+DATA/ORADB/ONLINELOG/group_2.280.1190300593';
alter database drop logfile member '+DATA/ORADB/ONLINELOG/group_3.281.1190300595';
alter database drop logfile member '+DATA/ORADB/ONLINELOG/group_4.282.1190300595';
alter system switch logfile;

3. online backup 수행

1) begin backup

ALTER TABLESPACE SYSTEM BEGIN BACKUP;
ALTER TABLESPACE SYSAUX BEGIN BACKUP;
ALTER TABLESPACE UNDOTBS1 BEGIN BACKUP;
ALTER TABLESPACE UNDOTBS2 BEGIN BACKUP;
ALTER TABLESPACE USERS BEGIN BACKUP;

2) asmcmd cp

mkdir -p /backup/oradb/hot/20250114
asmcmd cp '+DATA/ORADB/DATAFILE/SYSAUX.261' /backup/oradb/hot/20250114
asmcmd cp '+DATA/ORADB/DATAFILE/SYSTEM.261' /backup/oradb/hot/20250114
asmcmd cp '+DATA/ORADB/DATAFILE/UNDOTBS1.262' /backup/oradb/hot/20250114
asmcmd cp '+DATA/ORADB/DATAFILE/UNDOTBS2.264' /backup/oradb/hot/20250114
asmcmd cp '+DATA/ORADB/DATAFILE/USERS.265' /backup/oradb/hot/20250114

3) end backup

ALTER TABLESPACE SYSTEM END BACKUP;
ALTER TABLESPACE SYSAUX END BACKUP;
ALTER TABLESPACE UNDOTBS1 END BACKUP;
ALTER TABLESPACE UNDOTBS2 END BACKUP;
ALTER TABLESPACE USERS END BACKUP;

-- end backup 찍혔는지 체크 쿼리
select
    ts.name as tablespace_name,
    df.name as datafile_name,
    df.file#,
    b.status
from
    v$tablespace ts,
    v$datafile df,
    v$backup b
where
    ts.ts# = df.ts#
    and df.file# = b.file#;

4. 로그 스위치 – recover 시에 archive log file 적용돼가는 모습을 보기 위해서

alter system switch logfile;  -- 5번 이상

실습

1. DB shutdown

srvctl stop database -d oradb

2. 장애 발생

asmcmd rm '+data/oradb/datafile/*'

3. 장애 복구 – 1번에서 진행

-- restore (data file)
asmcmd
cd data/oradb/datafile
cp /backup/oradb/hot/20250114/* .

-- recover (불완전복구)
startup 또는 startup mount
-- 만약 datafile의 이름이 controlfile에 있는 이름이랑 다르다면 rename 과정이 필요함.
-- 2번에 저장되어있는 archivelogfile을 1번으로 옮길 필요가 있음. 45일차에 scp 관련 내용 있음.
scp /oraarch/* oracle@oel8db1:/oraarch

recover database until cancel;
-- 맨 마지막 sequence에서 archive log file 없다고 에러나면서 종료됨.

-- open (resetlogs)
alter database open resetlogs;

[datafile 장애]

일부 data file 손상.

해결) datafile 단위 recover 진행 (redo log에 문제가 없다면 완전 복구 가능)

실습

1. DB shutdown

srvctl stop database -d oradb

2. 장애 발생

asmcmd
cd data/oradb/datafile
rm USERS.265

3. 장애 복구 – 1번에서 진행

-- restore
asmcmd cp '/backup/oradb/hot/20250114/USERS.265' to '+DATA/ORADB/DATAFILE/USERS.265

-- recover
startup mount
recover datafile '+DATA/ORADB/DATAFILE/USERS.265'

-- open
alter database open;

[논리 장애 복구]

물리적 파일 손상이 아닌 사용자의 실수로 인한 데이터 장애를 말함.
ex) truncate / 오래된 dml / drop user / drop table purge
데이터가 삭제 이전으로 되돌리는 시점 복구 수행.
database level의 복구.

** 방법
1) local db – 운영 중인 db를 되돌릴 수 없기 때문에 현업에선 못함.
– 장애난 테이블을 복구하기 위해 데이터베이스 전체가 과거 시점으로 돌아가기 때문에 다른 테이블 데이터를 잃게 됨(권장 X)

2) copy db – 현업에서 사용.
– 복구에 필요한 파일을 가지고 물리적으로 분리된 서버에서 새로운 DB구축 후 DB전체를 과거 시점으로 돌려 장애난 테이블 데이터를 복구하는 방식.
– 원본 DB에 직접 복구를 진행하지 않기 때문에 원본 DB 운영 중에도 복구가 가능함.
– copy DB에서 복구한 데이터는 dblink, exp 등을 동해 원본 DB에 전송 가능.

실습 전 준비

-- 1. online backup
ALTER TABLESPACE SYSTEM BEGIN BACKUP;
ALTER TABLESPACE SYSAUX BEGIN BACKUP;
ALTER TABLESPACE UNDOTBS1 BEGIN BACKUP;
ALTER TABLESPACE UNDOTBS2 BEGIN BACKUP;
ALTER TABLESPACE USERS BEGIN BACKUP;

asmcmd cp '+DATA/ORADB/DATAFILE/SYSAUX.261' /backup/oradb/hot/
asmcmd cp '+DATA/ORADB/DATAFILE/SYSTEM.261' /backup/oradb/hot/
asmcmd cp '+DATA/ORADB/DATAFILE/UNDOTBS1.262' /backup/oradb/hot/
asmcmd cp '+DATA/ORADB/DATAFILE/UNDOTBS2.264' /backup/oradb/hot/
asmcmd cp '+DATA/ORADB/DATAFILE/USERS.265' /backup/oradb/hot/

ALTER TABLESPACE SYSTEM END BACKUP;
ALTER TABLESPACE SYSAUX END BACKUP;
ALTER TABLESPACE UNDOTBS1 END BACKUP;
ALTER TABLESPACE UNDOTBS2 END BACKUP;
ALTER TABLESPACE USERS END BACKUP;

-- 2. log switch 5회
alter system switch logfile;

실습 – 1번 : local db에서 복구

1. 테이블 생성

create table recover_test1(no number);
insert into recover_test1 values(1);
insert into recover_test1 values(2);
insert into recover_test1 values(3);
commit;

2. 시점 확인

select sysdate from dual;
-- 2025/01/14 15:02:35

3. log switch 3번

alter system switch logfile;

4. 장애 발생

truncate table recover_test1;

5. 장애 복구

-- 1. db shutdown
srvctl stop database -d oradb

-- 2. restore (data file)
asmcmd cp '/backup/oradb/hot/SYSAUX.261' to '+DATA/ORADB/DATAFILE/SYSAUX.261'
asmcmd cp '/backup/oradb/hot/SYSTEM.261' to '+DATA/ORADB/DATAFILE/SYSTEM.261'
asmcmd cp '/backup/oradb/hot/UNDOTBS1.262' to '+DATA/ORADB/DATAFILE/UNDOTBS1.262'
asmcmd cp '/backup/oradb/hot/UNDOTBS2.264' to '+DATA/ORADB/DATAFILE/UNDOTBS2.264'
asmcmd cp '/backup/oradb/hot/USERS.265' to '+DATA/ORADB/DATAFILE/USERS.265'

-- 3. recover (시점 복구) - 필요 시 2번에 있는 archive log file을 1번으로 넘겨야 됨.
scp /oraarch/* oracle@oel8db1:/oraarch (2번에서!)
startup mount
recover database until time '2025/01/14 15:02:35'

-- 4. open
alter database open resetlogs;

-- 5. 확인
select * from recover_test1;

실습 – 2번 : copy db에서 복구

** 원본 DB에서 할 일

1. 복구 시점 확인
– 일단 대략적인 시점만 파악한 뒤 restore 되는 동안에 최대한 정확한 시점에 대해 생각하면 됨.

2. restore 요청
1) datafile : 복구시점으로부터 이전 백업본 중 가장 가까운 백업본
2) archive log : 충분한 log switch 필요 (current redo를 필요로 하는 복구의 경우)

3. copy db 구성
1) parameter file
– 경로 : $ORACLE_HOME/dbs/init${ORACLE_SID}.ora
– 수정할 내용 : memory size, rac parameter, undo, archive 경로, log 경로, controlfile 경로
2) controlfile 재생성 script – resetlogs mode
– 수정할 내용 : datafile 경로, redo log file 경로
3) ORACLE_SID 설정

4. 복구
1) nomount
2) controlfile 재생성
3) recover – 필요 시 2번 노드 아카이브를 copy db로 전송
4) open

Leave a Comment