1. 문제상황
> 여러 사이트를 운영중인 서버에서 mysql이 stop 되어 start를 시도 하였으나 다음과 같은 에러가 발생하며 시작되지 않았다.
Can't create/write to file '--/mysql/tmp/ibSAi4kh' (Errcode: 28 - No space left on device) InnoDB: Error: unable to create temporary file; errno: 28 InnoDB: Assertion failure in thread 140119057037088 in file lock0lock.cc line 620
2. 문제확인
> 임시파일을 생성할 수 없다는 에러 문구로 보아 디스크 용량 부족을 체크하였다.
> df Filesystem 1K-blocks Used Available Use% Mounted on /dev/mapper/VolGroup-lv_root 15971272 8504680 6648624 57% / tmpfs 508116 0 508116 0% /dev/shm /dev/xvda1 487652 48917 413135 11% /boot /dev/xvdb 82438832 22826180 55418348 30% /data
디스크 용량은 문제가 없어보인다.
> Inodes 를 체크하였다.
> df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/VolGroup-lv_root 1024000 1023999 1 100% / tmpfs 127029 1 127028 1% /dev/shm /dev/xvda1 128016 44 127972 1% /boot /dev/xvdb 5242880 257 5242623 1% /data
IUse% 가 100%가 되어 “No space left on device”에러가 발생한 것으로 보인다.
inode는 파일마다 하나씩 부여되는데 가득차서 더이상 파일을 생성할 수 없게 된다. 그렇다면 1024000라는 크기만큼 파일이 생성된듯 하다.
시스템에서 이정도로 많은 파일을 생성하지는 않을 듯하여 서비스 중인 폴더를 체크하였다.
> for i in /*; do echo $i; find $i |wc -l; done /bin 92 /boot 35 /data 248 /dev 564 /etc 1353 /home 899792 /lib 6235 /lib64 490 /lost+found 1 /media 1 /mnt 1 /opt 3925 /proc 35597 /root 27 /sbin 232 /selinux 1 /_Service 268 /srv 1 /sys 4257 /tmp 775 /usr 50693 /var 4580
home폴더의 파일갯수가 무려 899792 나 된다.
하위 폴더를 검색하자
> for i in /home/*; do echo $i; find $i |wc -l; done ...
대체적으로 간단한 홈페이지를 만들기위해 사용된 그누보드에서 파일갯수가 많다. 아마도 세션파일이나 캐싱 파일로 짐작된다.
하위 폴더에서 확인결과 그누보드의 /data/session폴더에 파일 갯수가 엄청났다.
3. 문제해결
> 세션파일의 경우 현재 필요한 세션이 아닌것이 대부분이다. 주기적인 삭제가 필요하다. 일단 mysql 서비스를 실행하기 위해 rm 명령으로 삭제하자.
> rm -rf --/session/*
> -bash: /bin/rm: Argument list too long 라는 에러가 발생한다. 파일 갯수가 너무많아 한번에 삭제가 불가능한 것이다.
> rm -rf --/session/sess_0* > rm -rf --/session/sess_1* > rm -rf --/session/sess_2* > rm -rf --/session/sess_3* ...
> ls로 파일명을 확인하여 패턴에 따라 삭제하였다.
> 파일을 삭제하니 정상적으로 mysql이 구동되었다.
> 세션 파일을 주기적으로 삭제하기 위해 스크립트 파일을 만들어 cron에 등록하도록 하자.