在使用MySQL数据库的时候,经常会遇到这么一个问题,就是“Can not connect to MySQL server. Too many connections”-mysql 1040错误,这是因为访问MySQL且还未释放的连接数目已经达到MySQL的上限。通常,mysql的最大连接数默认是100, 最大可以达到16384。

在Windows下常用的有两种方式修改最大连接数。

第一种:命令行修改。

>mysql -uuser -ppassword(命令行登录MySQL)

mysql>show variables like 'max_connections';(查可以看当前的最大连接数)

msyql>set global max_connections=1000;(设置最大连接数为1000,可以再次查看是否设置成功)

mysql>exit(推出)

这种方式有个问题,就是设置的最大连接数只在mysql当前服务进程有效,一旦mysql重启,又会恢复到初始状态。因为mysql启动后的初始化工作是从其配置文件中读取数据的,而这种方式没有对其配置文件做更改。

第二种:修改配置文件。

这 种方式说来很简单,只要修改MySQL配置文件my.ini 或 my.cnf的参数max_connections,将其改为max_connections=1000,然后重启MySQL即可。但是有一点最难的就是my.ini这个文件在哪找。通常有两种可能,一个是在安装目录下(这是比较理想的情况),另一种是在数据文件的目录下,安装的时候如果没有人为改变目录的话,一般就在C:/ProgramData/MySQL往下的目录下。

与连接数相关的几个参数:

在修改最大连接数的时候会有这样一个疑问—这个值是不是越大越好,或者设置为多大才合适?这个参数的大小要综合很多因素来考虑,比如使用的平台所支持的线程库数量(windows只能支持到2048)、服务器的配置(特别是内存大小)、每个连接占用资源(内存和负载)的多少、系统需要的响应时间等。可以在global或session范围内修改这个参数。连接数的增加会带来很多连锁反应,需要在实际中避免由此引发的负面影响。

首先看一下MySQL的状态:

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.5.15, for Win32 (x86)

Connection id:          1
Current database:
Current user:           root@localhost
SSL:                    Not in use
Using delimiter:        ;
Server version:         5.5.15 MySQL Community Server (GPL)
Protocol version:       10
Connection:             localhost via TCP/IP
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    gbk
Conn.  characterset:    gbk
TCP port:               3306
Uptime:                 1 hour 3 min 27 sec

Threads: 12  Questions: 18  Slow queries: 10  Opens: 33  Flush tables: 5  Open tab
les: 34  Queries per second avg: 6.256
--------------

Open tables:34,即当前数据库打开表的数量是34个,注意这个34并不是实际的34个表,因为MySQL是多线程的系统,几个不同的并发连接可能打开同一个表,这就需要为不同的连接session分配独立的内存空间来存储这些信息以避免冲突。因此连接数的增加会导致MySQL需要的文件描述符数目的增加。另外对于MyISAM表,还会建立一个共享的索引文件描述符。

在MySQL数据库层面,有几个系统参数决定了可同时打开的表的数量和要使用的文件描述符,那就是table_open_cache、max_tmp_tables和open_files_limit。

mysql> show variables like 'table_open%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| table_open_cache | 256   |
+------------------+-------+
1 row in set (0.00 sec)

table_open_cache:256,这就是说所有的MySQL线程一共能同时打开256个表,我们可以搜集系统的打开表的数量的历史记录和这个参数来对比,决定是否要增加这个参数的大小。查看当前的打开表的数目(Open tables)可用上边提到过的status命令,另外可以直接查询这个系统变量的值:

mysql> show status like 'open_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_tables   | 3     |
+---------------+-------+
1 row in set (0.00 sec)

Open_tables就是当前打开表的数目,通过flush tables命令可以关闭当前打开的表。 这个值如果过大,并且如果没有经常的执行flush tables命令,可以考虑增加table_open_cache参数的大小。
接下来看max_tmp_tables:
mysql> show variables like 'max_tmp%';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| max_tmp_tables | 32    |
+----------------+-------+
1 row in set (0.00 sec)
max_tmp_tables:32即单个客户端连接能打开的临时表数目。查看当前已打开的临时表的信息:
mysql> show global status like '%tmp%table%';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0     |
| Created_tmp_tables      | 11    |
+-------------------------+-------+
2 rows in set (0.00 sec)
根据这两个值可以判断临时表的创建位置,一般选取BLOB和TEXT列、Group by 和 Distinct语句的数据量超过512 bytes,或者union的时候select某列的数据超过512 bytes的时候,就直接在磁盘上创建临时表了,另外内存中的临时表变大的时候,也可能被MySQL自动转移到磁盘上(由tmp_table_size和max_heap_table_size参数决定)。
增加table_open_cache或max_tmp_tables 参数的大小后,从操作系统的角度看,mysqld进程需要使用的文件描述符的个数就要相应的增加,这个是由open_files_limit参数控制的。
mysql> show variables like 'open_files%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 2670  |
+------------------+-------+
1 row in set (0.00 sec)
但是这个参数是OS限制的,所以我们设定的值并不一定总是生效。如果OS限制MySQL不能修改这个值,那么置为0。如果是专用的MySQL服务器上,这个值一般要设置的尽量大,就是设为没有报Too many open files错误的最大值,这样就能一劳永逸了。当操作系统无法分配足够的文件描述符的时候,mysqld进程会在错误日志里记录警告信息。
相应的,有两个状态变量记录了当前和历史的文件打开信息:
mysql> show global status like '%open%file%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Open_files    | 0     |
| Opened_files  | 76    |
+---------------+-------+
2 rows in set (0.00 sec)
MySQL为每个连接分配线程来处理,可以通过threads_connected参数查看当前分配的线程数量:
mysql> show status like '%thread%';
+------------------------------------------+-------+
| Variable_name                            | Value |
+------------------------------------------+-------+
| Delayed_insert_threads                   | 0     |
| Performance_schema_thread_classes_lost   | 0     |
| Performance_schema_thread_instances_lost | 0     |
| Slow_launch_threads                      | 0     |
| Threads_cached                           | 0     |
| Threads_connected                        | 1     |
| Threads_created                          | 1     |
| Threads_running                          | 1     |
+------------------------------------------+-------+
8 rows in set (0.00 sec)

比较threads_connected参数和前面提到的max_connections参数,也可以作为目前的系统负载的参照,决定是否需要修改连接数。

查看每个线程的详细信息:mysql>show processlist;对影响系统运行的线程:kill connection|query threadid的命令杀死。

-----------------------------------------------------------------------------

首先,我们来查看mysql的最大连接数:

?
1
2
3
4
5
6
7
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name  | Value |
+-----------------+-------+
| max_connections | 151  |
+-----------------+-------+
1 row in set (0.00 sec)

其次,查看服务器响应的最大连接数:

?
1
2
3
4
5
6
7
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name    | Value |
+----------------------+-------+
| Max_used_connections | 2   |
+----------------------+-------+
1 row in set (0.00 sec)

可以看到服务器响应的最大连接数为2,远远低于mysql服务器允许的最大连接数值。

对于mysql服务器最大连接数值的设置范围比较理想的是:服务器响应的最大连接数值占服务器上限连接数值的比例值在10%以上,如果在10%以下,说明mysql服务器最大连接上限值设置过高。

?
1
Max_used_connections / max_connections * 100% = 2/151 *100% ≈ 1%

我们可以看到占比远低于10%(因为这是本地测试服务器,结果值没有太大的参考意义,大家可以根据实际情况设置连接数的上限值)。

再来看一下自己 linode VPS 现在(时间:2013-11-13 23:40:11)的结果值:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name  | Value |
+-----------------+-------+
| max_connections | 151  |
+-----------------+-------+
1 row in set (0.19 sec)
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name    | Value |
+----------------------+-------+
| Max_used_connections | 44  |
+----------------------+-------+
1 row in set (0.17 sec)

这里的最大连接数占上限连接数的30%左右。

上面我们知道怎么查看mysql服务器的最大连接数值,并且知道了如何判断该值是否合理,下面我们就来介绍一下如何设置这个最大连接数值。

方法1:

?
1
2
3
4
5
6
7
8
9
mysql> set GLOBAL max_connections=256;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name  | Value |
+-----------------+-------+
| max_connections | 256  |
+-----------------+-------+
1 row in set (0.00 sec)

方法2:

修改mysql配置文件my.cnf,在[mysqld]段中添加或修改max_connections值:

max_connections=128
重启mysql服务即可。

转载于:https://www.cnblogs.com/bigben0123/p/6307052.html

mysql connections相关推荐

  1. mysql connections参数_MySQL性能优化之max_connections配置参数浅析

    mysql的max_connections参数用来设置最大连接(用户)数.每个连接mysql的用户均算作一个连接,max_connections的默认值为100.本文将讲解此参数的详细作用与性能影响. ...

  2. 干掉Navicat:正版,MySQL官方客户端真香!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 如果使用Navicat的话,避免不了需要到处寻找破解版,或 ...

  3. MySQL Workbench 8.0 CE数据库管理基本操作

    该笔记的目的是带领已经了解过MySQL命令行语法的读者初次接触MySQL Workbench 8.0 CE,并用图形界面简化数据库创建.数据表创建.插入数据等操作. 操作流程 打开"MySQ ...

  4. iOS - MySQL 的安装配置

    前言 提前下载好相关软件,且安装目录最好安装在全英文路径下.如果路径有中文名,那么可能会出现一些莫名其妙的问题. 提前准备好的软件: mysql-5.7.17-macos10.12-x86_64.dm ...

  5. 干掉Navicat:正版 MySQL 官方客户端真香!

    如果使用Navicat的话,避免不了需要到处寻找破解版,或者license(笔者很肯定的说,没有几个人会购买正版Navicat的license).个人使用暂且不提,如果是公司内使用,还是有法律风险的. ...

  6. php+sqlrelay+mysql实现连接池及读写负载均衡

    本文主要介绍sqlrelay的配置安装.通过其性能和一些具体环境的测试来帮助开发者应用在相应的场合中去应付大并发的mysql数据库连接. 什么是sqlrelay? Sqlrelay是一个开源的数据库连 ...

  7. mysql密码错误 mac_MAC下MYSQL5.7.17连接不上提示密码错解决步骤

    MAC下MYSQL5.7.17无法连接的问题,下载安装完SQLBench_community 6.3.9后新建MYSQL CONNECTIONS根本连接不上,提示为密码错,什么原因如何解决呢?今天小编 ...

  8. mysql mpm_zabbix mpm 监控 mysql性能

    一.环境说明 zabbix 2.2 in Centos 6.4 64bit 二.MPM(MySQL Performance Monitor)安装 1.依赖模块 yum install perl-Fil ...

  9. sqlrelay mysql_php+sqlrelay+mysql实现连接池及读写负载均衡

    php+sqlrelay+mysql实现连接池及读写负载均衡 上一篇 / 下一篇  2008-04-02 18:25:19 / 个人分类:MySQL 作者:ziqiu sqlrelay.jpg(20. ...

  10. zabbix之监控mysql云服务

    2019独角兽企业重金招聘Python工程师标准>>> 4.配置template (下面是我的template.xml文件,可以自行导入到zabbix模板中) <?xml ve ...

最新文章

  1. 【BASIS系列】SAP Basis系统管理中重置用户缓冲哪些需要注意
  2. leetcode算法题--扑克牌中的顺子
  3. 用户注册,用邮箱来验证用户是否存在
  4. 【linux】关于分析系统问题的前几分钟
  5. c语言一维数组课件,第9章:c语言一维数组课件
  6. shell编程之循环语句
  7. mysql如何获取句柄_关于获取进程句柄的问题
  8. 收藏 | 各种Optimizer梯度下降优化算法回顾和总结
  9. JDBC Statements, PreparedStatement
  10. 开心的小明 (NYOJ49) [动态规划.01背包]
  11. verilog中阻塞赋值与 非阻塞赋值的区别
  12. configure: error: Cannot find the WebServer
  13. 检测到非法调试,F12被管理员禁用解决方法
  14. django ajax 简书,Django中ajax上传图片详细步骤
  15. QTableView固定行显示的问题
  16. office2012产品密钥
  17. 安利几个优秀的开源电商系统
  18. PDA用ActiveSync同步上网 方法
  19. Unity统计代码行数脚本
  20. 小学生评语大全{六年级}

热门文章

  1. 南京铁道学院计算机应用,南京铁道职业技术学院铁道交通运营管理专业
  2. 利用matlab使用窗函数,Matlab中窗函数的简单使用
  3. 搭建 zookeeper 和搭建dubbo监控中心
  4. channel带缓冲区和不带缓冲区的区别
  5. CSDN Markdown帮助文档
  6. gsm模块 java 录音_深入详解Android GSM驱动模块
  7. 2.3创建用户访问过滤器(安全性)
  8. 【渝粤教育】电大中专门店销售与服务技巧 (2)作业 题库
  9. 【渝粤教育】国家开放大学2019年春季 2083信息技术与教育技术(2) 参考试题
  10. 【渝粤教育】广东开放大学 商务交际听说 形成性考核 (31)