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

这篇具有很好参考价值的文章主要介绍了从一些常见的错误聊聊mysql服务端的关键配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

每一年都进行大促前压测,每一次都需要再次关注到一些基础资源的使用问题,订单中心这边数据库比较多,最近频繁报数据库异常,所以对数据库一些配置问题也进行了研究,本文给出一些常见的数据库配置,说明这些配置对我们数据库使用的影响。目前,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服务端配置官网

作者:京东零售 姜昌伟

来源:京东云开发者社区 转载请注明来源文章来源地址https://www.toymoban.com/news/detail-664106.html

到了这里,关于从一些常见的错误聊聊mysql服务端的关键配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • #SQL常见错误信息表 mysql导入数据出错常见错误

    mysql的出错代码表,根据mysql的头文件mysql/include/mysqld_error.h整理而成。错误之处,请大家指正。 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败 1008:数据库不存在,删除数据库失败 1009:不能删除数据库文件导致删除数据库失败 1010:不能删除数

    2024年02月16日
    浏览(41)
  • ROS下配置OpenCV+一些错误解决(段错误,核心已转储)

    进入opencv文件夹,创建编译文件夹 选择OpenCV 源码所在路径 和 编译文件所在路径 ,单击【Configure】按钮,默认选项即可,单击【Finish】后,在cmake界面会出现很多变量。 BUILD_opencv_world和OPENCV_ENABLE_NONFREE两个变量,在其后面的方框上打勾。 OPENCV_EXTRA_MODULES_PATH变量,选择路径为

    2024年03月17日
    浏览(46)
  • 一些常见的端口服务及其可能存在的漏洞

    端口号 端口服务 可能存在的漏洞 20 FTP服务的数据传输端口 21 FTP服务的连接端口 可能存在弱口令暴力破解 22 SSH服务端口 可能存在弱口令暴力破解 23 Telnet端口 可能存在弱口令暴力破解 25 SMTP简单邮件传输协议端口 43 whois服务端口 53 DNS服务端口 67/68 DHCP服务端口 69 TFTP端口 可

    2024年02月09日
    浏览(40)
  • Zabbix服务器一些常见问题及处理

    如果您的Zabbix服务器无法启动,请首先检查Zabbix服务器的配置文件是否正确,以及Zabbix服务器使用的端口是否被其他进程占用。您可以使用以下命令检查端口是否被占用: 如果端口被占用,请关闭占用该端口的进程或使用其他可用端口。 如果您的Zabbix服务器无法连接到数据

    2024年02月11日
    浏览(50)
  • mysql常见错误汇总

    可以在查询选择列表中使用别名为列提供 不同名称。可以使用 、 或子句中的别名来引用该列: GROUP BY ORDER BY HAVING 标准 SQL 不允许在子句中引用列别名。此限制是施加的 因为当评估子句时, 列值可能尚未确定。 例如,以下查询是非法的: WHERE 子句确定哪些行 应包含在条款

    2024年02月13日
    浏览(41)
  • ElasticSearch服务端及客户端的密码修改配置(可实现)

       前提:我的ElasticSearch版本为7.5.2,是支持密码管理的。对于不支持的es版本可能需求查看一下其他的配置方式。然后我的Java项目是基于Spring Boot 2.3.4版本进行构建的,基于yml修改elastic的配置无法自动注入生效,故进行了手动对es的客户端用户/密码属性进行了填充。 1.首先我

    2024年02月06日
    浏览(34)
  • FRP内网穿透参数配置+服务器与客户端的简易配置+完整配置详解(Windows)

    有设备A,想访问处于局域网的设备C时,可以通过处在公网的设备B进行转发 前提条件:一个有公网IP的电脑,云服务器、有公网IPV4/6的设备均可,如果使用ipv6模式,那么设备BC都必须支持ipv6才行,ipv6地址除了bind_addr和server_addr,都要用[]括起来 本文基于:v0.48.0版本 官网: 官

    2024年02月05日
    浏览(52)
  • 微信小程序通过 node 连接 mysql——方法,简要原理,及一些常见问题

    博主自己在22年夏天根据课程要求做了一个小程序连接阿里云服务器的案例,在最近又碰到了相应的需求。 原参考文章:微信小程序 Node连接本地MYSQL_微信小程序nodejs连接数据库_JJJenny0607的博客-CSDN博客 ,还请多多支持原作者! 第二次尝试的时候已经熟练许多了,但是还是遇到

    2024年02月03日
    浏览(41)
  • 【教程】一些服务器常见漏洞的修复方法,亲测超详细

    目录 漏洞名称解释 Apache漏洞——卸载Apache2(可能不适用于大家) CVE-2020-15778——禁用SCP CVE-2020-15778、CVE-2016-2183、CVE-2021-41617、CVE-2014-0160、CVE-2020-12062、CVE-2021-28041、CVE-2016-6515——升级openssl和openssh 安装编译环境所需的工具 然后编译升级openssl 之后编译升级openssh CVE-2018-1905

    2024年02月08日
    浏览(50)
  • kettle连接MySql启动报错常见错误解决

    连接MySql数据库 报错一 报错原因:这个报错的原因是因为当前的kettle目录下没有需要连接的数据库驱动,所以我们需要下载一个驱动放到他的lib包里重新启动即可,我创建的是mysql连接所以需要mysql连接驱动 解决方法: maven仓库下载合适的启动jar包,我选择的是下载人数最多

    2024年02月08日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包