针对mysql的连接参数和状态值,本文做些介绍和对比

一、MYSQL连接参数变量

1、常用连接数限制参数

show variables like '%connect%';

| max_connect_errors |  |      ##允许单用户连接错误最大值,超过后在不刷新状态的情况下,禁止该用户新连接
| max_connections | |           ##实例最大连接数限制
| max_user_connections | |          ##但用户连接最大限制,默认0表示无限制,遵守总连接数小于等于max_connections
| connect_timeout | |         ##用户连接超时限制,超过10秒,如果依旧无法连接到mysql,则终止连接

2、超时参数

mysql -e "show variables  like '%timeout%'"

+-----------------------------+----------+
| connect_timeout | 10 |    ##连接超时,10秒
| delayed_insert_timeout | 300 |    ##延迟插入超时时间,300秒
| have_statement_timeout | YES |    ##
| innodb_flush_log_at_timeout | 1 |    ##刷新redo log buffer超时时间,1秒
| innodb_lock_wait_timeout | 120 |    ##事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败,120秒
| innodb_rollback_on_timeout | ON |
| interactive_timeout | 28800 |    ##mysql客户端交互连接超时时间,默认8小时,用于控制sleep超时
| lock_wait_timeout | 31536000 |    ##主要针对DDL产生的metadata locks超时时间
| net_read_timeout | 60 |    ##网络读取数据超时时间,60秒
| net_write_timeout | 60 |    ##为网络写入数据超时间60秒
| rpl_stop_slave_timeout | 31536000 |    ##停止从库服务超时时间
| slave_net_timeout | 60 |    ##slave网络超时时间
| thread_pool_idle_timeout | 60 |
| wait_timeout | 28800 |    ##jdbc/odbc连接超时时间,默认8小时,用于控制sleep超时
+-----------------------------+----------+

二、MySQL连接状态变量

1、常用链接状态变量

show global status like '%connect%';

+-----------------------------------------------+----------+
| Connection_errors_max_connections | 1906160 |    ##用户最大错误连接数
| Connections | 87341259 |    ##历史用户连接累积值
| Max_used_connections | 10242 |    ##历史最大连接用户数,processlist看到的连接数
| Threads_connected | 298 |    ##当前用户连接数,当前processlist数

show global status like '%Threads_running%';

| Threads_running | 2     |                        ##当前用户连接处于running状态的数目,非sleep

show global status like '%abort%';

+------------------+----------+
| Aborted_clients | 85050948 |                      ##非法终止客户端连接的状态统计,例如通过kill终止连接
| Aborted_connects | 1905528 |                      ##非法连接操作状态统计,例如用户密码错误

三、常见问题分析

1、最大连接数超出限制

动态调整最大连接参数变量,然后通过连接尝试

mysql> set global max_connections=2;
[root@localhost ~]# mysql
ERROR 1040 (HY000): Too many connections
##此时连接超出的尝试,不会经过权限验证,因此不会记录Aborted_connects变量值

如遇到此问题即表示用户连接超出了最大连接限制,需要增大连接数

mysql> set global max_connections=350;
##动态调整后,需要将/etc/my.cnf配置参数中的max_connections=350也要做相应调整,这个参数可以根据状态量值Max_used_connections 评估

2、用户连接错误数超出限制

动态调整最大连接错误数变量限制,然后通过尝试失败登录,主机对应的普通用户会被阻塞,超级用户不限

max_connect_errors官方解释如下:

If more than this many successive connection requests from a host are interrupted without a successful connection, 
the server blocks that host from further connections. You can unblock blocked hosts by flushing the host cache. To do so, issue a FLUSH HOSTS statement or execute a mysqladmin flush-hosts command. If a connection is established successfully within fewer than max_connect_errors attempts after a previous connection was interrupted,
the error count for the host is cleared to zero. However, once a host is blocked, flushing the host cache is the only way to unblock it.
The default is 100.

手动调整参数测试(telnet 10.1.0.1 3306 五次断链,用户会被锁)

mysql> set global max_connect_errors=5;

通过测试发现用户直接错误密码连接,不会导致用户被锁,主要通过performance_schema下的host_cache表查看相关阻塞信息

mysql> select IP,HOST,HOST_VALIDATED,SUM_CONNECT_ERRORS ,COUNT_HANDSHAKE_ERRORS,COUNT_HOST_BLOCKED_ERRORS   from host_cache;
+----------------+-------+----------------+--------------------+------------------------+---------------------------+
| IP | HOST | HOST_VALIDATED | SUM_CONNECT_ERRORS | COUNT_HANDSHAKE_ERRORS | COUNT_HOST_BLOCKED_ERRORS |
+----------------+-------+----------------+--------------------+------------------------+---------------------------+
| 10.1.0.1 | NULL | NO | 0 | 5 | 0 |
| 10.1.0.100 | node1 | YES | 0 | 0 | 0 |
+----------------+-------+----------------+--------------------+------------------------+---------------------------+

