IT기술/Oracle

05 Control File 장애 복구

dobbby 2013. 12. 17. 14:18
반응형

5.3 Control File 관련 장애 해결하기


장애유형1. Parameter file 의 경로와 실제 파일 경로가 다른 경우


SYS> shutdown immediate ;

SYS> !


$ vi /app/oracle/product/11g/dbs/inittestdb.ora




parameter file 에는 3개가 있다고 하고 장애를 위해서 control03.ctl 파일을 삭제하겠습니다.


$ rm -f /app/oracle/data3/control03.ctl

$ ls /app/oracle/data3/control03.ctl

ls: /app/oracle/data3/control03.ctl: 그런 파일이나 디렉토리가 없음

$ exit


SYS>startup


에러 발생



Alert Log 파일 확인

$ vi /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log



Database 를 Startup 하면 지정된 경로에서 parameter file 을 찾아서 읽고 인스턴스 생성 등의 작업을 한 후 
parameter file 에 적혀있는 경로대로 control file 을 찾으러 갑니다. 
parameter file의 내용을 수정하거나 control03.ctl 파일을 만들어주면 됩니다.


여기서는 control03.ctl 을 만들도록 하겠습니다.


SYS>select status from v$instance ;

SYS>!cp /app/oracle/data1/control01.ctl /app/oracle/data3/control03.ctl

SYS>alter database mount ;

SYS>alter database open ;




장애유형2. Control File 끼리 내용이 다른 경우


SYS>shutdown immediate ;

Database closed.

Database dismounted.

ORACLE instance shut down.

SYS>! vi $ORACLE_HOME/dbs/inittestdb.ora




3번을 사용 못하게 주석처리 함




SYS>startup ;


SYS>select name from v$controlfile ;


SYS>alter system checkpoint ;


SYS>/

SYS>/

SYS>/

SYS>shutdown immediate ;




다시 사용하게 설정

SYS>!vi $ORACLE_HOME/dbs/inittestdb.ora




SYS>startup ;




Control File 끼리 버전이 달라서 에러가 난다.

번호가 큰 파일이 최신이기 때문에 큰 파일을 작은 파일로 덮어쓰면 된다.


SYS>!cp /app/oracle/data1/control01.ctl /app/oracle/data3/control03.ctl

SYS>alter database mount ;

SYS>alter database open ;

SYS>select name from v$controlfile ;





장애유형3. old control file / control file 삭제됨 / incarnation  에러


이번에는 control file 관련 장애 중에서 가장 위험하고 어려운 경우로서 DBA 가 control file 관리를 잘못해서

startup 시에 old control file 에러가 발생하거나 

혹은 다중화가 잘못되어서 control file 전체가 삭제되는 장애를 다루도록 하겠습니다.


STEP1 장애 상황 발생 (old control file 에러 발생할 경우)


SYS>select name from v$controlfile ;

SYS>shutdown immediate ;

SYS>!




$ vi $ORACLE_HOME/dbs/inittestdb.ora

3번 사용못하게 주석처리




$ exit

SYS>startup

SYS>select name from v$controlfile ;


SYS>alter system checkpoint ;

SYS>/

SYS>/

SYS>/

SYS>/

SYS>/

SYS>shutdown immediate ;

SYS>!




$ vi $ORACLE_HOME/dbs/inittestdb.ora

다시 사용 가능하게 수정




[oracle@server108 ~]$ exit

SYS>startup


SYS>!cp /app/oracle/data3/control03.ctl /app/oracle/data1/control01.ctl

SYS>alter database mount ;


SYS>!cp /app/oracle/data1/control01.ctl /app/oracle/data2/control02.ctl

SYS>alter database mount ;


SYS>alter database open ;




위 에러의 원인은 control file 의 체크포인트 정보가 data file 의 체크포인트 정보보다 예전 내용이기 때문입니다.

이 문제를 해결하는 방법은 3가지가 있는데

using backup controlfile 옵션으로 recovery 하는 것으로 , 

이 방법이 불가할 경우 부득이하게 control file 을 재생성해야 합니다.

control file 을 재생성하는 대표적인 경우는 아래와 같습니다.


