Can't open file: (errno: 24)

weixin_30639719發表於2020-04-05

    新搭建資料庫,應用連線上去後,拋如下異常:
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 來檢視一下具體的錯誤資訊是什麼:
[root@yejr]# /usr/bin/perror 24
OS error code  24:  Too many open files
原來是開啟檔案太多了, 好辦.用sysctl來調整一下就好了:
[root@yejr]# sysctl -w fs.file-max=43621
[root@yejr]# sysctl -a | grep fs.file-max
fs.file-max = 43621
FreeBSD 下也用sysctl來調整:
[root@yejr]# sysctl -w kern.maxfiles=123280
[root@yejr]# sysctl -a | grep kern.maxfiles
kern.maxfiles = 123280
最後, 還有最重要的一點是, 修改 mysqld 的配置檔案 my.cnf, 增加如下一行:
open_files_limit = 4096
#根據自己的情況適當調整,系統預設值是
# max_connections*5 或 max_connections + table_cache*2
然後, 以root身份重新啟動 mysqld. 在這裡, 儘管 my.cnf 中指定的執行使用者不是root, 一樣可以以root身份來啟動mysqld, 否則 open_files_limit 選項無法生效, 因為核心限制了普通使用者的最多開啟檔案數.

轉載於:https://www.cnblogs.com/end/archive/2013/02/02/2890018.html

相關文章