내가 필요해서 내가 적는 블로그

JAVA 백엔드 개발자의 기록들

DB

Cause: java.sql.SQLException: Disk full

돌프 2021. 11. 30. 18:15
반응형

### Cause: java.sql.SQLException: Disk full (/tmp/#sql_xxxx_0.MAI); waiting for someone to free some space... (errno: 28 "No space left on device")

 

어플리케이션 단에서 위와 같은 로그 발견시, Mysql/MariaDB 이 생성하는 Temp file 이 위치한 곳의 Disk 용량이 full 상태가 되었다. 

 

TMP? (Oracle PGA와 동일)

 

tmp_table

▶ DB 내부에 위치한 임시 메모리 테이블. 쿼리 실행중 session 혹은 connection이 종료되면 자동으로 삭제가 됨.

 

tmp_file

▶ tmp_table 메모리 설정값을 초과하는 경우 file 로 만들어져서 Disk 로 옮겨짐. 

   위의 로그는 이 파일이 존재하는 곳의 OS상 용량이 부족하다고 발생한 로그이다. 

 

위는 UNIX 환경의 어플리케이션단에서 발생한 로그라서 Windows 상에 위치한 /tmp/#sql_~~~.MAI) 파일을 찾아볼려고 했는데, Windows 계열은 일반적으로 C:\windows\temp\ 아래에 존재한다고 한다. 

출처 : https://dev.mysql.com/doc/refman/8.0/en/temporary-files.html

 

MySQL :: MySQL 8.0 Reference Manual :: B.3.3.5 Where MySQL Stores Temporary Files

B.3.3.5 Where MySQL Stores Temporary Files On Unix, MySQL uses the value of the TMPDIR environment variable as the path name of the directory in which to store temporary files. If TMPDIR is not set, MySQL uses the system default, which is usually /tmp, /v

dev.mysql.com

 

필자의 환경에서는 UDD8B71.tmp 로 추측 된다. UNIX 계열에서의 파일 확장자는 .MAI

 

tmp 파일을 열어 볼 순 없어서 아쉽다. 어쨋든 OS상의 tmpdir로 지정된 곳의 Disk 사이즈를 늘려주니 해결은 되었다. 

 

다른 방법으로,

Q) SHOW PROCESSLIST;

▶ 사용중인 프로세스를 확인하여, STATE 값이 

   Copying to tmp table    - 메모리내 임시 테이블 생성

   Copying to tmp disk    - 디스크내 임시 테이블 생성

둘중 상황에 맞게 thread kill을 하면 임시 조치가 될 듯하다. 

Q) kill 'PID';

 

또 다른 방법으로는

my.cnf 파일에 tmpdir=/기존경로 : /추가경로 중복으로 tmpdir이 지정가능하다. 

* Unix 계열 :  ' : '  콜론 구분

* Windows 계열 : ' ; ' 세미콜론 구분 

 - MySQL 공식 홈페이지에서 본 거 같은데 가물가물하다...ㅠㅠ

 

 

※ 구글을 이리저리 서치해보니,  아래의 쿼리들을 확인해보면 유용할 듯 하다. 

Q) SHOW VARIABLES LIKE 'tmpdir';

▶ tmp_file 위치한 디렉토리 확인

 

Q) SHOW STATUS WHERE VARIABLE_NAME LIKE '%tmp%';

▶ Created_tmp_disk_tables  :  명령문을 실행하는 동안 서버에서 생성한 내부 디스크 상의 임시 테이블 수

▶ Created_tmp_files           :  mysqld가 생성한 임시 파일 수 

▶ Created_tmp_tables        :  명령문을 실행하는 동안 서버에서 생성한 내부 임시 테이블의 수

 

Q) SHOW VARIABLES WHERE VARIABLE_NAME IN('tmp_table_size', 'max_heap_table_size');

▶ 임시 테이블의 사이즈 확인

 

 

 

본문 내용이 도움이 되셨다면, 아래의 공감버튼을 눌러주세요. 

정보 공유를 위한 포스팅에 큰 힘이 됩니다. 

만약 틀린 정보가 있으면 댓글 달아주세요. 수정하도록 하겠습니다. 

읽어주셔서 감사합니다. 오늘도 좋은 하루 보내세요. 

 

반응형