Mysql最大連接數


連接數不足報錯

"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數據庫層面,以下參數決定了可同時打開的表的數量和要使用的文件描述符

  1. table_open_cache(table_cache)
  2. max_tmp_tables
  3. 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_sizemax_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"

參考資料

怎么查看和修改 MySQL 的最大連接數?

MySQL最大連接數設置

How do I kill all the processes in Mysql “show processlist”?

批量 kill mysql 中運行時間長的sql


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM