首页 > 其他分享 >如何限制用户修改long_query_time

如何限制用户修改long_query_time

时间:2024-10-30 09:58:58浏览次数:6  
标签:thread variables long time VARIABLE query

如何限制用户修改long_query_time

需求来源

数据库的 long_query_time 设置了写入慢查询日志的SQL语句执行时长的阈值,当应用系统修改为很小的值或0时,会在数据库的慢查询日志中记录大量SQL语句,导致数据库性能降低和占用磁盘空间的快速增长。

GreatSQL 对于影响整个数据库会话级变量设置为受限会话变量(如:binlog_format,sql_log_bin和sql_log_off),同时增加了用户权限 SESSION_VARIABLES_ADMIN,只有授予了 SESSION_VARIABLES_ADMIN 的用户才能更改这些受限会话变量。

但 long_query_time 不在受限会话变量中,该如何限制应用程序修改 long_query_time 呢?

解决方法

performance_schema 中有表 variables_by_thread 存储了每个活动会话的会话级系统变量。可以编写一个event定时检查用户的long_query_time设置,如果与全局的long_query_time变量值不同,将该会话kill掉。

相关系统表:

#performance_schema下的系统表
#存储每个会话的会话级系统变量
greatsql> SHOW CREATE TABLE variables_by_thread\G
*************************** 1. row ***************************
       Table: variables_by_thread
