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

如何限制用户修改 long_query_time

时间:2024-11-09 17:57:07浏览次数:1  
标签:long bk time VARIABLE query com

如何限制用户修改 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)
bk.yjh9988.com/D30eq.wAP
bk.zcyxsm.com/meyl/0wSwf.Wap
bk.qcbysq.com/cliq/0wSwf.Wap
bk.bctiantuo.com/beyn/c4FSw.wAp
bk.shuixitech.com/beyn/D30eq.wAP
bk.szlcdpq.com/deyz/f8W4d.wAP
bk.hndsedu.com/c4FSw.wAp
bk.hndsedu.com/0wSwf.Wap
bk.hndsedu.com/D30eq.wAP
bk.chinabgroup.com/f8W4d.wAP
bk.szlcdpq.com/beyn/c5W4R.WAp
bk.wekochat.com/asd7/0wSwf.Wap
bk.lovehua99.com/jasl/0wSwf.Wap
bk.tanjiuspace.com/beyn/fX8Xw.WaP
bk.51yjjy.com/beyn/D30eq.wAP
bk.kfamaw.com/c5W4R.WAp
bk.zcyxsm.com/meyl/c5W4R.WAp
bk.shuixitech.com/fX8Xw.WaP
bk.testoppo.com/asd7/f8W4d.wAP
bk.yjh9988.com/asd7/f8W4d.wAP

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

标签:long,bk,time,VARIABLE,query,com
From: https://www.cnblogs.com/XX-SHE/p/18537055

相关文章

  • 电脑中丢失 vcruntime140.dll 的五种解决方法
    vcruntime140.dll是MicrosoftVisualC++2015RedistributablePackage的一部分,它是一个动态链接库(DLL)文件,主要负责为使用了C++编译器编写的应用程序提供运行时支持。简而言之,vcruntime140.dll包含了程序运行所需的基础函数和数据结构,如内存管理、输入输出操作等。因此,对于很......
  • 44-best-time-to-buy-and-sell-stock-with-cooldown 力扣 309. 买卖股票的最佳时机包
    买卖股票系列【leetcode】40-best-time-to-buy-and-sell-stock力扣121.买卖股票的最佳时机【leetcode】41-best-time-to-buy-and-sell-stock-ii力扣122.买卖股票的最佳时机II【leetcode】42-best-time-to-buy-and-sell-stock-iii力扣123.买卖股票的最佳时机III【le......
  • 42-best-time-to-buy-and-sell-stock-iii 力扣 123. 买卖股票的最佳时机 III
    买卖股票系列【leetcode】40-best-time-to-buy-and-sell-stock力扣121.买卖股票的最佳时机【leetcode】41-best-time-to-buy-and-sell-stock-ii力扣122.买卖股票的最佳时机II【leetcode】42-best-time-to-buy-and-sell-stock-iii力扣123.买卖股票的最佳时机III【le......
  • ethereum.FilterQuery 日志查询处理自定义事件
    前言:在开发中也是遇到这个问题了,并非常见的Transfer,Approve等在ERC20中定义的事件,只要你的事件在sol文件中存在,那还好处理,但是如果不存在,刚开始接触的时候,你可能就有点懵,我也是找了两天,查阅了很多资料,并没什么niao用,偶然看见了区块浏览器中的log才恍然大悟。问题:Uniswa......
  • 为什么找不到vcruntime140_1.dll,无法继续执行代码的原因及五种有效解决方法
    vcruntime140_1.dll是微软VisualC++RedistributableforVisualStudio的一个动态链接库(DLL)文件。它是运行由VisualStudio2015及更高版本编译的C++应用程序所必需的。该DLL文件包含了支持C++标准库和Microsoft特定扩展功能的运行时函数,对于Windows应用程序......
  • win10找不到vcruntime140_1.dll,无法继续执行代码的解决方法
    vcruntime140_1.dll是微软VisualC++RedistributableforVisualStudio的一个动态链接库(DLL)文件。它是运行由VisualStudio2015及更高版本编译的C++应用程序所必需的。该DLL文件包含了支持C++标准库和Microsoft特定扩展功能的运行时函数,对于Windows应用程序......
  • DevExpress JS & ASP.NET Core v24.1亮点 - 支持DateOnly/TimeOnly类型
    DevExtreme拥有高性能的HTML5/JavaScript小部件集合,使您可以利用现代Web开发堆栈(包括React,Angular,ASP.NETCore,jQuery,Knockout等)构建交互式的Web应用程序。从Angular和Reac,到ASP.NETCore或Vue,DevExtreme包含全面的高性能和响应式UI小部件集合,可在传统Web和下一代移动应用程序中......
  • 112_api_intro_ai_sentiment-analysis
    多语言文本AI情感分析API数据接口AI/文本处理AI模型快速分析文本情感倾向多语言文本/情感分析。1.产品功能支持多语言文本情感分析;基于特定AI模型,快速识别文本情感倾向;适用于评论分析、舆情监控等场景;全接口支持HTTPS(TLSv1.0/v1.1/v1.2/v1.3);全面兼......
  • Fileheader 2.0.2 | times.h
    Downloadtimes.h提供了查询系统时间的通用方法class::times你可以通过声明一个class::times变量来调用查询系统时间timesa;cout<<a.year();//2024times返回的任何数据都是std::string类型的,你可以利用hdk::tool::to_number(std::string)[tool.h]来将其转为数......
  • 93_api_intro_finance_optionsrealtime
    期权实时行情数据最新价格、交易量、交易额等信息,期权行情实时数据,市场交易数据。1.产品功能实时更新期权市场数据;覆盖主要期权合约;支持多种数据参数,包括价格、交易量、持仓量等;提供详细的市场分析和数据解读;高效、稳定的数据获取体验;秒级查询性能;数据持续更新与维护;......