連接數不足報錯
"Can not connect to MySQL server. Too many connections"-mysql 1040
這是因為訪問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
修改mysql的最大連接數為2000
臨時方案(重啟失效)
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連接數相關
在MySQL數據庫層面,以下參數決定了可同時打開的表的數量和要使用的文件描述符
- table_open_cache(table_cache)
- max_tmp_tables
- open_files_limit
show status like 'Open_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables | 19 |
+---------------+-------+
Open_tables:
指當前數據庫打開的表的數量,但非實際打開的表的數量。
由於MySQL是多線程的系統,數個不同的並發連接可能打開同一張表,這就需要為不同的連接session分配獨立的內存空間來存儲這些信息以避免沖突,因此連接數的增加會導致MySQL需要的文件描述符數目的增加。
另外對於MyISAM表,還會建立一個共享的索引文件描述符。
通過flush tables命令可以關閉當前打開的表。
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參數,可以作為目前的系統負載的參照,決定是否需要修改連接數
殺Mysql連接
# 殺掉所有連接
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”?