• 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工具,修改参数的方式较便捷,但局限性较大,因此需要根据业务需要进行部署。

     
  • 相关阅读:
    PAT 1006 Sign In and Sign Out
    PAT 1004. Counting Leaves
    JavaEE开发环境安装
    NoSql数据库探讨
    maven的配置
    VMWARE 下使用 32位 Ubuntu Linux ,不能给它分配超过3.5G 内存?
    XCODE 4.3 WITH NO GCC?
    在苹果虚拟机上跑 ROR —— Ruby on Rails On Vmware OSX 10.7.3
    推荐一首让人疯狂的好歌《Pumped Up Kicks》。好吧,顺便测下博客园可以写点无关技术的帖子吗?
    RUBY元编程学习之”编写你的第一种领域专属语言“
  • 原文地址:https://www.cnblogs.com/gjc592/p/15666830.html
Copyright © 2020-2023  润新知