Create Table: CREATE TABLE `variables_by_thread` (
  `THREAD_ID` bigint unsigned NOT NULL,
  `VARIABLE_NAME` varchar(64) NOT NULL,
  `VARIABLE_VALUE` varchar(1024) DEFAULT NULL,
  PRIMARY KEY (`THREAD_ID`,`VARIABLE_NAME`)
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

#存储全局的系统变量
greatsql> SHOW CREATE TABLE global_variables\G
*************************** 1. row ***************************
       Table: global_variables
Create Table: CREATE TABLE `global_variables` (
  `VARIABLE_NAME` varchar(64) NOT NULL,
  `VARIABLE_VALUE` varchar(1024) DEFAULT NULL,
  PRIMARY KEY (`VARIABLE_NAME`)
) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

event程序的实现:

DELIMITER $$
CREATE EVENT check_session_long_query_time
ON SCHEDULE EVERY 5 SECOND
DO
BEGIN
    DECLARE v_processlist_id BIGINT UNSIGNED;
    DECLARE done INT DEFAULT FALSE;
    DECLARE cur CURSOR FOR
        SELECT t.PROCESSLIST_ID
        FROM performance_schema.variables_by_thread v
        inner join performance_schema.threads t on v.thread_id=t.thread_id
        WHERE v.VARIABLE_NAME = 'long_query_time' 
        AND v.VARIABLE_VALUE != (select VARIABLE_VALUE from performance_schema.global_variables where 
        VARIABLE_NAME = 'long_query_time' ) ;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    OPEN cur;
    read_loop: LOOP
        FETCH cur INTO v_processlist_id ;
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- 终止连接
        KILL v_processlist_id ;
    END LOOP;
    CLOSE cur;
END$$
DELIMITER ;

总结

通过kill会话来限制用户修改会话级变量,有些暴力,但也是DBA的无奈手段。较好的方式是修改受限系统变量实现方法,将受限的会话变量做成一个可动态添加的列表,如在某个系统表中予以存储,DBA可以通过添加和删除数据行来动态修改受限会话变量。MySQL开源版本也存在同样的问题,MySQL 社区已确认作者提的feature request《Optimize the handling of SESSION_VARIABLES_ADMIN permission(https://bugs.mysql.com/bug.php?id=115944)》。


Enjoy GreatSQL

标签:thread,variables,long,time,VARIABLE,query
From: https://www.cnblogs.com/greatsql/p/18515195

相关文章

  • jQuery框架
    jQuery语法jQuery语法是通过选取HTML元素,并对选取的元素执行某些操作。基础语法:$(selector).action()美元符号定义jQuery选择符(selector)"查询"和"查找"HTML元素jQuery的action()执行对元素的操作实例:$(this).hide()-隐藏当前元素$("p").hide()-隐藏所......
  • IC-GVINS: A Robust, Real-Time, INS-Centric GNSS-Visual-Inertial Navigation Syste
    IC-GVINS:ARobust,Real-Time,INS-CentricGNSS-Visual-InertialNavigationSystemIC-GVINS:一种稳健的实时以惯性导航系统为中心的全球导航卫星系统视觉惯性导航系统XiaojiNiu${}^{\circledR}$,HailiangTang${}^{\circledR}$,TishengZhang${}^{\circledR......
  • C# 获取utc时间,以及utc datetime 互相转化
     C#获取utc时间,以及utcdatetime互相转化 大部分源于http://blog.sina.com.cn/s/blog_4c6e822d0102dsdz.html 刚开始学习一点C#知识,研究一下UTC时间获取,如下DateTimedt=DateTime.UtcNow;另:DateTime.UtcNow.ToString()输出的是0时区的事件,DateTime.Now.ToStr......
  • api 接口 验证 timestamp 接口api测试
    接口(API)测试没有总结,就不能认识自己,就不知成功在哪里,失败在哪里;没有思考,就没有提高,没有进步自动化测试分层【什么是API】API是ApplicationProgrammingInterface的简写。实现了两个或多个独立系统或模块间的通信和数据交换能力。【什么是API测试】API测试不同于UI自......
  • 使用AMD GPU和ONNX Runtime高效生成图像与Stable Diffusion模型
    EfficientimagegenerationwithStableDiffusionmodelsandONNXRuntimeusingAMDGPUs2024年2月23日撰写,作者[道格拉斯·贾(DouglasJia)](DouglasJia—ROCmBlogs)在这篇博客中,我们将向您展示如何使用预训练的StableDiffusion模型,通过ONNXRuntime在AMDGPU上生成......
  • jQuery操作(删除内容)
    删除内容:使用`remove()`方法来删除指定的元素及其所有子元素。以下是一些常见的用法示例:删除单个元素假设你有一个HTML结构如下:<divic=”content”><p>Thisisaparagraph.</p></div>//要添加一些属于想要删除的按钮你可以使用以下jQuery代码删除该段......
  • jQuery的复制内容
    1.clone()clone()方法用于复制匹配的DOM元素,并可以选择是否复制事件处理程序。语法:$(selector).clone([withDataAndEvents])//withDataAndEvents(可选):布尔值,如果为 true,则复制元素的所有数据和事件处理程序。 示例:<divid="original"><p>这是一个段落。</p></div><bu......
  • 如何解决VMware 安装Windows10系统出现Time out EFI Network
    一、问题描述使用VMware17安装windows10出现如下图所示TimeoutEFINetwork…Windows10镜像为微软官方下载的ISO格式镜像;二、问题分析VMware17默认的固件类型是UEFI(E),而微软官网下载的Windows10ISO格式镜像不支持UEFI(E),支持BIOS(B),将固件类型更改为BIOS(B)即可。三......
  • 2024-10-26:最长公共后缀查询。用go语言,给定两个字符串数组 wordsContainer 和 wordsQu
    2024-10-26:最长公共后缀查询。用go语言,给定两个字符串数组wordsContainer和wordsQuery,要对每个wordsQuery[i]找到一个与其有最长公共后缀的字符串。如果有多个字符串与wordsQuery[i]有相同的最长公共后缀,则返回在wordsContainer中最早出现的那个。最后,返回一个整数数组a......
  • 【SQL 性能分析的4种详细贯通方法】Com______;慢查询日志slow_query_log;profile;explain
    SQL性能分析是一个多维度的过程,涉及到对数据库操作的监控、诊断和优化。以下是使用四种方法详细且连贯地描述SQL性能分析的过程:1.Com_xxx计数器分析MySQL提供了Com_xxx状态变量,用于跟踪不同类型的SQL语句被执行的次数。这些计数器可以帮助我们了解数据库的使用模式和负......