too many connections是由於mysql配置中連接數過少,不足以支撐當前的並發數,too many open files是由於mysql open_files_limit的值大小不夠。
最開始mysql日志出現的錯誤為too many connections,mysql配置文件已經配置了最大連接數max_connections=2000,登錄到mysql中,查看mysql連接收:show processlist; (查看詳細執行信息使用:show full processlist;),發現線程數只有500多,並沒有達到配置文件中的最大配置,登錄mysql查看其生效的最大連接數及mysql open_files_limit
mysql> show variables like '%max_connections%'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 214 | +-----------------+-------+ 1 row in set (0.00 sec) mysql> show variables like '%open_files_limit%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 1024 | +------------------+-------+ 1 row in set (0.00 sec)
配置文件中配置的連接數2000未生效
linux一切皆文件,查看linux open files
[root@localhost work]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 7739 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 7739 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
open files的大小只有1024,需要調大一些,設置為65535
vim /etc/security/limits.conf
添加
* soft nofile 65535 * hard nofile 65535
重新打開ssh窗口,登錄,查看設置結果
[root@localhost ~]# ulimit -n 65535
使mysql配置生效有如下兩種方式
1、登錄mysql,查看連接數,沒有變化,還是214,在mysql開機啟動服務文件中添加如下
vim /usr/lib/systemd/system/mysql.service
LimitNOFILE=infinity
LimitMEMLOCK=infinity
重啟mysql
systemctl daemon-reload
systemctl restart mysql
查看最大連接數連接數及mysql open_files_limit,可以發現open_files_limit的大小被設置為與unlimit -n大小一致
mysql> show variables like '%open_files_limit%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 65536 | +------------------+-------+ 1 row in set (0.00 sec) mysql> show variables like '%max_connections%'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 2000 | +-----------------+-------+ 1 row in set (0.00 sec)
2、如果未使用開機啟動,使用mysql_safe也可以使配置生效,但open_files_limit的大小被設置為了10000
mysql> show variables like '%open_files_limit%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 10000 | +------------------+-------+ 1 row in set (0.00 sec) mysql> show variables like '%max_connections%'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 2000 | +-----------------+-------+ 1 row in set (0.00 sec)
總結:
調大linux系統open files
設置mysql max_connections
1、如果使用開機啟動,則在service文件中添加
LimitNOFILE=infinity
LimitMEMLOCK=infinity
使配置生效,並重新啟動
systemctl daemon-reload
systemctl restart mysql
2、未使用開機啟動,使用mysql_safe啟動(open_files_limit被設置為10000,如果不夠大,可以在配置文件my.cnf中修改)
mysqld_safe --defaults-file=/etc/my.cnf &