在数据库操作过程中,经常会遇到一些非业务逻辑错误,这样的错误要求开发人员对于自己正在操作的硬件软件乃至网络都有一定的了解,这里说说关于数据库最大连接数量的那点事儿
在某个项目操作过程中,数据库使用MySQL,在进行用户并发访问测试时,当并发量达到一定程度的时候就会出现程序连接数据库1040错误,1040错误的具体描述是:“Can not connect to MySQL server. Too many connections”,也就是过多的数据库连接数量,这个明显就不是业务本身的问题,而是数据库系统配置的问题了。解决这个问题从以下几个方面进行处理
查看最大连接数量
SHOW VARIABLES LIKE 'max_connections';
mysql最大允许连接数量限制 16384 个
设置最大连接数量有两种方式(命令行修改 | 配置文件修改)
set global max_connections = 1000
优点:即时生效,运行命令之后直接生效 缺点:如果一旦重启mysql数据库服务的话,默认最大连接数量重置
# 修改mysql的配置文件my.ini
[mysql]
...
max_connections=1000
优点:稳定,可靠,修改完之后永久生效 缺点:修改配置文件的操作方式需要重启mysql数据库服务才能生效
# 查看当前数据库的连接状态
show status like 'Threads%';
# threads_cached:缓存的连接
# threads_connected:建立的连接数量
# threads_created:创建过的线程数量
# threads_running:激活的连接数量
查看当前数据库的连接状态
# 查看当前连接信息,root用户可以查看所有正在连接的信息
show processlist;
查看当前连接信息
# 查看当前数据库运行状态设置
show status;
查看当前数据库运行状态设置
Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。 Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。 Connections 试图连接MySQL服务器的次数。 Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。 Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。 Delayed_writes 用INSERT DELAYED写入的行数。 Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。 Flush_commands 执行FLUSH命令的次数。 Handler_delete 请求从一张表中删除行的次数。 Handler_read_first 请求读入表中第一行的次数。 Handler_read_key 请求数字基于键读行。 Handler_read_next 请求读入基于一个键的一行的次数。 Handler_read_rnd 请求读入基于一个固定位置的一行的次数。 Handler_update 请求更新表中一行的次数。 Handler_write 请求向表中插入一行的次数。 Key_blocks_used 用于关键字缓存的块的数量。 Key_read_requests 请求从缓存读入一个键值的次数。 Key_reads 从磁盘物理读入一个键值的次数。 Key_write_requests 请求将一个关键字块写入缓存次数。 Key_writes 将一个键值块物理写入磁盘的次数。 Max_used_connections 同时使用的连接的最大数目。 Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。 Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。 Open_tables 打开表的数量。 Open_files 打开文件的数量。 Open_streams 打开流的数量(主要用于日志记载) Opened_tables 已经打开的表的数量。 Questions 发往服务器的查询的数量。 Slow_queries 要花超过long_query_time时间的查询数量。 Threads_connected 当前打开的连接的数量。 Threads_running 不在睡眠的线程数量。 Uptime 服务器工作了多少秒。