用過MySQL的小伙伴們,大部分都會碰到應用程序或者數據庫維護人員連接數據庫的時候,報too many connections的錯誤,這個錯誤是怎么產生的,該如何解決呢,下面就給大家進行詳細解答
下面是我的mysql 5.7的測試環境,查看一下和連接相關的參數配置
mysql> show variables like '%connections%'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | max_connections | 500 | | max_user_connections | 0 | +----------------------+-------+ 2 rows in set (0.01 sec)為了盡快讓數據庫連接耗盡,我在這里會修改一下參數配置
mysql> set global max_connections=3; Query OK, 0 rows affected (0.00 sec) mysql> show variables like '%connections%'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | max_connections | 3 | | max_user_connections | 0 | +----------------------+-------+ 2 rows in set (0.01 sec)設置了用戶最大連接數為3,下面使用一個普通用戶(tony)進行測試
mysql> select * from performance_schema.users; +------+---------------------+-------------------+ | USER | CURRENT_CONNECTIONS | TOTAL_CONNECTIONS | +------+---------------------+-------------------+ | NULL | 28 | 636237 | | tony | 2 | 5071859 | | root | 1 | 44 | +------+---------------------+-------------------+ 3 rows in set (0.00 sec)可以看到tony用戶的連接到2個了,加上root用戶,總的連接數據已經達到3個了,如果再使用tony用戶進行連接庫,會發生什么呢
[root@cbov10-tidb57-206 ~]# /u02/mysql/bin/mysql --socket=/u02/run/3308/mysql.sock -utony -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1040 (08004): Too many connections已經開始報too many connections錯誤了,這個時候管理員去數據庫進行定位,是什么原因導致的這個報錯,看看能不能連接上數據庫
到這里,細心的同學已經發現問題了,tony用戶和root用戶連接數據已經超過max_connections定義的閥值3了,多了1個,這是怎么回事,難道是這個參數不起作用嗎,那如果再用root用戶連接數據庫,看看時候能連接數據庫
[root@cbov10-tidb57-206 ~]# /u02/mysql/bin/mysql --socket=/u02/run/3308/mysql.sock -uroot -proot mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1040 (HY000): Too many connections這個時候root用戶也無法連接了,在這里解釋一下為什么總連接數會超一個,原來mysql數據庫在max_connections之外,額外提供一個連接,提供給super權限用戶進行故障診斷使用,所以大家在使用mysql數據庫的時候,應用程序千萬別用root去連接數據庫,一旦發生問題,dba連看數據庫性能的機會都沒有了。
喜歡的同學可以關注我的公眾號(db_arch)(Mysql數據庫運維與架構設計)