linux 에 파일이 만들어 지지 않을 경우

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. 문제확인

> 임시파일을 생성할 수 없다는 에러 문구로 보아 디스크 용량 부족을 체크하였다.
?
001
002
003
004
005
006
007
> 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 를 체크하였다.
?
001
002
003
004
005
006
007
> 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라는 크기만큼 파일이 생성된듯 하다.
시스템에서 이정도로 많은 파일을 생성하지는 않을 듯하여 서비스 중인 폴더를 체크하였다.
?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
> 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 나 된다.
하위 폴더를 검색하자
?
001
002
> for i in /home/*; do echo $i; find $i |wc -l; done
...
대체적으로 간단한 홈페이지를 만들기위해 사용된 그누보드에서 파일갯수가 많다. 아마도 세션파일이나 캐싱 파일로 짐작된다.
하위 폴더에서 확인결과 그누보드의 /data/session폴더에 파일 갯수가 엄청났다.

3. 문제해결

> 세션파일의 경우 현재 필요한 세션이 아닌것이 대부분이다. 주기적인 삭제가 필요하다. 일단 mysql 서비스를 실행하기 위해 rm 명령으로 삭제하자.
?
001
> rm -rf --/session/*

> -bash: /bin/rm: Argument list too long 라는 에러가 발생한다. 파일 갯수가 너무많아 한번에 삭제가 불가능한 것이다.
?
001
002
003
004
005
> rm -rf --/session/sess_0*
> rm -rf --/session/sess_1*
> rm -rf --/session/sess_2*
> rm -rf --/session/sess_3*
...
> ls로 파일명을 확인하여 패턴에 따라 삭제하였다.
> 파일을 삭제하니 정상적으로 mysql이 구동되었다.
> 세션 파일을 주기적으로 삭제하기 위해 스크립트 파일을 만들어 cron에 등록하도록 하자.

[참고사이트]
http://myblog.opendocs.co.kr/archives/1692