分析原因:
my.cnf 中設(shè)定的并發(fā)連接數(shù)太少或者系統(tǒng)繁忙導(dǎo)致連接數(shù)被占滿。
連接數(shù)超過了 MySQL 設(shè)置的值,與 max_connections 和 wait_timeout 都有關(guān)。
wait_timeout 的值越大,連接的空閑等待就越長(zhǎng),這樣就會(huì)造成當(dāng)前連接數(shù)越大。
解決方式:
一般進(jìn)入/etc目錄下,找到并打開my.cnf文件找到 max_connections 默認(rèn)是 100, 一般設(shè)置到500~1000比較合適,重啟 MySQL
- 進(jìn)入etc目錄下
cd /etc/
- 修改my.cnf文件
vim my.cnf
[mysqld]
basedir=/home/console/mysql
datadir=/home/console/mysql/data
port=3306
server-id=2
log-bin=mysql-bin
max_connections=500
max_connect_errors=30
default-storage-engine=InnoDB
transaction_isolation=REPEATABLE-READ
socket=/home/console/mysql/tmp/mysql.sock
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
interactive_timeout=8640000000
wait_timeout=8640000000
[client]
socket=/home/console/mysql/tmp/mysql.sock
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
[client]
default-character-set=utf8
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
- 停止mysql,進(jìn)入mysql安裝目錄
cd /home/console/mysql/
./sbin/stop-mysql.sh
- 啟動(dòng)mysql
./sbin/start-mysql.sh
設(shè)置完成之后,基本可以解決 Too many connections 問題。
- 進(jìn)入mysql bin 目錄下連接mysql
bin]# ./mysql -uroot -pxxx
- 查看連接池線程情況
mysql> show full processlist;
+------+------+----------------------+----------------+---------+------+----------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+------+----------------------+----------------+---------+------+----------+-----------------------+
| 96 | root | xxxx:37974 | fairylandTotal | Sleep | 2066 | | NULL |
| 97 | root | xxx:37975 | fairylandTotal | Sleep | 771 | | NULL |
| 174 | root | xxx:38175 | fairylandTotal | Sleep | 2882 | | NULL |
| 299 | root | xxx:38277 | fairylandTotal | Sleep | 3 | | NULL |
| |
| . . . . . . . . . . . . . . . . . |
+------+------+----------------------+----------------+---------+------+----------+-----------------------+
66 rows in set (0.01 sec)
連接池線程狀態(tài):
1. SLEEP
線程正在等待客戶端發(fā)送新的請(qǐng)求。
2. QUERY
線程正在執(zhí)行查詢或者正在將結(jié)果發(fā)送給客戶端。
3. LOCKED
在MYSQL服務(wù)層,該線程正在等待表鎖。在存儲(chǔ)引擎級(jí)別實(shí)現(xiàn)的鎖,如INNODB的行鎖,并不會(huì)體現(xiàn)在線程狀態(tài)中?!?duì)于MYISAM來說這是一個(gè)比較典型的狀態(tài)。但在其他沒有行鎖的引擎中也經(jīng)常會(huì)出現(xiàn)。
4. ANALYZING AND STATISTICS
線程正在收集存儲(chǔ)引擎的統(tǒng)計(jì)信息, 并生成查詢的執(zhí)行計(jì)劃。
5. COPYING TO TMP TABLE (ON DISK)
線程正在執(zhí)行查詢, 并且將其結(jié)果集都復(fù)制到一個(gè)臨時(shí)文件中, 這種狀態(tài)一般要么是在做GROUP BY操作,要么是文件排序操作, 或者是UNION操作。 如果這個(gè)狀態(tài)后面還有ON DISK的標(biāo) , 那表示MYSQL正在將一個(gè)內(nèi)存臨時(shí)表放到磁盤上。
6. SORTING RESULT
線程正在對(duì)結(jié)果集進(jìn)行排序。
7. SENDING DATA
線程可能在多個(gè)狀態(tài)之間傳送數(shù)據(jù),或者生成結(jié)果集,或者在向客戶端返回?cái)?shù)據(jù)。
- 查看mysql最大連接數(shù)量
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 500 |
+-----------------+-------+
1 row in set (0.04 sec)
- 查看mysql當(dāng)前連接數(shù)量
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 155 |
+----------------------+-------+
1 row in set (0.22 sec)
對(duì)于mysql服務(wù)器最大連接數(shù)值的設(shè)置范圍比較理想的是:服務(wù)器響應(yīng)的最大連接數(shù)值占服務(wù)器上限連接數(shù)值的比例值在10%以上,如果在10%以下,說明mysql服務(wù)器最大連接上限值設(shè)置過高。
總結(jié)
MySQL服務(wù)器所支持的最大連接數(shù)是有上限的,因?yàn)槊總€(gè)連接的建立都會(huì)消耗內(nèi)存,因此客戶端在連接到MySQL Server處理完相應(yīng)的操作后,應(yīng)該斷開連接并釋放占用的內(nèi)存。
如果MySQL Server有大量的閑置連接,不僅會(huì)白白消耗內(nèi)存,而且如果連接一直在累加而不斷開,最終肯定會(huì)達(dá)到MySQL Server的連接上限數(shù),這會(huì)報(bào)'too many connections'的錯(cuò)誤。
wait_timeout 設(shè)置也很關(guān)鍵,設(shè)置時(shí)間過長(zhǎng)較耗性能,設(shè)置過短經(jīng)常報(bào)“MySQL server has gone away”,一般根據(jù)項(xiàng)目具體情況設(shè)置。本項(xiàng)目設(shè)置的較長(zhǎng)造成了很多連接處于Sleep狀態(tài)。對(duì)于wait_timeout的設(shè)置建議詳細(xì)了解一下 https://blog.csdn.net/mashengwang/article/details/54814250