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
'데이터 사이언스 DataScience > Data Base 데이터베이스' 카테고리의 다른 글
[Oracle] 파티션 이름 변경 (subpartition 포함) (0) | 2022.05.15 |
---|---|
[Oracle] CDC 대상 테이블 선별 기준 (0) | 2022.05.15 |
[Oracle] DBMS_JOB 실행 중 row lock contention 발생 (0) | 2022.03.02 |
[Oracle] LOB보다 TABLE 용량이 더 큰 이유 (0) | 2022.02.03 |
[MySQL] DB 이중화 1) Replication (0) | 2022.01.28 |