设置max_execution_time 来阻止太长的读SQL。那可能存在的问题是会把所有长SQL都给KILL 掉。有些必须要执行很长时间的也会被误杀。

自己写个脚本检测这类语句,比如order by rand(), 超过一定时间用Kill query thread_id 给杀掉。

那能不能不要杀掉而让他正常运行,但是又不影响其他的请求呢?

那mysql 8.0 引入的资源组(resource group,后面简写微RG)可以基本上解决这类问题。

比如我可以用 RG 来在SQL层面给他限制在特定的一个CPU核上,这样我就不管他,让他继续运行,如果有新的此类语句,让他排队好了。

为什么说基本呢?目前只能绑定CPU资源,其他的暂时不行。

那我来演示下如何使用RG。

创建一个资源组user_ytt. 这里解释下各个参数的含义,

type = user 表示这是一个用户态线程,也就是前台的请求线程。如果type=system,表示后台线程,用来限制mysql自己的线程,比如Innodb purge thread,innodb read thread等等。

vcpu 代表cpu的逻辑核数,这里0-1代表前两个核被绑定到这个RG。可以用lscpu,top等列出自己的CPU相关信息。

thread_priority 设置优先级。user 级优先级设置大于0。

mysqlmysql> create resource group user_ytt type = user  vcpu = 0-1 thread_priority=19 enable;Query OK, 0 rows affected (0.03 sec)

RG相关信息可以从 information_schema.resource_groups 系统表里检索。

mysqlmysql> select * from information_schema.resource_groups;+---------------------+---------------------+------------------------+----------+-----------------+| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |+---------------------+---------------------+------------------------+----------+-----------------+| USR_default         | USER                |                      1 | 0-3      |               0 || SYS_default         | SYSTEM              |                      1 | 0-3      |               0 || user_ytt            | USER                |                      1 | 0-1      |              19 |+---------------------+---------------------+------------------------+----------+-----------------+3 rows in set (0.00 sec)

我们来给语句select guid from t1 group by left(guid,8) order by rand() 赋予RG user_ytt。

mysql> show processlist;+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+| Id  | User            | Host      | db   | Command | Time  | State                  | Info                                                      |+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+|   4 | event_scheduler | localhost | NULL | Daemon  | 10179 | Waiting on empty queue | NULL                                                      || 240 | root            | localhost | ytt  | Query   |   101 | Creating sort index    | select guid from t1 group by left(guid,8) order by rand() || 245 | root            | localhost | ytt  | Query   |     0 | starting               | show processlist                                          |+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+3 rows in set (0.00 sec)

找到连接240对应的thread_id。

mysqlmysql> select thread_id from performance_schema.threads where processlist_id = 240;+-----------+| thread_id |+-----------+|       278 |+-----------+1 row in set (0.00 sec)

给这个线程278赋予RG user_ytt。没报错就算成功了。

mysqlmysql> set resource group user_ytt for 278;Query OK, 0 rows affected (0.00 sec)

当然这个是在运维层面来做的,我们也可以在开发层面结合 MYSQL HINT 来单独给这个语句赋予RG。比如:

mysqlmysql> select /*+ resource_group(user_ytt) */guid from t1 group by left(guid,8) order by rand()....8388602 rows in set (4 min 46.09 sec)

RG的限制:

Linux 平台上需要开启 CAPSYSNICE 特性。比如我机器上用systemd 给mysql 服务加上

systemctl edit mysql@80 [Service]AmbientCapabilities=CAP_SYS_NICE

mysql 线程池开启后RG失效。

freebsd,solaris 平台thread_priority 失效。

目前只能绑定CPU,不能绑定其他资源。

