新搭建數據庫,應用連接上去后,拋如下異常:
120528 10:07:32 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: './ag4_1/raa4_1.frm' (errno: 24)
剛開始沒有仔細查看錯誤碼!還以為是文件損壞,重新導入!仍舊拋上面的錯誤!
用perror工具查看具體錯誤!
linux:/usr/local/mysql/bin # ./perror 24
OS error code 24: Too many open files
超出最大打開文件數限制!ulimit -n查看系統的最大打開文件數是65535,不可能超出!那必然是數據庫的最大打開文件數超出限制!
在mysql里查看最大打開文件數限制命令:show variables like 'open_files_limit';
發現該數值過小,改為2048,重啟mysql,應用正常!
在使用MySql時遇到(errcode: 24)"out of resources when opening file ./XXX.MYD"和(error: 24)"can`t creat file ./XX.frm",通過查找資料得知,原因是打開的文件數超過打開文件數的限制。
這兩天就在查找嘗試怎樣修改打開文件數的限制,通過baidu,得知修改這個值得方法:修改my.ini文件里的max_connections和 table_open_cache的值,然后重起mysql 服務就ok。可以通過命令行( show variables like '%open_files_limit%' )查看。
max_connections 和 table_open_cache 與 open_files_limit 的關系:
max_1 = 10 + max_connections + table_cache * 2;
max_2 = max_connections * 5;
max_3 = max_os_open_files;//操作系統單個進程最大允許打開文件句柄(文件描述符)。
open_files_limit = max( max_1, max_2 ) > max_3 ? max_3 : max ( max_1, max_2);
公式在MySql5.1版本測試過,(但在win7 mysql5.5中測試需要在加上一個基數2048,不知道是否還有其他配置字段?還沒搞明白)
windows 怎樣更改用戶句柄設置
修改注冊表 USERProcessHandleQuota
(默認值為2710(16進制)/10000(10進制),該值的允許范圍為 200 ~ 18000 ,將其調整為更多的數值。同樣地,對於具有2GB或更多物理內存的系統,不妨將用戶句柄數直接設置為上限 18000(10進制);) 沒有測試過 :)
MySQL引擎:MyIASM, 每打開一個文件,需要打開兩個文件句柄。
測試驗證方法:
1)修改 max_connections = 8 ;table_open_cache = 1; 重起mysql 服務后得出 open_files_limit = 40
2)使用命令行執行 select * from table_1, table_2, table_3, table_4, table_5,table_6, table_7, table_8, table_9, table_10,table_11, table_12, table_13, table_14, table_15,table_16, table_17, table_18, table_19, table_20, table_21; #每個table要足夠大,使得這條語句可以執行一段時間。
這時在打開另外的命令行:show status like '%Open_files%';
就會顯示 Open_files = 42
Open_files(42) 已經超過了open_files_limit(40) ,這時不會出error:24錯誤。沒搞明白 :)
3)運行一個應用程序(主要是准備表,插入數據操作),就會提示error:24的錯誤。
4)重新修改 max_connections = 100 ;table_open_cache = 512; 重起mysql 服務后得出 open_files_limit = 1134
5)重復第3步。不會出現error。
測試說明了通過修改這兩個參數達到增加打開文件數的限制數。
070813 13:10:17 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: './yejr/access.frm' (errno: 24)
070813 13:10:17 [ERROR] /usr/local/mysql/bin/mysqld: Can't open file: './yejr/accesslog.frm' (errno: 24)
......
070813 13:10:17 [ERROR] Error in accept: Too many open files
....
注意到, 系統錯誤代號是 24, 用 perror 來查看一下具體的錯誤信息是什么:
OS error code 24: Too many open files
原來是打開文件太多了, 好辦.用sysctl來調整一下就好了:
[root@yejr]# sysctl -a | grep fs.file-max
fs.file-max = 43621
FreeBSD 下也用sysctl來調整:
[root@yejr]# sysctl -a | grep kern.maxfiles
kern.maxfiles = 123280
最后, 還有最重要的一點是, 修改 mysqld 的配置文件 my.cnf, 增加如下一行:
#根據自己的情況適當調整,系統默認值是
# max_connections*5 或 max_connections + table_cache*2
然后, 以root身份重新啟動 mysqld. 在這里, 盡管 my.cnf 中指定的運行用戶不是root, 一樣可以以root身份來啟動mysqld, 否則 open_files_limit 選項無法生效, 因為內核限制了普通用戶的最多打開文件數.