0、show processlist查看正在运行的线程,如果你有process权限,能够看到所有的线程,如果没有权限只能看到自己的线程。 有管理员权限的用户,如下图所示: 没有管理权限的用户,如下图所示:: 如果不加full关键字,每条语句的info信息栏只能显示前100个字符。 如果看到“too many connections”的错误信息,想要看看什么线程正在运行,使用show processlist语句是很有用的。mysql数据库会额外保持一个连接,供具有connection_admin或者super权限用户的使用,用以确保管理员能随时连接进来检查系统状况(假设你没有将此权限授予所有用户)。 show processlist输出列详解:
Performance_Schema threads表的processlist_id列也是相同值,由connection_id())函数返回值。 通过kill 语句可以杀掉查询到的线程,执行命令如下:
2、user: 代表数据库用户,如果是system user代表非客户端线程,是服务器发起的处理内部事务的线程。这些线程可能是io线程、复制从库的sql线程、延迟行处理线程。对于system user,host列没有任何信息。 unauthenticated user是有客户端发起的,但是尚未对客户端用户进行验证的线程。event_scheduler 是监控调度事件的线程。 3、host:发起线程的客户的主机名(对于system user,host这一列为空)。tcp/ip连接的主机名是:hostname:client_port格式,用这种格式来更方面查看客户端在做什么操作。 4、db:如果指定了库名,会使用当前的库名;如果没有则为空。 5、command:线程的命令类型。下面列举几种常见的线程命令,如果想查看详细信息点击此处 1 2 3 4 5 6 7 8 9 10 11 12 13 14 connect:从复制已经连接到主库 connect out:从复制正在连接到主库 create db:正在执行一个创建库的操作。 execute:正在执行一个准备好的语句。 field list:提取表列信息线程 kill:当前线程被其他线程杀掉。 query:正在整型一条语句。 quit:线程被终止。 refresh:刷新表、日志、缓存、重置状态变量值或从服务信息线程。 shutdown:关闭服务线程 sleep:等待客户端发送一条新语句线程。 table dump:发送表内容到从服务器 statics:获取当前服务状态信息。 如果一个线程耗时比较久,需要重点关注造成该线程。
6、time:当前线程耗时。对于slave sql 线程,该值代表最后一次复制时间的时间戳和从服务器的真正时间的秒数。 7、state:行为,事件,状态指明当前线程在做什么。下面列举几种常见状态值,查看详细信息点击此处 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 after create:执行完create table函数之后,创建表的线程(包括内部临时表),即使因为某些错误创建表失败,该状态也会显示。 analyzing:统计myisam表键分布(例如执行analyze table) checking permissions:检查是否有权限执行该语句。 check tables:执行表检查操作。 cleaning up:线程正在处理一条命名,准备释放内存重置某些状态变量。 closing tables:刷新更改的表到磁盘,关闭使用的表。该操作应该快速完成,如果没有,请确保是否有足够的磁盘空间或者磁盘io是否太高。 copy to tmp table:处理alter table语句。该状态发生在表新结构被创建之后,行数据被拷贝到表之前。 copying to group table:该执行语句中order by和group by有不同的关键字,行被组处理拷贝到临时表。 copying to tmp table:正在复制内存中的临时表。 altering table:正在执行alter table Copying to tmp table on disk:正在拷贝临时表到磁盘。临时结果变得太大,因此,线程将临时表从内存转到磁盘来节省内存。 creating index:对myisam表进行alter table ... enable keys操作 creating sort index:使用内部临时表处理一个select语句。 creating table:正在创建表(包括创建临时表) creating tmp table:在内存或磁盘创建一个临时表。如果一个表刚开始再内存创建,之后转到磁盘,该状态会变为:Copying to tmp table on disk。 committing alter table to storage engine:alter table已经执行完成,正在提交 结果。 executing:已经开始执行一个语句 freeing items:已经执行了一个命令,该状态通常在cleaning up之后。 query end:,在freeing items状态之前,处理一个查询之后 logging slow query:写语句到slow-query日志 sending data:正在读取和处理一个select语句的行,并发送数据到客户端,因为可能会发生物理读,该状态可能是给定生命周期时间最长的。 update:准备更新表 updating:正在搜索更新的行,并更新他们 system lock:调用了mysql_lock_tables()函数,线程状态一直没有更新。产生该问题原因很多: 比如:请求或等待一个表的内部或者外部系统锁。当innodb等待一个表锁等级为lock tables时会发生。如果这个问题是由请求外部锁,并且你没有用多个mysqld服务访问相同的myisam引擎表,你可以通过参数 --skip-external-locking禁用外部系统锁。但是外部锁默认情况下是禁用的,因此该参数可能没有影响。对于show profile命令,该状态代表正在请求锁(不是在等待锁) 对于系统表锁状态是Locking system tables。 waiting for commit lock:flush tables with read lock正在等待一个commit 锁 waiting for tables:线程收到通知,表的底层架构已经更改,需要重新打开表后去一个新的结构。但是重新打开一个表,需要等待其他正在访问该表的线程。 通常在其他线程使用flush tables或者执行下面语句: FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, or OPTIMIZE TABLE. 时会发生此通知。
8、info:正在执行的语句,如果没有语句则为空。语句可能是发送的服务端的,或一个内部语句(如果一个语句执行其他语句)例如:call调用一个(select语句)存储过程,info值会显示select语句。 9、另外使用mysqladmin processlist也可以查看进程信息,如下图所示:
10、如果想通过sql命令去获取自己设定的行,可按以下方法设置: 1 2 select * from information_schema.processlist where state !=' '; ![](https://i.imgur.com/pGGuMER.png)
可根据自己需求添加条件。