數據庫出現問題顯示too many files,導致數據庫無法訪問。出現這個問題,肯定是文件描述符打開過大了。查下數據庫的結果爲:
show variables like "%file%";
open_files_limit | 1024
查看系統ulimit的值:
[root@localhost ~]# ulimit -n 65535
系統的值是正確的。然後修改/etc/my.cnf配置文件,添加
open_files_limit=65535
然後重啓mysql
systemctl restart mysql
再次查看mysql的值:
show variables like "%file%";
open_files_limit | 1024
還是這樣,不生效。什麼問題。鬱悶了。經過不斷的嘗試,突然發現不使用系統自帶的命令重啓的話
[root@localhost system]# mysqld_safe --defaults-file=/etc/my.cnf &
這樣啓動的話,設置的值生效了。莫非腳本里面ulimit值不認爲是65535.
找了個辦法進行驗證操作。
因爲mysql啓動肯定會調用mysqld_safe腳本文件,就在這個文件裏面進行驗證。
759 echo `ulimit -n `>> /tmp/1.txt #新加的調試內容 760 ulimit -n 65535 #新加的調試內容 761 echo `ulimit -n `>> /tmp/1.txt #新加的調試內容 762 763 cmd="`mysqld_ld_preload_text`$NOHUP_NICENESS" 764 765 for i in "$ledir/$MYSQLD" "--basedir=$MY_BASEDIR_VERSION" \ 766 "--datadir=$DATADIR" "--plugin-dir=$plugin_dir" "$USER_OPTION"
使用
[root@localhost ~]# tailf /tmp/1.txt
重啓mysql,觀看文件的數據變化.
1024 1024
盡然一直是1024,使用命令設置過也沒有生效。
這到底怎麼回事。
自己寫個簡單的測試腳本測試ulimit -n的值顯示的就是系統設定的,爲什麼在mysql的啓動裏面就無法調用系統的呢。
經過查找資料。有說如果是守護進程啓動的shell的話用ulimit -n設置的話就不會生效。也不知道對不對。我就暫且認爲這個mysql的啓動是一個守護進程調用的這個腳本文件。那我該怎麼辦呢。
無意中看到了redis的啓動文件的設定。
[root@mysql redis.service.d]# cat /etc/systemd/system/redis.service.d/limit.conf # If you need to change max open file limit # for example, when you change maxclient in configuration # you can change the LimitNOFILE value below # see "man systemd.exec" for information [Service] LimitNOFILE=10240
這個就是設定limit_files數的,就依葫蘆畫瓢,在mysql啓動配置文件加入了。
[root@localhost system]# cat -n /etc/systemd/system/mysql.service 26[Service] 27User=mysql 28Group=mysql 29# Execute pre and post scripts as root 30 31LimitNOFILE=65535 #新加入的內容
然後繼續
[root@localhost ~]# tailf /tmp/1.txt
重啓mysql,觀看文件變化
65535 65535
盡然生效了。進入msyql,查詢結果:
mysql> show variables like "%file%"; | open_files_limit | 65535
成功生效。
說明這個參數起了作用,在腳本的的ulimit -n設定其實是沒有用處的。
總結:個人感覺系統自帶的啓動程序的方式確實方便,但是會讓用戶不知道真正調用的啓動文件的工作方式。遇到問題的話最好就是找源碼啓動文件進行調試,會找到很多自己意想不到的東西。還有官方寫的shell腳本看着真他媽的複雜。