본문 바로가기

데이터 사이언스 DataScience/Data Base 데이터베이스

[Oracle] 여유 공간이 있는데 df 에서는 없다고 나올 때 (ORA-19502)

반응형

0. 결론부터

 - 리눅스 서버에서 df (disk free) 명령어를 통한 여유공간 확인은 실제와 다를 수 있다.

 

 - du (disk usage)를 통해 디렉토리가 차지하는 실제 크기를 확인하는게 정확하다. 

 

 - lsof 폴더명 | grep deleted를 통해 삭제된 파일을 잡고있는 프로세스 id를 찾아서,

   kill -9 프로세스 id를 통해 df 에 실제 여유공간을 반영할 수 있다. 

 

 

1. 문제상황

1) DB 서버 환경

 - OS : RHEL 7.6

 - DBMS 버전 : 19c

 - ASM이 아닌 Datafile을 사용하는 DB

 

2) 문제 발생

 - 기존에 사용하던 테이블스페이스를 DROP, datafile을 반환

DROP TABLESPACE 테이블스페이스이름 INCLUDING CONTENTS AND DATAFILES;

- 서버에서 데이터파일의 위치한 곳을 ls -l로 확인했더니 삭제 완료

- 서버에서 du -sk 디렉토리를 확인했을때 줄어든 사용량 확인

 

- 삭제한 데이터파일을 통해 새로운 테이블 스페이스를 생성하려고 했더니 ORA 에러 발생

-- 실행한 명령어 : 테이블스페이스에 데이터파일 추가, 서버에서 du -sk 를 통해 용량 확보 확인
ALTER TABLESPACE 테이블스페이스이름 ADD DATAFILE '/테이터파일이름' SIZE 용량;

-- 발생한 에러
ORA-19502: 파일 "/데이터파일", 블록 번호 510592(블록 크기=8192)에 쓰기 오류가 있습니다.
ORA-27072: 파일 I/O 오류
Linux-x86_64 Error:28: No space left of device

- 서버에서 df -h 를 통해 남은 용량을 확인했더니 용량이 줄어들지 않은 상황

 

 

2. 원인분석 & 조치

1) df의 문제점 :

 df는 서버에 마운트된 모든 file system과 disk를 빠르게 확인해주는 대신,

전체적으로 요약하기 때문에 정확하지 않을 수 있다. 

 

2) du의 정확성 : 

  du는 디렉토리의 정확한 스냅샷을 확인한다. 

The du command is a much more accurate snapshot of a given directory or subdirectory.

출처 : https://www.redhat.com/sysadmin/du-vs-df

 

3) Oracle DB가 영향을 받은 이유 

① 서버의 df 명령어가 파일 삭제를 인지하지 못한 이유 : 

 DROP TABLESPACE로 실제 서버에서 Datafile은 삭제했지만 lsof와 ps -ef를 통해 확인했을때,

약 30분 경과 후에도 서버에서 프로세스는 여전히 실행 중이었다.

-- lsof 확인했을 때의 서버 로그

$ lsof /폴더이름 | grep deleted
oracle_30    30257         Oracle계정명     [중간생략]    데이터파일 이름 (deleted)
             ↑ 프로세스 id

버그인지 다른 이유가 있는지 모르겠지만, 

datafile을 삭제한 프로세스가 실행 중이었기 때문에, df 입장에서는 여유공간으로 잡기 어렵다.

 

② Oracle DB에서 datafile을 추가하지 못한 이유 : 

 실제 물리적인 여유공간은 존재했지만, 데이터파일을 추가했더니 ORA-19502, ORA-27072 에러가 발생했다.

 

데이터파일 추가시 서버의 여유공간을 빠르게 확인해야하므로 df를 통해 여유공간을 확인했을 것이고, 

이때는 여유공간이 부족한 것으로 인식해 새로운 공간을 할당할 수 없었다.

 

 

4) 해결방법 : 

lsof를 통해 찾아낸 프로세스를 kill 했더니, df에서 바로 삭제된 공간을 여유공간으로 인식했다.

kill -9 프로세스 id

바로 DB에서 데이터파일 추가가 가능했다.

 

이때 DB는 실행 중이었으며, datafile을 삭제한 프로세스 kill 했을 때 영향도는 없었다.

 

 

* 참고한 내용

https://www.redhat.com/sysadmin/du-vs-df

https://access.redhat.com/solutions/9492

https://finance-it.tistory.com/99

반응형