"Can not connect to MySQL server. Too many connections"-mysql 1040html
這是由於訪問MySQL且還未釋放的鏈接數目已經達到MySQL的上限。
MySQL默認的最大鏈接數爲100,MySQL容許的最大鏈接數16384。
Windows下因爲線程數限制MySQL最大鏈接數爲2048。mysql
mysql -u User -pPassword show variables like 'max_connections' \G; *************************** 1. row *************************** Variable_name: max_connections Value: 100
臨時方案(重啓失效)sql
msyql > set global max_connections=2000; mysql > exit
永久方案數據庫
#!/bin/bash myCnf=/etc/my.cnf grep -lq max_connections ${myCnf} if [ $? -eq 0 ];then sed -i "/max_connections/d" ${myCnf} sed -i '/\[mysqld\]/a\max_connections = 2000' ${myCnf} else sed -i '/\[mysqld\]/a\max_connections = 2000' ${myCnf} fi
在MySQL數據庫層面,如下參數決定了可同時打開的表的數量和要使用的文件描述符bash
show status like 'Open_tables'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 19 | +---------------+-------+
Open_tables:服務器
指當前數據庫打開的表的數量,但非實際打開的表的數量。
因爲MySQL是多線程的系統,數個不一樣的併發鏈接可能打開同一張表,這就須要爲不一樣的鏈接session分配獨立的內存空間來存儲這些信息以免衝突,所以鏈接數的增長會致使MySQL須要的文件描述符數目的增長。
另外對於MyISAM表,還會創建一個共享的索引文件描述符。
經過flush tables命令能夠關閉當前打開的表。session
show variables like 'table_cache'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | table_cache | 64 | +---------------+-------+
table_open_cache(table_cache):多線程
指MySQL全部線程能同時打開多少表。
咱們能夠蒐集系統打開表的數量的歷史記錄和這個參數來對比,決定是否要增長這個參數的大小。併發
show variables like 'max_tmp_%'; +----------------+-------+ | Variable_name | Value | +----------------+-------+ | max_tmp_tables | 32 | +----------------+-------+
max_tmp_tables:
指單個客戶端鏈接能打開的臨時表數目操作系統
show global status like '%tmp%table%'; +-------------------------+--------+ | Variable_name | Value | +-------------------------+--------+ | Created_tmp_disk_tables | 0 | | Created_tmp_tables | 118241 | +-------------------------+--------+
Created_tmp_disk_tables與Created_tmp_tables:
根據這兩個值能夠判斷臨時表的建立位置,通常選取BLOB和TEXT列、Group by 和 Distinct語句的數據量超過512 bytes,或者union的時候select某列的數據超過512 bytes的時候,就直接在磁盤上建立臨時表了
另外內存中的臨時表變大的時候,也可能被MySQL自動轉移到磁盤上(由tmp_table_size和max_heap_table_size參數決定)
增長table_open_cache(table_cache)或max_tmp_tables參數的大小後,從操做系統的角度看,mysqld進程須要使用的文件描述符的個數增長,須要修改open_files_limit
show variables like 'open_files%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 10000 | +------------------+-------+
open_files_limit:
這個參數受限於OS,非必然生效。
若是OS限制MySQL不能修改這個值,那麼置爲0。
若是是專用的MySQL服務器上,這個值通常要設置的儘可能大,就是設爲沒有報Too many open files錯誤的最大值。
當操做系統沒法分配足夠的文件描述符的時候,mysqld進程會在錯誤日誌裏記錄警告信息。
show global status like '%file%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Created_tmp_files | 5 | | Open_files | 0 | +-------------------+-------+
Open_files和Opened_files(Created_tmp_files):
記錄了當前和歷史的文件打開信息
show status like '%thread%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | Delayed_insert_threads | 0 | | Slow_launch_threads | 0 | | Threads_cached | 0 | | Threads_connected | 61 | | Threads_created | 69950 | | Threads_running | 1 | +------------------------+-------+
threads_connected:
MySQL爲每一個鏈接分配線程來處理,能夠經過threads_connected參數查看當前分配的線程數量。
比較threads_connected參數和前面提到的max_connections參數,能夠做爲目前的系統負載的參照,決定是否須要修改鏈接數
# 殺掉全部鏈接 out1=$(mysql -B test -uroot -proot --disable-column-names -e "select concat('KILL ',id,';') from information_schema.processlist where user='root' and time > 200;") mysql -B test -uroot -proot --disable-column-names -e "$out1"
How do I kill all the processes in Mysql 「show processlist」?