"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”?