数据库 6年前

杀掉 MySQL 慢查询

作者头像 刘宇帅
4372 0

show processlist

show processlist 用来查看 MySQL 正在运行的线程,如果使用 root 账号可以看到所有用户的线程或者只能看到所使用账号自己的线程,当然如果该用户被赋予了 Process 权限也是可以查看所有用户的线程的。

命令使用展示:

mysql> show processlist;
+-----+------+-----------+------+---------+------+----------+------------------+
| Id  | User | Host      | db   | Command | Time | State    | Info             |
+-----+------+-----------+------+---------+------+----------+------------------+
| 214 | root | localhost | NULL | Query   |    0 | starting | show processlist |
| 215 | root | localhost | NULL | Sleep   |    3 |          | NULL             |
+-----+------+-----------+------+---------+------+----------+------------------+

各个字段意思:
Id: 进程id
User: 进程所属用户
Host: 发送请求的客户端
db: 当前进程正在处理哪个数据库的数据
Command: 当前正在执行的命令类型,点击查看详细信息
Time:当前线程处于当前状态的时间
State:线程的状态 点击查看详细信息
info:线程执行的语句

show processlist 默认只展示前 100 条线程,可以使用 show full processlist 展示所有线程。其实 show processlist 展示的 information_schema 库的 processlist 表中的数据,所以使用 sql 查询该表更容易对线程进行筛选过滤。

杀掉单个线程

根据 show processlist 结果找到想要杀掉的线程的 Id 如上面的 215:

kill 215;

杀掉多个线程

杀掉多个线程就需要使用 information_schema.processlist 表来做筛选,选出需要杀掉的线程。
比如杀掉处于"Query"状态的 10s 以上的线程
批量生成 kill 命令

> $ mysql -h 127.0.0.1 -u root  -P 3306 -e "select concat('kill ', id, ';') from information_schema.processlist where command = 'Query' and time > 10" -p > /tmp/test.sql

查看 sql 文件

> $ cat /tmp/test.sql
concat('kill ', id, ';')
kill 216;
kill 214;

然后删掉第一行的列名,就可以通过 source 批量杀死所有符合条件线程。
当然如果使用的是可视化工具直接导出结果再执行更简单。

作者头像

刘宇帅

非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。

提示

功能待开通!


暂无评论~

相关文章

常见数据库分类

常见的数据库主要分为三类,SQL(关系型数据库)、NoSQL(非关系型数据库)、NewSQL。 SQL SQL即关系型数据库(RDBMS — Relational Database Management System),SQL 是基于关系型数据模型设计的数据库,SQL用二维表格表示实体以及实体之间的关系,对数据的操作也几乎全部建立在一个或多个关系表格上,通过对这些关联的表格分组、合并、连接、选取等运算来实现数据库的管理。 常见的关系型数据库有: Orcale MySQL Microsoft SQL server PostgreSQL SQLLite MariaDB 关系型数据库特点 事务性

我是如何成功删库并手动进行数据恢复的

事情起因 有个同事需要一个管理系统,需要管理一些图片什么的,我就想着让他用我写的这套系统,然后就想着把代码和库复制一份出来给他用就可以了,然后我顺便可以把一些需要写到配置里的东西提炼下,让这套系统成为一个可复制部署的 CMS 系统。 实操删库过程 第一步 很熟练的把代码复制一份,nginx 配置复制并修改一份。 第二步:删库 登陆数据库 新建库、切到新建库 删库:因为我部署这个博客系统的时候有把初始化数据库的 sql 文件放到服务器上,我看了下还在。然后直接source init.sql。 3步完成之后,有种莫名的感觉涌上心头,然后打开我的博客,发现里面数据已经空了。。其实我这里使用了Ph

MySQL 字符串比较不区分大小写

最近做了一个简单的短链接服务,短链接使用自增 id 转化为 62 进制(10 个数字+26个小写字母+26个大写字母),但是发现插入数据库报了索引插入重复。 展示 创建测试表 CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `short_url` varchar(255) NOT NULL COMMENT '测试', PRIMARY KEY (`id`), UNIQUE KEY `short_url` (`short_url`) ) ENGINE=InnoDB AUTO_INCREMENT

SQL 查询如何按 in 后面的数组列表的顺序返回数据

今天要查询一个根据手机号返回用户的姓名,但是想要的 SQL 查询的结果的顺序和 in 后面数组里手机号顺序一样,使用 order by field(phone,111,222) select name,phone from users where phone in (18800000000,18800000000001) order by field(phone, 18800000000,18800000000001)

MySQL修改表的存储引擎

MySQL修改表的存储引擎有三种方式 alter table 该方式需要执行很长时间 mysql> alter table mytable engine=InnoDB; 导入导出 使用mysqldump导出表,修改导出文件里的create table后面表的名称。 创建新的表。 mysqldump导出的表里会包含drop table,所以要注意!删除该句。防止数据丢失 创建和查询 mysql> create table new_table_name like table_name; mysql> alter table new_table_name engin