背景:
数据库链接不上,报错:
root@localhost:/var/log/mysql# mysql -uzjy -p -h192.168.1.111 --default-character-set=utf8 -P3306
Enter password:
ERROR2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0
分析方法:
在这个地方我看不出什么,直接看错误日志:
[ERROR] /usr/sbin/mysqld: Can't open file:'./java/tt_fte.frm'(errno: 24)
root@localhost:/var/log/mysql# perror 24OS error code24: Too many open files
一看到这里,就觉得需要调整 open_files_limit 参数了(默认最小1024),至此问题解决。虽然问题解决了,但是还没有弄清楚MySQL打开了多少个文件描述符,打开了哪写文件描述符号,以及如何预防。怎么了解MySQL打开了多少个文件描述符呢?
知识点:用lsof去查看,理解myisam和innodb的文件描述符、OS 的ulimit相关认识。
基于上面的问题,现在来分析(此时数据库就连不上了,一直报无法打开的错误信息)查看MySQL打开的文件:
root@localhost:~# lsof -p 26288 | wc -l1042#因为数据库链接不了,所以只能通过系统查看他的文件描述符
root@localhost:~# cat /proc/26288/limits
Limit Soft Limit Hard Limit Units
Max cputimeunlimited unlimited seconds
Maxfilesize unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size8388608unlimited bytes
Max corefile size 0unlimited bytes
Max resident set unlimited unlimited bytes
Max processes79877 79877processes
Max open files1024 4096files
Max locked memory65536 65536bytes
Max address space unlimited unlimited bytes
Maxfilelocks unlimited unlimited locks
Max pending signals79877 79877signals
Max msgqueue size819200 819200bytes
Maxnice priority 0 0Max realtime priority0 0Max realtime timeout unlimited unlimited us
也可以通过下面的方法查看,下面的方法最为精确
root@localhost:~# ls -lh /proc/26288/fd | wc -l
1024
上面看出,MySQL这时打开的文件描述符1024,已经达到上限,所以再打开的时候就报错了。修改open_files_limit 参数,设置为2000试试?
root@localhost:~# lsof -p 27732 | wc -l1053root@localhost:~# cat /proc/27732/limits
Limit Soft Limit Hard Limit Units
Max cputimeunlimited unlimited seconds
Maxfilesize unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size8388608unlimited bytes
Max corefile size 0unlimited bytes
Max resident set unlimited unlimited bytes
Max processes79877 79877processes
Max open files2000 2000files
Max locked memory65536 65536bytes
Max address space unlimited unlimited bytes
Maxfilelocks unlimited unlimited locks
Max pending signals79877 79877signals
Max msgqueue size819200 819200bytes
Maxnice priority 0 0Max