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 를 체크하였다.
> 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라는 크기만큼 파일이 생성된듯 하다.
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폴더에 파일 갯수가 엄청났다.
하위 폴더에서 확인결과 그누보드의 /data/session폴더에 파일 갯수가 엄청났다.
3. 문제해결
> 세션파일의 경우 현재 필요한 세션이 아닌것이 대부분이다. 주기적인 삭제가 필요하다. 일단 mysql 서비스를 실행하기 위해 rm 명령으로 삭제하자.
001
| > rm -rf -- /session/ * |
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이 구동되었다.
> 파일을 삭제하니 정상적으로 mysql이 구동되었다.
> 세션 파일을 주기적으로 삭제하기 위해 스크립트 파일을 만들어 cron에 등록하도록 하자.
[참고사이트]
http://myblog.opendocs.co.kr/archives/1692
댓글 없음:
댓글 쓰기