mysql command为sleep时项目可以连接_mysql数据库常连接造成大量sleep状态怎么办相关推荐

  1. mysql提示太多连接_mysql数据库提示连接太多怎么办

    mysql数据库提示连接太多的解决方法:1.登录mysql数据库,查看当前活动的连接线程变量值:2.编辑my.cnf配置文件,添加[[mysqld] port=3306]:3.重启mysql服务器. ...

  2. mysql command为sleep时项目可以连接_Mysql中Sleep进程连接数过多问题解决

    解决方法 批量删除 sleep 进程状态的连接数. 1).一种直接在MySQL命令控制台操作: mysql> show processlist; mysql> SELECT concat( ...

  3. mysql连接池永驻_【学习笔记】Oracle连接池 数据库常驻连接池(Database Resident Connection Pool)案例介绍...

    天萃荷净 分享一篇关于应用程序与Oracle数据库连接的连接方法介绍,数据库常驻连接池(Database Resident Connection Pool)案例介绍 一.介绍常驻连接池(Databas ...

  4. SharePoint服务器连接配置数据库的连接字符串保存位置

    摘自:http://kaneboy.blog.51cto.com/1308893/280585 经常有人问我这个问题,SharePoint服务器将连接配置数据库的连接字符串保存在什么地方?虽然其他Sh ...

  5. 使用OLE DB方式连接常用数据库的连接字符串的设置

    使用OLE DB方式连接常用数据库的连接字符串的设置 SQL Server 使用 OLE DB 所设置的连接字符串: 标准连接方式 Provider=sqloledb;Data Source=data ...

  6. mysql的内外连接_MYSQL的内外连接

    1.内联接(典型的联接运算,使用像 =  或 <> 之类的比较运算符).包括相等联接和自然联接. 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行.例如,检索 students和 ...

  7. mysql 什么时候用内连接_mysql显示内连接和隐式内连接的区别,什么时候非要用到显示内连接。...

    显式内连接就是使用inner join的办法,写起来复杂些 以windows版本mysql里自带的sakila数据库为例 显式内连接语法 select 字段名 from 表1 join 表2 on 连 ...

  8. c远程连接mysql数据库_MySQL数据库远程连接开启方法

    第一中方法:比较详细 以下的 文章 主要介绍的是 MySQL 数据库 开启远程连接的时机操作流程,其实开启MySQL 数据库远程连接的实际操作步骤并不难,知识方法对错而已,今天我们要向大家描述的是My ...

  9. 数据库mysql自然连接_MySQL数据库之多表查询natural join自然连接

    自然连接 概念 自动判断条件连接,判断的条件是依据同名字段 小结 表连接是通过同名字段来连接的 如果没有同名字段就返回笛卡尔积 同名的连接字段只显示一个,并且将该字段放在最前面 自然内连接(natur ...

最新文章

  1. 什么是php model类,thinkphp的自定义model类有什么作用?
  2. Java学习笔记二十五:Java面向对象的三大特性之多态
  3. Java Reflection(十):数组
  4. kill 进程_Node.js 进程平滑离场剖析
  5. 关于Redis的数据迁移(三种方法)
  6. linux shell中21的含义
  7. 介绍Spring Integration
  8. oracle deul,C#引用传递
  9. rm -rf误删文件的恢复(extundelete工具的使用)
  10. android 铃音制作工具,音乐剪辑铃声制作
  11. matlab变量全局化,matlab全局变量global
  12. kettle读取文本文件入库
  13. Vista系统Administrator帐户的激活与禁用
  14. 联想大数据“双拳”出击另有深意
  15. 【华人学者风采】郑宇 京东
  16. JSP停车场车位管理系统myeclipse开发oracle数据库BS模式java编程网
  17. 使用XML的方式导出EXCEL
  18. 最佳值换算法c语言,页面置换算法---最佳置换算法(OPT)
  19. 图论(八)——割边割点和块
  20. STC-ISP程序下载软件

热门文章

  1. 2021-2027全球与中国光刻胶湿式剥离台市场现状及未来发展趋势
  2. 【推荐】2020-2021 AI人工智能技术领域行业研究报告大合集(58份)
  3. FPGA学习日记(七)HDMI图像数据传输
  4. 偶遇GeoGebra
  5. GeoGebra笔记3:函数绘图区基本设置(x,y轴范围……)
  6. 全球及中国表面活性剂行业品牌运营状况与消费需求前景调研报告2022年
  7. Python-国内华为云下载一览表
  8. html中的面板样式,Dreamweaver中CSS样式面板
  9. Axure中动态面板和母版有什么区别
  10. linux创建word文件格式,WORD文档格式要求与linux学习规划