Mysql最大鏈接數

鏈接數不足報錯

"Can not connect to MySQL server. Too many connections"-mysql 1040html

這是由於訪問MySQL且還未釋放的鏈接數目已經達到MySQL的上限。
MySQL默認的最大鏈接數爲100,MySQL容許的最大鏈接數16384
Windows下因爲線程數限制MySQL最大鏈接數爲2048mysql

查看mysql的鏈接數

mysql -u User -pPassword

show variables like 'max_connections' \G;

*************************** 1. row ***************************
Variable_name: max_connections
        Value: 100

修改mysql的最大鏈接數爲2000

臨時方案(重啓失效)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鏈接數相關

在MySQL數據庫層面,如下參數決定了可同時打開的表的數量和要使用的文件描述符bash

  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命令能夠關閉當前打開的表。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_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

相關文章
相關標籤/搜索