今天,莫名其妙的來了個mysql 2013錯誤,導致無法登陸mysql gui工具,而且dos也進不去,提示ping 127.0.0.1,百度+google后:
這是在使用 mysql 的過程中,困擾我很久的一個問題,今天終於找到根本原因,得以徹底解決,真是可喜可賀啊!下面詳細地總結一下:
問題描述:在使用 mysql 的過程中發現,偶爾的查詢或一段時間內的登錄會失敗,返回的錯誤提示信息為:Lost Connection During Query。
問題定位:這個問題在半年、甚至一年前都遇到過,由於它不是必現,往往你去看的時候沒法重現,並且一個 mysql server 管理好多個數據庫,查詢又不是時刻發生的,常常不知所措。無法登錄時,更是束手無策。最初,比較粗暴的方法是重啟 mysql,問題在一段時間內能緩解。后來,使用 flush tables 也能在一段時間內緩解。再后來,通過查看 mysql 的錯誤日志,發現一共有三種提示信息:第一種:080724 19:55:05 [ERROR] Error in accept: Too many open files,這種明顯是由於 mysql 打開文件個數過多,mysql 無法再“接收”新的連接進來,也就是沒有辦法登錄,造成連接失敗。第二種:080724 19:45:11 [ERROR] /usr/local/mysql/bin/mysqld: Sort aborted,這種是放棄了排序,但沒有說明原因。第三種:080725 9:30:33 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: 'OperateRecord.MRG' (errno: 24),這種是打開文件失敗,錯誤碼是24,通過 perror 查詢詳細的錯誤原因是:OS error code 24: Too many open files,也是打開文件過多。再通過 status 查看 mysql 的打開文件個數,此時一般都接近 1000 個。再通過 show variables 查看 mysql 的配置,默認其打開文件個數為 open_files_limit 為 2048,按道理說這個大小是足夠的。
問題解決:
1、重啟mysql服務,解決問題,如果沒有解決,參考第二條(我自己這樣搞解決了)
原來 mysql 中的 open_files_limit 只是限制 mysql 這個進程打開的最大文件個數。而內核也會對 mysql 打開的進程數進行限制,並且優先級要高。通過 ulimit -a 查看 mysql 這個用戶的最大打開文件個數,發現其值為 1024(linux 默認都是1024)。原來,mysql 已經打開了近 1000 個表,若再打開一個 merge 表(包含100個子表),導致文件句柄過多而失敗。通過修改 /etc/security/limits.conf 配置文件,添加如下行:* - nofile 4096,把該限制放大,重新啟動 mysql ,問題得到徹底解決。
設置 mysql 打開文件限制方法:把 set-variable=open_files_limit=10240 加到配置文件中。