본문 바로가기

IT관련

오라클 Archive Log Full 처리 방법 - 아카이브로그 공간부족 에러 해결

Oracle DBMS 를 운영하는 DBA 들에게 Archive Log 관리는 매우 중요합니다.

이 Archive Log 파일 한개라도 날려먹으면 백업복구가 딱 그 날려먹은 파일전까지만 복구할 수 있어서 장애시 최신상태로 복구가 안되죠~ 정말 중요합니다.

 

Archive Log 때문에 DBA 들이 고생하는 진짜 이유는 Archive Log Full 로 DB가 Hang 걸리는 경우입니다.

거의 모든 DBA 들이 적어도 한번 이상은 다들 경험이 있습니다.

아카이브로그는 DML 작업이 많으면 많이 발생합니다. 그래서 대량 배치작업, ETL 작업 등을 하는 경우에는 반드시 이 Archive Log 디렉토리가 Full 차는지 수시로 체크해야 합니다.

 

이미 Full 차서 DB가 서버린 경우에는 Archive Log 를 함부로 지우면 안되는 것을 알지만, 어쩔 수 없습니다. 선택의 여지가 없죠... 일단 DB는 돌아가야 하기 때문에 지울수 밖에 없습니다. 물론, 다른 여유스토리지가 있으면 그쪽으로 일단 move 할 수도 있습니다.

 

예전에는 파일시스템에 Archive log 가 있었기 때문에 해당 디렉토리로 가서 "rm -f xxxx"  와 같이 지워버리면 그만이었습니다. 아주 Old 버전의 Oracle 에서는 이렇게 지워도 Hang 이 안풀리는 경우가 있었습니다. archive log 프로세스가 죽어서 공간이 확보되었어도 여전히 Archiving 작업을 완료하지 못해서 Hang 이 안풀리는 경우였죠.

이런 경우에는 "alter system archive log start;" 커맨드를 실행해주면 해소되었습니다.

 

요즘은 Oracle DBMS 가 스토리지로 ASM 을 많이 사용합니다.

ASM 의 경우에는 File System 과 달라서 OS 상에서 그냥 보이지가 않죠~

OS 상에서처럼 디렉토리 구조와 File 들을 다루려면, asmcmd 커맨드로 들어가야 합니다.

  

 

위와같이 asmcmd 로 들어가면, 마치 OS 에서 파일을 다루듯이 ls, cd, rm 커맨드를 사용할 수 있습니다.

archive log 도 이런식으로 찾아가서 해당 디렉토리에서 삭제할 수도 있습니다. (물론 권장되는 방법은 아니죠~)

 

archive log 를 삭제하는 권장되는 방법은 RMAN 을 이용하는 것입니다.

 


-- 일단 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;

 

RMAN 접속은 해당 DB 서버에서 "rman target=/" 커맨드로 접속할 수 있습니다.

그러면, 프롬프트가 RMAN> 와 같이 떨어지는데, 여기에서 delete 커맨드로 위에서처럼 삭제하면 됩니다.

위의 경우에는 until time 'sysdate-14' 로 되어있고, 이것은 14일전까지의 archive log 파일들을 delete 하는 커맨드입니다.

 

이렇게 해주면 archive log 파일들이 지워지면서 Hang 상태도 바로 풀립니다.

만약 여전히 DB가 먹통이라면 archive log 가 충분히 지워진 것인지 확인할 필요가 있습니다.

 

예전에는 log_archive_dest 라는 DB파라메타에 디렉토리를 지정해서 아카이브를 관리했었습니다.

요즘은 db_recovery_file_dest 라는 DB파라메타를 이용하고, 이 경우에는 db_recovery_file_dest_size 라는 파라메타를 잘 봐야 합니다.

 

 

아카이브로그 파일이 어떤 디렉토리를 사용하는지는 아래와같이 "archive log list" 커맨드로 확인할 수 있습니다.

 

 

위와같이 USE_DB_RECOVERY_FILE_DEST 라고 나오면, db_recovery_file_dest 를 사용하는 것이고, db_recovery_file_dest_size 에 지정된 크기보다 Archive Log 총 량이 적어야 합니다.

 


SQL>
select round(percent_space_used,2)
from v$flash_recovery_area_usage 
where file_type = 'ARCHIVED LOG';

ROUND(PERCENT_SPACE_USED,2)
---------------------------
                         24

SQL>
select space_limit, space_used, round(space_used/space_limit*100,2)
from v$recovery_file_dest;

SPACE_LIMIT SPACE_USED ROUND(SPACE_USED/SPACE_LIMIT*100,2)
----------- ---------- -----------------------------------
  524288000  125853184                                  24


 

Limit 대비 현재 얼마나 사용하고 있는지는 위와 같이 v$flash_recovery_area_usage 또는 v$recovery_file_dest 뷰에서 조회할 수 있습니다.

현재 24% 를 사용하고 있고, 아직 여유가 많이 있네요. 저게 100% 가 되면 Archive 기록을 하지 못하게 되고, DB가 Hang 걸리는 심장 떨리는 상황이 벌어지게 됩니다.

 

 

만약, 이렇게 Archive 를 기록하지 못하는 상황에서 DB를 내렸다 올리는 경우 DB가 안올라올 수 있습니다. 여전히 Archive log 를 기록하지 못하기 때문입니다. 

 

이때, Archive log 파일들을 지워주거나, 또다른 방법으로 reocverydb_recovery_file_dest_size 의 값을 늘려주는 방법도 있습니다. 그건 아래를 참조하시기 바랍니다.

 

  >> 오라클 DB Startup 에러 db_recovery_file_dest_size 수정 방법

 

 

아래 유튜브 영상도 참조 바랍니다.

 

위 유튜브 영상에서 사용한 스크립트 파일입니다.

Archive Log 디렉토리 Full 났을때 조치방법.txt
0.00MB