哪些连接会导致用户被锁?导致必须通过flush hosts释放host_cache,具体如下:

| COUNT_NAMEINFO_TRANSIENT_ERRORS            | bigint(20)       | NO   |     | NULL                |       |
| COUNT_NAMEINFO_PERMANENT_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_FORMAT_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_ADDRINFO_TRANSIENT_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_ADDRINFO_PERMANENT_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_FCRDNS_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_HOST_ACL_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_NO_AUTH_PLUGIN_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_AUTH_PLUGIN_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_HANDSHAKE_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_PROXY_USER_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_PROXY_USER_ACL_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_AUTHENTICATION_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_SSL_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_MAX_USER_CONNECTIONS_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_MAX_USER_CONNECTIONS_PER_HOUR_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_DEFAULT_DATABASE_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_INIT_CONNECT_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_LOCAL_ERRORS | bigint(20) | NO | | NULL | |
| COUNT_UNKNOWN_ERRORS | bigint(20) | NO | | NULL | |

解决方法就是:flush hosts或mysqladmin flush-hosts

mysql> select ip,host,HOST_VALIDATED,SUM_CONNECT_ERRORS ,COUNT_HANDSHAKE_ERRORS,COUNT_HOST_BLOCKED_ERRORS   from host_cache;
+----------------+-------+----------------+--------------------+------------------------+---------------------------+
| ip | host | HOST_VALIDATED | SUM_CONNECT_ERRORS | COUNT_HANDSHAKE_ERRORS | COUNT_HOST_BLOCKED_ERRORS |
+----------------+-------+----------------+--------------------+------------------------+---------------------------+
| 10.1.0.1 | NULL | NO | 0 | 5 | 0 |
| 10.1.0.100 | node1 | YES | 0 | 0 | 0 |
+----------------+-------+----------------+--------------------+------------------------+---------------------------+
2 rows in set (0.00 sec) mysql> flush hosts;
Query OK, 0 rows affected (0.00 sec) mysql> select ip,host,HOST_VALIDATED,SUM_CONNECT_ERRORS ,COUNT_HANDSHAKE_ERRORS,COUNT_HOST_BLOCKED_ERRORS from host_cache;
Empty set (0.00 sec)

3、aborted连接值非常高

abort连接状态值主要有两个,分别是 Aborted_clients和Aborted_connects,其中两个变量值含义如下:

Aborted_clientsThe number of connections that were aborted because the client died without closing the connection properly. 

Aborted_connects:The number of failed attempts to connect to the MySQL server

下面的状态变量主要是用户最大连接超过后,有多少尝试连接的错误统计:

Connection_errors_max_connections:The number of connections refused because the server max_connections limit was reached

Aborted_clients和Aborted_connects参数对比,两个状态值在什么情况下会变化?

Aborted_clients主要是因为客户端非正常关闭,次值就会不断增加,具体场景如下:

()手动杀死连接,kill的方式
()mysql客户端超时interactive_timeout,结束sleep
()程序超时wait_timeout,异常结束sleep
(4)The client program did not call mysql_close() before exiting.
(5)The client program ended abruptly in the middle of a data transfer.

Aborted_connects主要是连接Mysql失败的次数,具体场景如下:

()用户名密码错误
()登陆权限不足
(3)连接超时,connect_timeout
(4) max_allowed_packet variable value is too small or queries require more memory than you have allocated for mysqld

针对aborted连接非常高,首先判断是aborted_clients还是aborted_connects,然后具体情况具体分析,如果是aborted_connects可以通过tcpdump和error log日志判断具体连接失败、导致abort的主机、用户等信息。

tcpdump -s 1500 -w tcp.out port 3306

tcpdump参数选项如下:
()tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
()-i eth1 : 只抓经过接口eth1的包
()-t : 不显示时间戳
()-s : 抓取数据包时默认抓取长度为68字节。加上-S 后可以抓到完整的数据包
()-c : 只抓取100个数据包
()dst port ! : 不抓取目标端口是22的数据包
()src net 192.168.1.0/ : 数据包的源网络地址为192.168.1./
()-w ./target.cap : 保存成cap文件,方便用ethereal(即wireshark)分析

4、连接数不断增加

mysql连接数有时候会不断增加,这种情况一般由以下几种原因