1. control file 이 전부 삭제되었을 때

2. old conctrol file 에러 발생시

3. DB name 을 변경하고 싶을 때

4. 최대 데이터 파일 개수와 리두 로그 파일 개수를 변경하고 싶을 때


old control file 장애 해결방법은 아래 3가지 case 로 구분됩니다.


case1. 현재 data file, redo log file 에 이상이 없을 경우 - 재생성 - noresetlogs 로 복구

case2. 현재 data file, control file 에 이상이 있고 data file 백업 있을 경우 - using backup controlfile 로 복구

case3. 현재 data file, redo log file 에 이상이 있거나 data file 백업 없을 경우 - 재생성 resetlogs 로 복구


한가지씩 실습하겠습니다.



case1. 현재 data file, redo log file 에 이상이 없을 경우 - 재생성 - noresetlogs 로 복구


미 old control file 이 나온 경우는 실습 3번과정부터 하면 됩니다.


STEP3 control file 을 재생성해보겠습니다.

control file 을 재생성하려면 no mount 상태에서 db를 재생성하는 명령어를 입력하면 되는데

이 명령어가 너무 길어서 스크립트로 만들어서 생성하는 방법을 보여주겠습니다.


control file 을 재생성하는 스크립트는 현재 old control file 로부터 trace 해서 만들며 아래의 방법으로 하면 됩니다.

이 방법은 현재의 control file 의 정보를 사용해서 재생성하는 것으므로 mount 상태에서 수행해야 합니다.




Control File  을  다시  만들  수  있는  스크립트인  /app/oracle/re11.sql  파일을  열어보겠습니다.

위  파일에  내용이  상당히  많은데  크게  나누어  보면  NORESETLOGS  Mode  로  생성하는  스크립트  부분과  

RESETLOGS  Mode  로  생성하는  부분으로  나눌  수  있습니다.  

Control  File  을  생성할  때  가장  중요한  부분은 

현재  생성하는  Control  File  이  NORESETLOGS  용인지  RESETLOGS  용인지  구분을  하시는  것입니다. 

 이  사항을  구분할  때  가장  중요한  기준은  Redo Log File  의  손상  유무입니다. 

즉  장애가  발생해서  Control  File  을  다시  만들어야  하는데  Redo  Log  File까지  문제가  있다면  RESETLOGS 용으로  생성해야  합니다.

그러나  Redo  Log  File  에  문제가  없을  경우에는  NORESETLOGS  용으로  생성하면  됩니다. 


생성된  스크립트  파일에서  각  모드  별로  필요한  부분만  남기고  나머지는  전부  삭제한  후  

다른  파일로  저장 한  후에  shutdown  상태에서  새로  만든  스크립트를  실행해서  Control File  을  다시  생성하겠습니다. 

아래  스크립트에서  --(하이픈  두개)  부분은  주석이라는  의미입니다. 






SYS>shutdown immediate ;

SYS>@/app/oracle/re11.sql

SYS>alter database open ;

SYS>select name from v$controlfile ;


복구 완료



Case 2 현재 data file, control file 에 이상이 있고 백업 파일이 있을 경우 - using backup controlfile 로 복구 수행
이번 상황은 control file 에 문제가 발생했는데 data file까지 문제가 발생한 경우를 가정해서 복구해보겠습니다.
복구 작업은 백업되어 있는 data file 을 전부 복원하고 control file 을 재생성해서 복구하게 됩니다.
control file 을 재생성 하기 때문에 using backup controlfile 이란 옵션을 주고 복구해야 합니다.

STEP1 현재 상태를 전체 백업 수행

SYS>select name from v$datafile ;
SYS>select name from v$controlfile ;
SYS>select member from v$logfile ;

