从一些常见的错误聊聊mysql服务端的关键配置

一些,常见,错误,聊聊,mysql,服务,端的,关键,配置 · 浏览次数 : 175

小编点评

**1. too many connections 数据库服务端配置:max_connections** * max_connections 设置过大会导致数据库连接数超过限制阈值,出现数据库异常。 * 解决方案:降低 max_connections 设置值,例如设置 1000,表示允许的最大连接数为 1000 个。 **2. 慢日志长时间执行导致服务不可用数据库库服务端配置** * slow_query_log 设置过长会导致查询性能下降,影响数据库性能。 * 解决方案:降低 slow_query_log 的值,例如设置为 2 或 5 秒。 **3. 服务端连接都断开了,但是客户端还用无效连接发送请求数据库库服务端配置** * 客户端在空闲连接探活期间,由于连接断裂,无法正常连接到数据库。 * 解决方案:设置 wait_timeout 属性的值,例如设置为 10 秒,表示等待客户端连接到数据库服务器的超时时间。

正文

背景

每一年都进行大促前压测,每一次都需要再次关注到一些基础资源的使用问题,订单中心这边数据库比较多,最近频繁报数据库异常,所以对数据库一些配置问题也进行了研究,本文给出一些常见的数据库配置,说明这些配置对我们数据库使用的影响。目前,MySQL服务端配置对使用方来说是不可更改的,需要联系DBA进行操作。这些配置操作对我们来说是一个黑盒,但是了解核心配置可以帮助我们快速定位数据库问题原因。

问题汇总

问题一、too many connections

数据库服务端配置:max_connections
这个问题我们这边线上遇到过,对于同一个数据库,有多个系统都连接了数据库,导致连接数据库的机器比较多,在数据库qps比较大时,创建的连接数比较大,导致连接的总数超过了数据库服务端连接的限制阈值,从而报了这个错误。

举个栗子:如果max_connections设置为1000,我们这边有200台机器,每台机器最大连接数为20,在连接比较大时,可能大致连接的总数为200 * 20 = 4000 > 1000,超过数据库的限制。

下面让我们在本地演示一下这种错误:

首先查询当前服务端最大连接数:

如果这个参数太大,不好演示的话,可以通过如下参数,将这个数值改小些

下面通过客户端尝试连接数据库,可以看到,直接报错了

对于这种问题有两种解决办法:
第一种:联系DBA将max_connections设置的大一些,DBA之前反馈max_connections这个参数有自动增长的逻辑;
第二种方法:如果数据库操作qps并不是很大,可以将每台机器的数据库连接最大值设置小一些,如果设置了初始化连接大小,要考虑机器数的增长,随着机器数的增长,连接的总数肯定会递增的。

问题二、慢日志长时间执行导致服务不可用

数据库库服务端配置:max_execution_time
之前写了一篇文章聊了一下如何在客户端配置参数解决慢日志长时间执行问题,这个在本地验证是没有问题的,但是由于我们线上环境使用的是JED,JED的架构多了中间代理层,在客户端执行KILL QUERY CONNECTION_ID会提示失败,导致没法停止慢sql(这个好坑,据说JED后期会优化这个问题)。

既然目前客户端没法控制慢sql停止,从官网上看了一下mysql服务端的配置参数,发现有一个参数能够控制服务端主动超时停止sql,参数变量:max_execution_time,本地环境验证如下:

首先将sql执行超时时间设置为2s:

然后执行一个sleep函数,让执行时间达到10s,可以看出来执行直接中断了,因为超过了2s的最大超时时间:

问题三、服务端连接都断开了,但是客户端还用无效连接发送请求

