Database/Oracle B&R2011.04.13 03:21


ORA-16038 ERROR에 관한 조치


made by 도익


필자가 scott계정에 데이터 100만건을 들이 붓다가 꾸질스런 컴퓨터가 이를 감당하지 못하고 그만 모래시계를 띄웠다.


                                                                         (It's 모래시계)


너무 오래 걸리기에 창을 닫아 버렸는데 다음부터 scott계정은 열리지 않았다.
다행히도 sysdba계정은 올라가기에 그 후 필자는 scott계정의 session을 죽이려고 scott session과 관련한 검색을 하는 족족 모래시계를 볼 수 있었다.
scott계정 없이는 살 수 없는 필자는 DB를 abort 옵션으로 내리기로 결정했다.

그리고는 다시 올렸다.


필자의 꾸질스런 컴퓨터로 인해 100만건의 데이터에 관한 로그를 기록하다 장렬하게 전사하셨다.
한마디로 리두로그 117번 시퀀스부터 아카이브되지 않고 손실되었다는 이야기이다.
리두로그 파일에 문제가 있기에 우선 MOUNT단계까지밖에 올라가지 않았다
(parameter file : nomount, control file : mount, redo log file과 datafile : open)

이와 같은 경우 복구파일 쪽에 손실이 있기에 불완전 복구를 수행해야 한다(현재 시점까지는 복구 할 수 없고, 과거의 어떤 시점까지만 복구 가능하다는 말 - 과거 어떤 시점까지의 archive log가 있어야 가능하다. 이런 문제가 언제 터질지 몰라 필자는 언제나 archive mode를 유지한다.)

그러면 여기서 복구를 시작 해 보자(cancel 기반 recover)
SQL>recover database until cancel;

그리고 로그시퀀스를 초기화 시키면서 DB를 다시 OPEN시켜보자.
SQL>alter database open resetlogs;



일단 DB가 올라왔다.


DB가 올라 왔으니 로그 시퀀스 번호를 확인 해 보자.

SQL>archive log list
or
SQL>select group#, sequence# from v$log;
(v$log 뷰로도 로그 시퀀스 확인이 가능하다.)

 


로그 시퀀스가 초기화 되었음을 알 수 있다.


다시 확인 해 보자.
SQL>select group#, sequence#, status from v$log;
(리두 로그 그룹, 로그 시퀀스, 현재 상태 순으로 출력했다)

 



그러면 망가졌던 3번 리두로그파일을 로그스위치를 이용하여 한번이라도 쓰고 종료해보자.
SQL>alter system switch logfile; (필자는 언제 만들었는지 리두로그 그룹이 3개이다. 3번으로 가도록 여러번 쳐준다)


scott계정을 확인 해 보자.
SQL>conn scott/tiger
SQL>select * from tab;



A테이블에 100만건 들이붓기 바로 전 시점으로 돌아 가 있다(테이블만 만든 상태의 시점).
다음부터 100만건 붓지말자.


Copyright 김도익 All rights reserved.

Posted by 차칸소년