Oracle 42일차

[논리 장애]

truncate table 장애

truncate table의 경우 recyclebin에 남지 않기 때문에 운영 중에 손실된 데이터에 대한 복구가 불가능.
-> truncate table하기 이전 시점으로 데이터베이스 자체를 되돌려야 함.

복구방법

1) flashback database level -> DB 운영 중 불가(shutdown 필요)

2) recover database
– 1) 장애 발생 DB에서 수행 시 shutdown필요
– 2) 장애 발생 DB는 계속 운영, copy DB를 구축하여 과거 시점으로 되돌린 후 장애 발생 DB로 복구된 데이터 import

[사전 준비]

1. shutdown immediate

2. archive log file 전체 삭제

3. offline full backup

4. online backup

5. log switch 5번

[case study 1]

운영중인 DB에 controlfile이 삭제되었다.
삭제된 상황은 alert log에는 기록되지 않고 정상 운영중이며, 별도의 모니터링 툴을 통해 알게 된 상황.
이 경우 controlfile을 물리적으로 생성하기 위해 현재 운영중인 DB를 결국 내리기로 결정(23시 작업 가정)
복구 과정을 상세히 기술, 실제 controlfile을 DB 운영중에 삭제 후 복구를 진행하라.

1. create table & insert

create table scott.case_study1(no number);
insert into scott.case_study1 values(1);
commit;

2. rm controlfile

3. shutdown abort

4. controlfile 재생성

현재 redo log file이랑 datafile에는 문제가 없으니깐 noresetlogs; 옵션으로 db open할 거고.

-- 가장 먼저 startup nomount로 parameter file까지만 읽어주고 controlfile 재생성
-- /oracle12/backup/hot_backup/control.sql에서 noresetlogs 부분을 가져와서 sqlplus에서 실행
-- 그러면 controlfile 재생성 됨.
CREATE CONTROLFILE REUSE DATABASE "DB1" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/home/oracle/oradata/db1/redo01.log',
    '/home/oracle/oradata/db1/redo01_2.log'
  ) SIZE 200M BLOCKSIZE 512,
  GROUP 2 (
    '/home/oracle/oradata/db1/redo02.log',
    '/home/oracle/oradata/db1/redo02_2.log'
  ) SIZE 200M BLOCKSIZE 512,
  GROUP 3 (
    '/home/oracle/oradata/db1/redo03.log',
    '/home/oracle/oradata/db1/redo03_2.log'
  ) SIZE 200M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/home/oracle/oradata/db1/system01.dbf',
  '/home/oracle/oradata/db1/sysaux01.dbf',
  '/home/oracle/oradata/db1/undotbs01.dbf',
  '/home/oracle/oradata/db1/users01.dbf'
CHARACTER SET KO16MSWIN949
;

5. recover & DB open

> recover database

> alter database open;

-- controlfile 재생성을 했으면 temp도 설정해주기
> alter tablespace temp add tempfile '/home/oracle/oradata/db1/temp01.dbf'
     size 137363456  reuse autoextend on next 655360  maxsize 32767m;

select * from scott.case_study1;
-- 데이터 손실없이 정상 조회됨

[case study 2]

운영중인 DB에 일부 리두로그 파일이 삭제되었다.
반복되는 로그스위치로 삭제된 리두로그 에러가 alert log에는 기록되어 장애를 인지한 상황.
멤버 하나만 삭제되어 당장 운영중에 문제는 없지만 다시 멤버를 만들기로 결정하여 작업 수행.
복구 과정을 상세히 기술, 실제 리두로그 멤버를 DB 운영중에 삭제 후 로그스위치를 통해 에러를 발생시킨 후 복구를 진행하세요.

첫번째 방법 : 39일차 필기 내용. rm redo log file -> log switch -> alter database drop logfile -> alter database add logfile

1. redo log file 1개 삭제 & log switch

-- 현재 redo 상태 확인
@/home/oracle/log.sql

-- inactive면서 archived yes인 file
rm /home/oracle/oradata/db1/redo02_2.log

alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
-- alert log --
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/home/oracle/oradata/db1/redo02_2.log'
ORA-27037: unable to obtain file status

2. controlfile 수정해서 삭제된 redo log file 신경 안 쓰도록.

alter database drop logfile member '/home/oracle/oradata/db1/redo02_2.log';

3. redo log file 생성

alter database add logfile member '/home/oracle/oradata/db1/redo02_2.log' to group 2;

[case study 3]

DB 운영중에 갑자기 디스크 장애로 인해 DB가 비정상 종료되었다.
해당 디스크에는 controlfile, redo log file, datafile이 모두 저장된 상황.
디스크를 긴급 교체 후 DB를 복구해야 하는 상황이다.
이 상황을 가정하기 위해 DB 운영중에 모든 controlfile, redo log file, datafile을 삭제하고
로그스위치 및 체크포인트를 발생시켜 DB를 비정상 종료시킨 후 복구과정을 상세히 기술, DB를 복구하여라.

1. 모든 database file 삭제 & log switch & checkpoint

rm /home/oracle/oradata/db1/*

alter system switch logfile;
-- 여러 번 하면 DB 비정상 종료됨.

alter system checkpoint;

2. hot backup본 cp

cp /oracle12/backup/hot_backup/*.dbf /home/oracle/oradata/db1/

3. controlfile 재생성

current redo 는 날라갈 게 뻔하니깐 resetlogs 버전으로.

CREATE CONTROLFILE REUSE DATABASE "DB1" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 (
    '/home/oracle/oradata/db1/redo01.log',
    '/home/oracle/oradata/db1/redo01_2.log'
  ) SIZE 200M BLOCKSIZE 512,
  GROUP 2 (
    '/home/oracle/oradata/db1/redo02.log',
    '/home/oracle/oradata/db1/redo02_2.log'
  ) SIZE 200M BLOCKSIZE 512,
  GROUP 3 (
    '/home/oracle/oradata/db1/redo03.log',
    '/home/oracle/oradata/db1/redo03_2.log'
  ) SIZE 200M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/home/oracle/oradata/db1/system01.dbf',
  '/home/oracle/oradata/db1/sysaux01.dbf',
  '/home/oracle/oradata/db1/undotbs01.dbf',
  '/home/oracle/oradata/db1/users01.dbf'
CHARACTER SET KO16MSWIN949
;

4. recover

current redo가 손상되었기 때문에 until cancel.
controlfile 이용해서 redo log file을 만들어야 하므로 using backup controlfile.

recover database until cancel using backup controlfile

5. DB open

alter database open resetlogs;

[case 3 – 강사님]

1. shutdown immediate

2. archive 모두 삭제

3. cold backup 하기

4. DB open

5. hot backup 하기

6. log switch 5회

7. 데이터 입력

create table scott.recover_test10(no number);
insert into scott.recover_test10 values(1);
commit;
alter system switch logfile;

insert into scott.recover_test10 values(2);exit
commit;
alter system switch logfile;

insert into scott.recover_test10 values(3);
commit;

8. rm controlfile, datafile, redo log file

9. log switch & DB shutdown abort

10. datafile restore

cp /oracle12/backup/hot_backup/*.dbf

11. controlfile 재생성

vi /oracle12/backup/hot_backup/control.sql
-- reset부분 남기도록 수정

> startup nomount
> @/oracle12/backup/hot_backup/control.sql

12. recover

> recover database until cancel using backup controlfile;

13. DB open

> alter database open resetlogs;

Leave a Comment