新搭建資料庫,應用連線上去後,拋如下異常:
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 選項無法生效, 因為核心限制了普通使用者的最多開啟檔案數.