SYS>shutdown immediate ;
SYS>!
$ cp /app/oracle/oradata/testdb/* /data/backup/close/



$ vi $ORACLE_HOME/dbs/inittestdb.ora

컨트롤 파일 3번 사용안함으로 처리



SYS>startup

SYS>alter system checkpoint ;
SYS>/
SYS>/
SYS>/
SYS>/



$ vi $ORACLE_HOME/dbs/inittestdb.ora

다시 3개 모두 사용하게 설정



SYS>startup ;

SYS>!cp /app/oracle/oradata/testdb/control03.ctl /app/oracle/oradata/testdb/control01.ctl
SYS>alter database mount ;

SYS>!cp /app/oracle/oradata/testdb/control01.ctl /app/oracle/oradata/testdb/control02.ctl
SYS>alter database mount ;

SYS>alter database open ;

에러 발생




STEP3 백업 데이터 파일 복원 후 복구 시작


SYS>shutdown immediate ;


데이터 파일만 복원함

SYS>!cp /data/backup/close/*.dbf /app/oracle/oradata/testdb/

SYS>startup mount ;

SYS>recover database until cancel using backup controlfile ;

auto


SYS>alter database open resetlogs ;

오픈 됨



Case3 현재 data file, redo log file 에 이상이 있고 백업 파일이 없을 경우 재생성 - resetlogs 

이번에는 현재 사용 중이던 control file 과 redo log file 에 장애가 발생한 후 비정상 종료되었는데 

백업된 dataf file 이 없어서 사용중이다가 비정상 종료되어 checkpoint 정보가 서로 다른 data file 을 사용해서

긴급 복구 해야 하는 경우를 살펴보겠습니다. 

이 실습의 핵심은 'data file 끼리 checkpoint 정보가 다를 경우 어떻게 복구하느냐 ' 입니다.


STEP1 현재 상태 확인




STEP2 장애 상태 만들기


SYS>create table scott.tt550 (no number) ;

SYS>insert into scott.tt550 values (1) ;

SYS>insert into scott.tt550 values (2) ;

SYS>commit ;


SYS>shutdown abort ;


모든 redo log file 삭제

SYS>!rm -fr /app/oracle/oradata/testdb/*.log


모든 control file 삭제

SYS>!rm -fr /app/oracle/oradata/testdb/*.ctl


SYS>startup




STEP3 백업된 control file 복원


SYS>shutdown abort ;

SYS>!cp /data/backup/close/*.ctl /app/oracle/oradata/testdb/

SYS>startup

장애 발생


SYS>alter database backup controlfile to trace as '/app/oracle/re12.sql' ;

SYS>shutdown abort ;




SYS>!vi /app/oracle/re12.sql

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "TESTDB" RESETLOGS  ARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 292

LOGFILE

  GROUP 1 (

    '/app/oracle/oradata/testdb/redo01_a.log',

    '/app/oracle/oradata/testdb/redo01_b.log'

  ) SIZE 50M BLOCKSIZE 512,

  GROUP 2 (

    '/app/oracle/oradata/testdb/redo02_a.log',

    '/app/oracle/oradata/testdb/redo02_b.log'

  ) SIZE 50M BLOCKSIZE 512,

  GROUP 3 (

    '/app/oracle/oradata/testdb/redo03_a.log',

    '/app/oracle/oradata/testdb/redo03_b.log'

  ) SIZE 50M BLOCKSIZE 512

DATAFILE

  '/app/oracle/oradata/testdb/system01.dbf',

  '/app/oracle/oradata/testdb/sysaux01.dbf',

  '/app/oracle/oradata/testdb/undotbs01.dbf',

  '/app/oracle/oradata/testdb/users01.dbf',

  '/app/oracle/oradata/testdb/example01.dbf'

CHARACTER SET KO16MSWIN949

;




SYS>@/app/oracle/re12.sql

SYS>alter database open resetlogs ;



위 에러 메시지는 DB 가 종료될 때 shutdown abort 로 비정상 종료되어 데이터 파일끼리 checkpoint 정보가 동기화되지 않아서

resetlogs 옵션으로 open 할 수 없으니 복구하라는 내용입니다.

그러나 현재 모든 redo log file 이 삭제되었으므로 복구할 수 없는 상황입니다.


이럴 경우 강제로 data file 끼리 checkpoint 정보를 동기화 시켜서 open 시키는 hidden parameter 를 사용해야 합니다.

단, 이 parameter 는 아주 위험하기 때문에 사용하는 것을 권장하지 않고 그 결과를 책임지지도 않습니다.

부득이 하게 사용할 경우라도 모든 책임은 스스로에게 있음을 알려 드립니다.


초기화 파라미터 파일에 아래와 같은 파라미터를 설정한 후 DB를 재시작하면 됩니다.


SYS>shutdown immediate ;


$ vi $ORACLE_HOME/dbs/inittestdb.ora


_allow_resetlogs_corruption=true







종합복구01 백업파일이 close backup 일 경우

data file, redo log file, control file 이 모두 소실되었고

어제 백업받았던 data file 과 2개월 전 백업 받았던 control file 밖에 없을 때 복구


복구 작업은 임시 디렉토리에서 실시

$ mkdir /data/temp/imsy

cp /data/backup/close/*.dbf /data/temp/imsy/

cp /data/backup/close/*.ctl /data/temp/imsy/


SYS> alter database backup controlfile to trace as '/home/oracle/recon.sql';

SYS> !

vi recon.sql

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "TESTDB" RESETLOGS ARCHIVELOG

...

LOGFILE

GROUP 1 '/data/temp/imsy/redo01.log' SIZE 5M,

...

DATAFILE

'/data/temp/imsy/system01.dbf',

...

log file 과 data file 의 경로를 임시로 지정합니다.


exit

SYS> @/home/oracle/recon.sql

SYS> select name from v$datafile ;

SYS> alter database open resetlogs ;

이 실습의 핵심은 data file 과 checkpoint SCN 의 정보가 다른 old control file 을 이용해서

어떻게 현재 data file 을 복구해 내느냐 입니다.



종합복구02 백업 파일이 hot backup 일 경우

data file, redo log file, control file 이 전부 삭제 되었고

1주일 전 hot backup 으로 받아둔 data file

6개월 전 받아둔 control file 이 있습니다.

SQL> !

cp /data/backup/open/*.dbf /home/oracle/oradata/testdb/

cp /data/backup/close/*.ctl /home/oracle/oradata/testdb/

exit

SQL> startup

SQL> alter database backup controlfile to trace as '/home/oracle/re.sql' ;

SQL> shutdown immediate ;

Redo log file 이 삭제 되었으므로 resetlogs 모드로 생성해야 합니다.

$ vi /home/oracle/re.sql

STARTUP NOMOUNT

CREATE CONTROLFILE REUSE DATABASE "TESTDB" RESETLOGS ARCHIVELOG

...

$ exit

SQL> @re

SQL> alter database open resetlogs ;

data file 끼리 checkpoint 정보가 달라 파일을 복구하라는 메시지가 나옵니다.

SQL> recover database using backup controlfile ;        ← recovery 시도

SQL> alter database open resetlogs ;

여전히 복구가 안됨

SQL> shutdown immediate ;

SQL> !

data file 끼리 checkpoint 정보를 동기화하기 위해서는 redo log file 이 있어야 하는데 

모든 redo log file 이 삭제된 상태이므로 복구할 수 없게 되었습니다.

어쩔 수 없이 data file 끼리 checkpoint 정보가 달라도 open 을 허용하라는 hidden parameter 를 사용하여야 합니다.

vi product/10g/dbs/inittestdb.ora        ← _allow_resetlogs_corruption=true 추가

exit

SQL> startup mount ;

SQL> alter database open resetlogs ;

이렇게 강제 open 하면 data 정합성이 깨집니다. 그리고 과거 백업 받았던 파일은 사용할 수 없으니

open 한 후 다시 정상 종료 후 전체 백업을 수행하여야 합니다.


RESETLOGS CASE 로 사용될 Control file 을 재생성할 때는 모든 Redo log file 에 관련된 정보들은 초기화 되고

반면에 모든 Data file 의 정보는 전부 필요로 한다는 것입니다.

그렇기 때문에 NORESETLOGS CASE 일 경우는 반드시 control file 재생성 스크립트에

Online Redo log file 이 전부 있어야 하고

Data file 도 전부 있어야 하지만

RESETLOGS CASE 일 경우엔 Data file 만 있으면 됩니다.




반응형