Mysql 查看连接数,状态 最大并发数 max_connections timeout

忘是亡心i 2022-05-25 11:42 819阅读 0赞

show status like’%max_connections%’;

##mysql最大连接数

set global max_connections=1000

##重新设置show variables like’%max_connections%’;

##查询数据库当前设置的最大连接数

show global status like’Max_used_connections’;

##服务器响应的最大连接数

show status like’Threads%’;

Variable_name ValueThreads_cached 0 ##mysql管理的线程池中还有多少可以被复用的资源

Threads_connected 152 ##打开的连接数

Threads_created 550 ##表示创建过的线程数,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值,查询服务器

Threads_running 1 ##激活的连接数,这个数值一般远低于connected数值,准确的来说,Threads_running是代表当前并发数

show variables like’thread_cache_size’;

set global thread_cache_size=60;

***************************************************

mysql连接数过多 解决方案

mysql 默认链接数是100个 最大是16384。

原则:想尽一切办法不重启

导致原因:

出现这种错误明显就是 mysql_connect 之后忘记 mysql_close;
当大量的connect之后,就会出现Too many connections的错误,mysql默认的连接为100个,而什么情况下会出现这种错误呢?

正常的mysql_connect 之后调用 mysql_close()关闭连接
但在连接错误时,会者mysql_real_query()出现错误退出时,可能忘记mysql_close();
所以在程序return 之前一定要判断是否close(),最稳妥的方法就是在写任何函数时都只有一个出口!

MYSQL的数据连接超时时间设置

大规模多线程操作事务的时候,有时候打开一个链接,会进行等待,这时候如果数据库的超时时间设置的过短,就可能会出现,数据链接自动被释放,当然设置过大也不好,慢SQL或其他因素引起的链接过长,导致整个系统被拖慢,甚至挂掉。SO,适当的设置超时时间。设置方法:

SHOW GLOBAL VARIABLES LIKE ‘%timeout%’
SET GLOBAL wait_timeout=10000 即8小时

846824-20170223175003882-1616401633.png

前段时间部署在服务器上的网站遇到一个问题:当较长时间没有去访问网站,再次打开时就会报一个数据库连接失败的错误,不管是用ssh开发的项目还是ssm开发的项目,都有这个问题。本篇博客记录这个问题的原因与解决办法。

原因:

由于无论是hibernate还是mybatis开发的都存在这个问题,所以一定不是框架的原因,应该是mysql数据库的问题,查询百度后发现:mysql数据库配置文件存在以下两个参数,是负责管理连接超时的。
1> interactive_timeout:针对交互式连接
2> wait_timeout:针对非交互式连接。
所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。说得直白一点,通过mysql客户端连接数据库是交互式连接,通过jdbc连接数据库是非交互式连接。
这两个参数默认都是28800秒,即8小时,也就是超过8小时的连接就会自动失效。这本身并没什么问题,真正的问题是:我们做项目一般使用数据库连接池来获取连接,连接池里的连接可能会较长时间不关闭,等待被使用,这就与mysql连接超时机制起冲突了,当连接池配置永不关闭或者关闭时间超过8小时就会出现我所遇到的问题。

解决办法:

1、修改mysql配置文件里wait_timeout参数,调大一点,然而这治标不治本,因为只要项目里的数据库连接超过一定时间没有被使用还是会出这个问题的,所以不推荐使用这个方法解决。
2、修改数据库连接池的配置,一般的数据库连接池都会带有一个参数:最大空闲时间,修改这个参数的值,不要大于wait_timeout的值即可(也不要等于0)。这里贴出c3p0的配置代码。

  1. <!--最大空闲时间,30分钟内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
  2. <property name="maxIdleTime" value="1800"></property>
  • 1
  • 2

这个参数是用于修改连接的有效时间的,即超过30分钟没被使用的连接就会被连接池丢弃,当再次需要连接时会重新获取。

查看链接:

