본문 바로가기

IT관련

오라클 DB Startup 에러 ORA-03113, ORA-19815, ORA-19809, ORA-19804, db_recovery_file_dest_size

Oracle DB를 기동하다가 갑자기 안되는 경우가 있습니다.

평소에는 잘 기동되었던 DB인데... 이게 뭔일??

 

 

startup 하면 mount 까지는 잘 되었는데, open 하면서 ORA-03113 에러가 발생했습니다.

이런 경우는 alertlog 를 확인해 봐야 겠죠?

 

 

alert log 에는 에러가 훨씬 많고 자세하네요. ORA-19815, ORA-19809, ORA-19804 ...

db_recovery_file_dest_size 어쩌고 저쩌고 나옵니다.

 

recovery_file 은 archive log 를 말합니다.  archive log 가 쌓이는 공간이 Full 이 났다는 얘기입니다.

DB가 Startup 되기전에 db_recovery_file_dest 에 뭔가를 더 Writing 해야 하는데, 이 공간이 꽉 차서 못올라오는 것입니다.

 

그럼, 조치는 매우 간단하죠~

1) db_recovery_file_dest 에 잔뜩 쌓인 archive log 파일들을 지워주던가,

2) db_recovery_file_dest_size 값을 늘려주면 됩니다.

 

 

과거에는 1) 번 방식으로 해서 archive log 파일만 지워주면 DB가 잘 올라왔었습니다.

하지만, 이제는 RMAN 에서 archive log 파일들을 지워줘야 합니다.

그런데, 이게 DB가 올라오지 않으면 또 안되는 ... 컥~ 이런쉣;; 

 

결국 2) 번 방식으로 해야 합니다.

 

근데, 2) 번 방식으로 하는 것도 쉽지는 않습니다.

파라메타 파일을 수정해줘야 하는데, spfile 인 경우 좀 복잡합니다.

Oracle 파라메타 파일이 spfile(바이너리) 과 init file(텍스트) 형태가 있습니다.

spfile 은 바이너리라 그냥 vi 로 수정하면 안됩니다.  이걸 init file 형태로 고쳐서 수정해줘야 합니다.

 

아래처럼, "create pfile from spfile; " 커맨드를 실행하면 DB가 떠 있든 말든.. spfile 을 읽어서 pfile 을 만들어줍니다.

 

 

그러면, 만들어진 init 파라메타 파일을 열어서 수정해주면 됩니다.

저는 4560m => 4660m 로 100MB 를 늘려줬습니다. 이렇게 해도 부족한 경우 좀 많이 늘려주시면 됩니다.

 

 

이제 변경된 pfile 로 Startup 해야 합니다. 그냥 Startup 하면 이전 spfile 로 기동되기 때문에 말짱 황~~

 

 

DB가 올라왔습니다. 성공!!

 

하지만, 이대로 놔두면 안되고...  작업해줘야 할 것들이 남아 있죠~~

일단, pfile 을 썼기 때문에... 예전처럼 spfile 로 다시 바꿔줄 필요가 있겠죠..

그리고, archive log 를 좀 정리해줘야 겠죠... 그대로 놔두면 또 금방 Full 찰거니까... 

 

앞에서는 DB가 기동되지 않았기 때문에 RMAN 실행이 불가능했지만...

이제는 DB가 기동되었기 때문에 RMAN 에서 archive log 를 지울 수 있습니다.

 

아래처럼 지워면 됩니다.

 


-- 일단 RMAN 으로 접속
$ rman target=/

-- 14일 이전꺼는 모두 삭제
-- (이렇게 해도 Archive log 양이 너무 많으면 -7, -1 와 같이 더 많이 지워주면 됩니다.)
RMAN> delete noprompt archivelog until time 'sysdate-14' all;

-- RMAN 카탈로그에서 지워진 archivelog 정보 삭제
-- (이건 꼭 안해도 됩니다. 보통 위 delete 만 하면 됩니다. 아래는 RMAN 카탈로그 정보를 정리해주는 겁니다.)
RMAN> crosscheck archivelog all;
RMAN> delete noprompt expired archivelog all;

 

다시는 이런 에러를 안만날려면 수시로 db_recovery_file_dest 여유공간을 감시해줄 필요가 있습니다.

그건 여기를 참고하세요. => db_recovery_file_dest_size 와 여유공간(free) 체크