()长连接,processlist不断递增
()连接池初始化设置过大,程序不关闭连接,只增加连接

解决方案:调整sleep合理超时时间;检查程序代码,确定是否关闭数据库连接操作;检查连接池配置,调整合适的初始化连接值和最大连接值

MYSQL连接相关参数和状态值详解的更多相关文章

  1. MySQL my.cnf参数配置优化详解

    [b]PS:本配置文件针对Dell R710,双至强E5620.16G内存的硬件配置.CentOS -100-300w的站点,主要使用InnoDB存储引擎.其他应用环境请根据实际情况来设置优化.[/b ...

  2. MySQL复制相关参数详解

    MySQL复制相关参数详解 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.复制相关系统变量 1>.server_id 是必须设置在master和每个slave上的唯一标 ...

  3. 【转】MySQL用户管理及SQL语句详解

    [转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...

  4. (转)总结之:CentOS 6.5 MySQL数据库的基础以及深入详解

    总结之:CentOS 6.5 MySQL数据库的基础以及深入详解 原文:http://tanxw.blog.51cto.com/4309543/1395539 前言 早期MySQL AB公司在2009 ...

  5. (转)MySQL性能调优my.cnf详解

    MySQL性能调优my.cnf详解 https://blog.linuxeye.cn/379.html http://blog.csdn.net/orichisonic/article/details ...

  6. MYSQL之数据库初识、安装详解、sql语句基本操作

    目录 MYSQL之数据库初识及安装详解 1.什么是数据库? 1.什么是数据?(data) 2.什么是数据库?(databases,简称DB) 2.为什要用数据库? 3.什么是数据库管理系统?(Data ...

  7. linux dmesg命令参数及用法详解(linux显示开机信息命令)

    linux dmesg命令参数及用法详解(linux显示开机信息命令) http://blog.csdn.net/zhongyhc/article/details/8909905 功能说明:显示开机信 ...

  8. MySql绿色版配置及使用详解

    原文:MySql绿色版配置及使用详解 最近在做项目开发时用到了MySql数据库,在看了一些有关MySql的文章后,很快就上手使用了.在使用的过程中还是出现了一些问题,因为使用的是绿色免安装版的MySq ...

  9. MySQL数据库使用mysqldump导出数据详解

    mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数 ...

随机推荐

  1. Restful API学习笔记

    之前关于这个概念在网上看了一些,看完似懂非懂,模模糊糊,发现专业术语或者说书面表达的形式对于理解这种十分抽象的概念还是低效了点. 书面文档方面看了以下几个: 理解本真的REST架构风格 1. 要深入理 ...

  2. linux 内存介绍

    linux用free -m 查看linux内存使用情况 具体参数如下: Mem:内存的使用情况总览表. totel:机器总的物理内存 单位为:M used:用掉的内存. free:空闲的物理内存. 物 ...

  3. Web性能优化之雅虎军规

    相信互联网已经越来越成为人们生活中不可或缺的一部分.Ajax,flex等等富客户端的应用使得人们越加“幸福”地体验着许多原先只能在C/S实 现的功能. 比如Google机会已经把最基本的office应 ...

  4. 游戏中的网络同步机制——Lockstep(帧同步)

    本文来自: https://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockste ...

  5. linux信息查看手记

    系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...

  6. 原创:微信小程序亲测体验,公众号入口曝光!

    扫描即可体验知乐微信小程序,并且看到入口 你可以在这里看到相应的小程序:微信小程序商店 发现内有历史列表入口 真实小程序 搜索 操作栏 放置到桌面示意图必须搜索全称,才可以搜索到小程序 推荐给朋友,可 ...

  7. T-SQL 备份和还原数据库

    --完整备份  Backup   Database   db_database  To disk='D:\Backup\db_database_Full.bak'   --差异备份  Backup   ...

  8. 2.VS2012为创建的类添加注释的模板

    在项目中给类添加注释的优点: 1.方便查看这个类是为了那些功能 2.是成员小组中的谁负责编写的 根据自己的vs的安装路径找到类模板的位置:D:\Program Files (x86)\Microsof ...

  9. Nuxt.js学习心得

    一.官网 Nuxt.js - Universal Vue.js Applications https://nuxtjs.org/ 二.中文官网 Nuxt.js - Vue.js 通用应用框架 http ...

  10. webpack使用extract-text-webpack-plugin打包时提示错误Use Chunks.groupsIterable and filter by instanceof Entryp

    转自:https://blog.csdn.net/gezilan/article/details/80020417 前提条件: 当前时间是2018年4月20日. webpack的最新版本为是 v4.6 ...