数据库库服务端配置:wait_timeout
之前线上用的是mysql,通过mysql驱动包直连数据库,数据库服务端默认连接空闲时间是8小时,后来响应公司号召,将传统的mysql切到了jed(底层也是mysql), jed由于网关层的存在,客户端是通过mysql驱动包跟网关层进行直连,网关这一层数据库空闲连接超时时间仅仅10分钟,当时在客户端进行空闲连接探活时间超过10分钟,导致数据库报错频繁。现在已经找不到历史的数据库异常日志了,本地模拟了一下,验证如下:

先将本地空闲连接超时设置为10s

验证源码如下,让两条sql执行时间超过10s,可以发现第二次执行sql时执行报错了

所以,如果换了数据源,需要确认下服务端的空闲连接超时时间设置,免得配置的值和客户端检测空闲连接健康性检测间隔不匹配,出现意料不到的结果。

注:我们这边使用的是DBCP数据源连接池,配置如下:

<bean id="abstractParallelProductWriteDataSource" class="org.apache.commons.dbcp.BasicDataSource" abstract="true" destroy-method="close" init-method="createDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="username" value="${db.online.write.username}" />
        <property name="password" value="${db.online.write.password}" />
        <property name="initialSize" value="3" />
        <property name="minIdle" value="3" /><!--最小链接数 -->
        <property name="maxIdle" value="3" /><!--最大链接数 -->
        <property name="maxActive" value="8" /><!--最大活跃链接数 -->
        <property name="maxWait" value="200" />
        <property name="validationQuery" value="select 1" />
        <property name="testOnBorrow" value="false" />
        <property name="removeAbandonedTimeout" value="10" />
        <property name="removeAbandoned" value="true" />
        <!-- 池中的连接空闲10分钟后被回收,默认值就是30分钟 -->
        <property name="minEvictableIdleTimeMillis" value="600000" />
        <!-- 每5分钟运行一次空闲连接回收器 -->
        <property name="timeBetweenEvictionRunsMillis" value="300000" />
        <!--指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除 -->
        <property name="testWhileIdle" value="true"/>
        <!--在每次空闲连接回收器线程(如果有)运行时检查的连接数量,默认值是3 -->
        <property name="numTestsPerEvictionRun" value="5"/>
    </bean>


timeBetweenEvictionRunsMillis这个参数配置的是检测空闲连接的间隔时间,如果服务端空闲连接10分钟就断开了,这个时间需要小于10分钟。minEvictableIdleTimeMillis这个时间是判断当前连接已经空闲了多久了,目前配置的是10分钟。

其他关键配置汇总

  1. thread_handling
    配置了服务端的线程处理模型,主要的值有no-threads、one-thread-per-connection、loaded-dynamically。其中no-threads表示同一时刻只能有一个连接被一个线程处理。one-thread-per-connection表示对于每一个连接请求都有一个线程来处理。loaded-dynamically是mysql的线程池模式,目前默认的是one-thread-per-connection,所以连接太多的话,也会导致创建的线程快速增加,消耗系统的资源。

  2. slow_query_log
    用来控制是否打印慢日志,如果需要分析系统性能情况,可以打开这个开关,进行慢日志分析。

  3. profiling
    是否启用sql查询性能分析,类似于debug日志,线上环境需要关闭,比较耗性能,这个参数后面mysql版本会废弃掉,现在还是可以先使用着,新的使用方式可以参考:https://dev.mysql.com/doc/refman/8.0/en/performance-schema-query-profiling.html。

由于这个参数线上是关闭着,只能让DBA临时帮忙查询下分析结果,平常也没咋用,感觉还是一个不错的工具,分析结果类似下面截图:

总结

mysql服务端配置太多,目前工作中主要接触了上述这些配置,感觉还不错的,在平常分析数据库问题上能够给予一定的帮助,大家也可以去多了解一下,更多的配置可以参考官方文档:mysql服务端配置官网

作者:京东零售 姜昌伟

来源:京东云开发者社区 转载请注明来源

与从一些常见的错误聊聊mysql服务端的关键配置相似的内容:

从一些常见的错误聊聊mysql服务端的关键配置

