Too many connections linux環(huán)境下mysql連接過多

分析原因:
   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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容