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 수정 방법
아래 유튜브 영상도 참조 바랍니다.
위 유튜브 영상에서 사용한 스크립트 파일입니다.
'IT관련' 카테고리의 다른 글
v$datafile 에서 unrecoverable_time 컬럼 - Nologging 작업으로인한 복구 불가 문제 (0) | 2020.01.15 |
---|---|
Oracle 데이터베이스 클라이언트 - Instant Client 다운로드/설치 (2) | 2020.01.14 |
오라클 리스너 TNS Easy Connect - SQL*Net 을 통한 DB접속 방법 (0) | 2020.01.10 |
Oracle 무료 DB관리툴 SQL Developer - DB 접속 방법 (SSH 터널링 Connection 세팅) (0) | 2019.12.30 |
오라클DB 무료 성능측정툴 SwingBench (스윙벤치) - 데이터 생성 (0) | 2019.12.24 |