Mysql 最大连接数

本贴最后更新于 2837 天前,其中的信息可能已经东海扬尘

连接数不足报错

"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 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...