• MySQL自我保护参数


    上文(MySQL自我保护工具--pt-kill ) 提到用pt-kill工具来kill相关的会话,来达到保护数据库的目的,本文再通过修改数据库参数的方式达到阻断长时间运行的SQL的目的。

    1、参数介绍

    mysql5.6及以后,数据库端新增了新变量来限制语句最大执行时间,用于在服务端对select语句进行超时时间限制,能有效控制在数据库(建议在主库)的慢查询情况,以达到保护数据库稳定性的目的。

    不过mysql5.7.8版本前后参数名有变更,例如:

    mysql5.6 - mysql5.7.8前的版本中,参数名为:max_statement_time (毫秒) 

    mysql5.7.8及以后,参数改成:max_execution_time (毫秒)

    另外,该参数有global 及session 2种级别,即可在部分会话中动态调整本会话的超时时间。

    2. 操作演示

    在测试环境建一张大表用来演示,该案例可查看历史文章或批量造数据实现。

    因当前基本都使用5.7及以后版本,因此本次使用MySQL5.7版本数据库进行演示。

    2.1 参数默认值

    mysql> show global variables like 'max_execution_time';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | max_execution_time | 0     |
    +--------------------+-------+
    1 row in set (0.01 sec)

    默认值为0,代表不限制最大执行时间。

    例如执行如下SQL时,运行3s+

    mysql> select  count(*) from  test1;
    +----------+
    | count(*) |
    +----------+
    | 21991575 |
    +----------+
    1 row in set (3.89 sec)

    2.2 修改参数演示

    修改

    mysql> set session   max_execution_time=1000;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show global variables like 'max_execution_time';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | max_execution_time | 0     |
    +--------------------+-------+
    1 row in set (0.01 sec)
    
    mysql> show  variables like 'max_execution_time';
    +--------------------+-------+
    | Variable_name      | Value |
    +--------------------+-------+
    | max_execution_time | 1000  |
    +--------------------+-------+
    1 row in set (0.00 sec)

    本会话的参数(session级别),演示本次会话的情况,这样不会影响其他会话的运行,如需整个实例调整,则修改全局变量即可。

    mysql> select  count(*) from  test1;
    ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded

    此时执行查询,则会因为超过1s而被中断

    PS:修改全局变量后,注意已经连接的会话是不生效的,另外,此参数,只对select起作用,对DDL及UPDATE、delete操作不生效,例如:

    mysql> set session   max_execution_time=1000;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> alter table test1 add tt int ;
    Query OK, 0 rows affected (25.65 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    3. 小结

    生产环境较常见的情况是业务代码已经超时退出了与数据库的交互,但是数据库里依旧运行着发起的SQL,如果频繁发起重试,则,慢SQL会越来越多,导致数据库负载高,影响稳定性及可用性。因此,建议部署pt-kill工具或者修改最大执行时间参数,避免长时间运行select语句运行。

    相对于pt-kill工具,修改参数的方式较便捷,但局限性较大,因此需要根据业务需要进行部署。

     
  • 相关阅读:
    互联网史上第一约架 罗永浩对话王自如
    The Open Group Announces Launch of the TOGAF® Standard, 10th Edition
    从零开始学PHP系列(0.1)语法简记
    QtQt使用鼠标钩子Hook(支持判断按下、弹起、滚轮方向)
    QtQPropertyAnimation的使用(支持放大、移动、透明动画)
    OsgOsgEarth加载在线地图(myMap.earth)
    关于UE4对象静态/动态的销毁问题整理(AddToRoot、TWeakObjectPtr)
    cesanta elk安装及测试
    RocketMQ的原理和实战!
    LINQ:GroupBy
  • 原文地址:https://www.cnblogs.com/gjc592/p/15666830.html
Copyright © 2020-2023  润新知