前段時(shí)間在給數(shù)據(jù)庫(kù)增加分區(qū)時(shí)導(dǎo)致了一個(gè)異常
; uncategorized SQLException for SQL []; SQL state [HY000]; error code [23]; Out of resources when opening file '/export/data/mysql/tmp/ML5P97Os' (Errcode: 24 - Too many open files); nested exception is java.sql.SQLException: Out of resources when opening file '/export/data/mysql/tmp/ML5P97Os' (Errcode: 24 - Too many open files)
java.sql.SQLException: Failed to read from the .par file
為什么會(huì)導(dǎo)致Too many open files呢?
加分區(qū)的表是個(gè)分庫(kù)分表朽们,添加的分區(qū)類(lèi)型是RANGE分區(qū)砖织,按照每月一個(gè)分區(qū),一個(gè)表建了三年的分區(qū)表(36個(gè)分區(qū)表)变抽,數(shù)據(jù)庫(kù)一共分了32個(gè)庫(kù),每個(gè)庫(kù)上64張業(yè)務(wù)表。
首先說(shuō)下mysql數(shù)據(jù)庫(kù)會(huì)生成哪些文件,假設(shè)數(shù)據(jù)庫(kù)表A
如果是MyISAM存儲(chǔ)引擎的數(shù)據(jù)庫(kù) 會(huì)產(chǎn)生三個(gè)文件:
1岂嗓、A.frm 文件 :記錄表結(jié)構(gòu)、字段長(zhǎng)度等
2鹊碍、A.MYD: 數(shù)據(jù)信息文件厌殉,存儲(chǔ)數(shù)據(jù)信息
3、A.MYI: 索引信息文件
如果是InnoDB 會(huì)產(chǎn)生以下文件:
1侈咕、A.frm: 記錄表結(jié)構(gòu)年枕、字段長(zhǎng)度等
2、如果采用獨(dú)立表存儲(chǔ)模式乎完,data\a中還會(huì)產(chǎn)生A.ibd文件(存儲(chǔ)數(shù)據(jù)信息和索引信息)
3、如果采用共存儲(chǔ)模式的品洛,數(shù)據(jù)信息和索引信息都存儲(chǔ)在ibdata1中
4树姨、如果采用分區(qū)存儲(chǔ)摩桶,data\a中還會(huì)有一個(gè)A.par文件(用來(lái)存儲(chǔ)分區(qū)信息)
我們的mysql數(shù)據(jù)庫(kù)使用的是Innodb存儲(chǔ)引擎,所以每個(gè)數(shù)據(jù)庫(kù)在創(chuàng)建分區(qū)表時(shí)帽揪,會(huì)生成64*36=2304個(gè) .ibd文件硝清,同時(shí)也會(huì)打開(kāi)每個(gè)表的.par文件 加上數(shù)據(jù)庫(kù)原本打開(kāi)的文件數(shù),超過(guò)了設(shè)置的可以打開(kāi)的最大文件數(shù)量限制转晰,導(dǎo)致報(bào)了錯(cuò)芦拿。
解決辦法 調(diào)整mysql打開(kāi)文件數(shù)限制,或者減少創(chuàng)建的分區(qū)數(shù)量查邢。
查看mysql文件數(shù)命令:
show variables like 'open_files_limit%'
查看打開(kāi)文件數(shù)命令:
show status like 'open_files%'
mysql 常用status變量如下表:
status Variable_name value 值含義
Aborted_clients 由于客戶沒(méi)有正確關(guān)閉連接,已經(jīng)丟棄死掉的連接數(shù)量
Aborted_connects 嘗試已經(jīng)丟棄的失敗的MySQL服務(wù)器的連接的數(shù)量
Connections 試圖連接MySQL服務(wù)器的次數(shù)
Created_tmp_tables 當(dāng)執(zhí)行語(yǔ)句時(shí)蔗崎,已經(jīng)被創(chuàng)造了的隱含臨時(shí)表的數(shù)量
Delayed_insert_threads 正在使用的延遲插入處理器線程的數(shù)量
Delayed_writes 用INSERT DELAYED寫(xiě)入的行數(shù)
Delayed_errors 用INSERT DELAYED寫(xiě)入的發(fā)生某些錯(cuò)誤(可能重復(fù)鍵值)的行數(shù)
Flush_commands 執(zhí)行FLUSH命令的次數(shù)
Handler_delete 請(qǐng)求從一張表中刪除行的次數(shù)
Handler_read_first 請(qǐng)求讀入表中第一行的次數(shù)
Handler_read_key 請(qǐng)求數(shù)字基于鍵讀行
Handler_read_next 請(qǐng)求讀入基于一個(gè)鍵的一行的次數(shù)
Handler_read_rnd 請(qǐng)求讀入基于一個(gè)固定位置的一行的次數(shù)
Handler_update 請(qǐng)求更新表中一行的次數(shù)
Handler_write 請(qǐng)求向表中插入一行的次數(shù)
Key_blocks_used 用于關(guān)鍵字緩存的塊的數(shù)量
Key_read_requests 請(qǐng)求從緩存讀入一個(gè)鍵值的次數(shù)
Key_reads 從磁盤(pán)物理讀入一個(gè)鍵值的次數(shù)
Key_write_requests 請(qǐng)求將一個(gè)關(guān)鍵字塊寫(xiě)入緩存次數(shù)
Key_writes 將一個(gè)鍵值塊物理寫(xiě)入磁盤(pán)的次數(shù)
Max_used_connections 同時(shí)使用的連接的最大數(shù)目
Not_flushed_key_blocks 在鍵緩存中已經(jīng)改變但是還沒(méi)被清空到磁盤(pán)上的鍵塊
Not_flushed_delayed_rows 在INSERT DELAY隊(duì)列中等待寫(xiě)入的行的數(shù)量
Open_tables 打開(kāi)表的數(shù)量
Open_files 打開(kāi)文件的數(shù)量
Open_streams 打開(kāi)流的數(shù)量(主要用于日志記載)
Opened_tables 已經(jīng)打開(kāi)的表的數(shù)量
Questions 發(fā)往服務(wù)器的查詢(xún)的數(shù)量
Slow_queries 要花超過(guò)long_query_time時(shí)間的查詢(xún)數(shù)量
Threads_connected 當(dāng)前打開(kāi)的連接的數(shù)量
Threads_running 不在睡眠的線程數(shù)量
Uptime 服務(wù)器工作了多少秒