查看当前连接数

  1. ./mysqladmin -uroot -p1234.com status
  2. Uptime: 1370150 Threads: 1 (当前连接数) Questions: 79 Slow queries: 0 Opens: 33 Flush tables: 1 Open tables: 26 Queries per second avg: 0.000
  3. ./mysql -uroot -p1234.com -e 'show status' | grep -i Threads
  4. Delayed_insert_threads 0
  5. Slow_launch_threads 0
  6. Threads_cached 1 Threads_connected 1 Threads_created 2 Threads_running 1 ##(当前连接数)
  7. mysql> show status like 'Threads%';
  8. +-------------------+-------+
  9. | Variable_name | Value |
  10. +-------------------+-------+
  11. | Threads_cached | 1 |
  12. | Threads_connected | 1 |
  13. | Threads_created | 2 |
  14. | Threads_running | 1 | ###当前连接数
  15. +-------------------+-------+
  16. 4 rows in set (0.00 sec)

查看最大连接数

  1. [root@xxx bin]# ./mysql -uroot -p1234.com -e 'show variables' | grep max_connections
  2. max_connections 500
  3. mysql> show global variables like 'max_conn%';
  4. +--------------------+-------+
  5. | Variable_name | Value |
  6. +--------------------+-------+
  7. | max_connect_errors | 10 |
  8. | max_connections | 500 |## 最大连接数
  9. +--------------------+-------+
  10. 2 rows in set (0.00 sec)

解决方法:

想尽一切办法不重启

这种情况一般是进不去数据库了,修改配置文件得重启,对于线上的数据库风险太大了,进入数据库用sql修改,现在是进不去了

方法1:

使用gdb工具 不用进入数据库,不用重启数据库 方法如下:

  1. [root@xxx bin]# gdb -p $(cat /data/mydata/xxx.pid) -ex "set max_connections=500" -batch
  2. [New LWP 7667]
  3. [New LWP 4816] [New LWP 341] [New LWP 338] [New LWP 337] [New LWP 336] [New LWP 335] [New LWP 331] [New LWP 330] [New LWP 329] [New LWP 328] [New LWP 327] [New LWP 326] [New LWP 325] [New LWP 324] [New LWP 323] [New LWP 322] [Thread debugging using libthread_db enabled] 0x00000035654df1b3 in poll () from /lib64/libc.so.6

查看mysql pid位置的方法

在配置文件 my.cnf里查找

用 ps -ef | grep mysql 查找

  1. mysql> show variables like '%pid%';
  2. +---------------+----------------------+
  3. | Variable_name | Value |
  4. +---------------+----------------------+
  5. | pid_file | /data/mydata/xxx.pid |
  6. +---------------+----------------------+
  7. 1 row in set (0.00 sec)
  8. 修改完毕后 ,尝试重新进入数据库,并查看链接数

这种方法设置后,只是暂时的,数据库重启后,会变为原来的数值,要想永久,设置完后修改配置文件my.cnf

方法2

前提是还可以进入数据库

进入数据库

设置新的最大连接数为200:mysql> set GLOBAL max_connections=200

显示当前运行的Query:mysql> show processlist

显示当前状态:mysql> show status

退出客户端:mysql> exit

这种方法设置后,只是暂时的,数据库重启后,会变为原来的数值,要想永久,设置完后修改配置文件my.cnf

方法3:

需要重启数据库

修改 my.conf

max_connection = 1000;

模拟mysql连接数过多

脚本内容

  1. #!/bin/bash
  2. set j=2
  3. while true
  4. do
  5. let "j=j+1"
  6. /usr/local/mysql/bin/mysqlslap -a -c 500 -i 10 -uroot -p1234.com done

运行此脚本 ,然后导致mysql连接数过多无法连接,多试几次确定无法连接 再用gdb工具测试

发表评论

表情:
评论列表 (有 0 条评论,819人围观)

还没有评论,来说两句吧...

相关阅读