MySQL服务端配置对使用方来说是不可更改的,需要联系DBA进行操作。这些配置操作对我们来说是一个黑盒,但是了解核心配置可以帮助我们快速定位数据库问题原因。

kettle从入门到精通 第七十课 ETL之kettle kettle数据校验,脏数据清洗轻松拿捏

场景:输入在指定的错误(错误应涵盖数据类型不匹配的情况)行数内,trans不报错,但通过错误处理步骤捕捉,并记入文件,整个数据管线正常完成直至处理完最后一个输入行。 解决方案:使用步骤【数据检验】进行处理。这个步骤和常规的业务系统对接三方接口一个逻辑,将符合规则的数据放行,不符合的记录。 数据准备(

Spring框架中的设计模式(重点学习!!!)

# Spring中的设计模式 Spring框架中用到的设计模式有很多,以下是一些常见的设计模式: 1. 依赖注入(DI)和控制反转(IoC):这是Spring框架最核心的设计模式,它允许开发人员将对象之间的依赖关系从代码中抽离出来,由Spring容器负责管理和注入对象之间的依赖关系。 2. 工厂模式

随机数漫谈

随机数对程序设计来说很重要,今天就从几方面探讨下一些常见的随机数相关的问题。 本文只讨论整数相关的随机数,另外需要你对概率论有最基本的了解(至少知道古典概型是什么)。 本文索引 如何从rand7生成rand5 go标准库的做法 从rand5生成rand7 充分利用每一个bit 带有权重的随机数 随机

一文搞懂drag&drop浏览器拖放功能的实现

拖放功能,即将一个元素从一个区域,通过拖拽,放置到另一个区域。常见的应用是将文件或图片从一个区域,拖放到另一个区域。中文常常把这表述成拖拽,实际上拖拽的描述并不准确,应该叫拖放,因为drag事件和drop事件是成对使用的,即拖拽和放置。 drag在拖拽动作发生时触发,携带被拖拽元素的信息,drop在

MongoDB从入门到实战之MongoDB工作常用操作命令

前言: 上一章节我们快速的在Docker容器中安装了MongoDB,并且通过Navicat MongoDB可视化管理工具快速的连接、创建数据库、集合以及添加了文档数据源。这一章节我们主要是了解一下在日常工作中MongoDB一些常用的操作命令。 MongoDB从入门到实战的相关教程 MongoDB从入

从0到1构建基于自身业务的前端工具库

在实际项目开发中无论 M 端、PC 端,或多或少都有一个 utils 文件目录去管理项目中用到的一些常用的工具方法,比如:时间处理、价格处理、解析url参数、加载脚本等,其中很多是重复、基础、或基于某种业务场景的工具,存在项目间冗余的痛点以及工具方法规范不统一的问题

[转帖]kafka-console-ui v1.0.6发布

前言 kafka-console-ui 是一款web版的kafka管理平台,从第一次发布到现在已经两年了,断断续续也更新了7个版本了(v1.0.0~v1.0.6)。 一些常用的功能也陆续完善了不少,相对最新的kafka版本,某些功能上还是有所欠缺,当前支持的功能如下: 源码 github: http

[转帖]已经被废弃的 tcp_tw_recycle

最近准备自己动手部署测试kubernetes集群,注备写一个 hands on 的手册。突发奇想将 centos 原有的内核从3.10更新到了4.14版本,并执行一些常规的优化操作。没有想到在修改了 sysctl.conf 里面的一些参数,希望能对新的 kubernetes 性能有所帮助。 当我在其

阿里DataX极简教程

目录简介工作流程核心架构核心模块介绍DataX调度流程支持的数据实践下载环境执行流程引用 简介 DataX是一个数据同步工具,可以将数据从一个地方读取出来并以极快的速度写入另外一个地方。常见的如将mysql中的数据同步到另外一个mysql中,或者另外一个mongodb中。 工作流程 read:设置一