概叙
科普文:软件架构数据库系列之【MySQL的Prometheus监控:MySQL Exporter】-CSDN博客
科普文:软件架构数据库系列之【MySQL5.7的体系表梳理】-CSDN博客
科普文:软件架构数据库系列之【MySQL的状态数据】-CSDN博客
科普文:软件架构数据库系列之【MySQL的故障排查命令】-CSDN博客
前面有提到SHOW [FULL] PROCESSLIST命令,在排查一些MySQL的题目,会常常用到 show processlist这个命令。
show processlist 是显示用户正在运行的线程,须要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程。除非单独个这个用户赋予了PROCESS 权限。
show processlist 显示的信息都是来自MySQL体系库 information_schema 中的 processlist 表。
所以使用下面的查询语句可以获得相同的结果:
- select * from information_schema.processlist
复制代码 三种语句查询效果如下:
在MySQL8.4中这三个命令查询结果都一样,特殊是SHOW [FULL] PROCESSLIST命令,带上full和不带full结果都一样,唯一差别的是info字段。
下面我们看看查询出来的结果都是什么意思。
- Id: 就是这个线程的唯一标识,当我们发现这个线程有题目的时候,可以通过 kill 命令,加上这个Id值将这个线程杀掉。前面我们说了show processlist 显示的信息时来自information_schema.processlist 表,所以这个Id就是这个表的主键。
- User: 就是指启动这个线程的用户。
- Host: 记录了发送哀求的客户端的 IP 和 端口号。通过这些信息在排查题目的时候,我们可以定位到是哪个客户端的哪个历程发送的哀求。
- DB: 当前实行的命令是在哪一个数据库上。如果没有指定命据库,则该值为 NULL 。
- Command: 是指此刻该线程正在实行的命令。这个很复杂,下面单独解释
- Time: 表示该线程处于当前状态的时间。
- State: 线程的状态,和 Command 对应,下面单独解释。
- Info: 一般记录的是线程实行的语句。默认只显示前100个字符,也就是你看到的语句大概是截断了的,要看全部信息,须要使用 show full processlist。
SHOW FULL PROCESSLIST命令详解
官网:MySQL :: MySQL 8.4 Reference Manual :: 15.7.7.31 SHOW PROCESSLIST Statement
SHOW PROCESSLIST显示正在运行(用户运行线程)的线程(或SHOW FULL PROCESSLIST显示更多信息)。
您还可以从INFORMATION_SCHEMA.PROCESSLIST表或mysqladmin processlist命令获取此信息。如果你有这个PROCESS特权,你可以看到所有的线程。否则,您只能看到自己的线程(即与您正在使用的MySQL帐户相关联的线程)。如果不使用该FULL关键字,则每个语句的前100个字符都将显示在该Info字段中。
历程信息也可从performance_schema.threads表中获得。但是,访问threads不须要互斥锁,对服务器性能影响最小。INFORMATION_SCHEMA.PROCESSLIST和SHOW PROCESSLIST由于须要互斥锁而具有负面的性能结果。performance_schema.threads还显示有关后台线程,哪些信息在INFORMATION_SCHEMA.PROCESSLIST和SHOW PROCESSLIST中没有,这意味着performance_schema.threads可以用来监督活动的其他线程信息源。
SHOW PROCESSLIST如果您收到“ 太多连接 ” 错误消息,而且想要相识发生了什么, 该声明非常有用。
MySQL保存一个额外的连接以供有权限的帐户使用SUPER,以确保管理员始终能够连接和检查体系(假设您没有向所有用户授予此权限)。
线程可以用KILL语句杀死。
所产生的列SHOW PROCESSLIST具有以下含义:
Id
连接标识符,这是同一类型的在所显示的值ID的列INFORMATION_SCHEMA.PROCESSLIST表,该PROCESSLIST_ID性能视图的列threads 表,而且通过返回的 CONNECTION_ID()功能。
User
发出声明的MySQL用户,如果是system user,它是指由服务器产生的非客户线程,以在内部处置惩罚任务。这大概是复制从站或延迟行处置惩罚程序使用的I / O或SQL线程。unauthenticated user指的是已经与客户端连接关联但是还没有完成客户机用户的认证的线程。 event_scheduler指的是监督预定事件的线程。如果是system user那么在Host列中不会指定主机 。
Host
发出该语句的客户端的主机名(system user没有主机除外),以便更容易地确定哪个客户端正在做什么,显示方式:host_name:client_port。
db
当前实行语句对应的默认数据库,如果选择了;否则为NULL。
Command
显示这个线程此刻正在实行的命令,一般对应DDL或DML语句。
Time
表示线程处于当前状态的时间长短,线程当前时间的概念在某些情况下大概会发生改变:线程可以改变时间。对于正在从主机处置惩罚事件的从站上运行的线程,线程时间设置为事件中发现的时间,因此反映了主站而不是从站的当前时间。SET TIMESTAMP = value。
State
对应Command指令,大多数状态对应于非常快速的操作。如果线程在给定状态下保持多秒,则大概存在须要观察的题目。
Info
包含由线程实行的语句的文本或者NULL,如果它不是实行的话。默认情况下,此值仅包含语句的前100个字符。要检察完备的语句,请使用SHOW FULL PROCESSLIST。
线程命令(Command)值梳理
线程可以具有以下任何 Command值:
Binlog Dump:这是主服务器上的线程,用于将二进制日记内容发送到从服务器。
Table Dump:线程将表内容发送到从服务器。
Change user:线程正在实行改变用户操作。
Close stmt:线程正在关闭准备好的语句。
Connect:复制中,从服务器连接到其主服务器。
Connect Out:复制中,从服务器正在连接到其主服务器。
Create DB:线程正在实行create-database操作。
Daemon:此线程在服务器内部,而不是服务客户端连接的线程。
Debug:线程正在生成调试信息。
Delayed insert:线程是一个延迟插入处置惩罚程序。
Drop DB:线程正在实行drop-database操作。
Execute:线程正在实行一个准备好的语句(prepare statement类型就是预编译的语句,JDBC支持次类型实行SQL)。
Fetch:线程正在实行一个准备语句的结果。
Field List:线程正在检索表列的信息。
Init DB:线程正在选择默认数据库。
Kill:线程正在杀死另一个线程。
Long Data:该线程在实行一个准备语句的结果中检索长数据。
Ping:线程正在处置惩罚服务器ping哀求。
Prepare:线程正在为语句生成实行筹划。
Processlist:线程正在生成有关服务器线程的信息。
Query:该线程正在实行一个语句。
Quit:线程正在终止。
Refresh:线程是刷新表,日记或缓存,或重置状态变量或复制服务器信息。
Register Slave:线程正在注册从服务器。
Reset stmt:线程正在重置一个准备好的语句。
Set option:线程正在设置或重置客户端语句实行选项。
Shutdown:线程正在关闭服务器。
Sleep:线程正在等候客户端向其发送新的语句。
Statistics:线程正在生成服务器状态信息。
Time:没用过。
线程状态(State)值梳理
State的取值非常多,有一两百个,这里就不睁开了,读者可直接前往官方文档查询。
详见:
- General Thread States
- Replication Master Thread States
- Replication Slave I/O Thread States
- Replication Slave SQL Thread States
- Replication Slave Connection Thread States
- NDB Cluster Thread States
- Event Scheduler Thread States
以下列表描述State 了与通例查询处置惩罚关联的线程值,而不是更复杂的活动,比方复制。此中许多仅用于在服务器中查找错误。
After create:当线程创建表(包罗内部临时表)时,会在创建表的函数的末尾创建。纵然由于某些错误而无法创建表,也会使用此状态。
Analyzing:线程正在计算MyISAM表密钥分布(比方:for ANALYZE TABLE)。
checking permissions:线程正在检查服务器是否具有实行语句所需的权限。
Checking table:线程正在实行表检查操作。
cleaning up:线程已经处置惩罚了一个命令,正在准备释放内存并重置某些状态变量。
closing tables:线程将更改的表数据刷新到磁盘并关闭已用表。这应该是一个快速的操作。如果没有,请验证您是否没有完备的磁盘,而且磁盘没有被非常大的使用。
copy to tmp table:线程正在处置惩罚ALTER TABLE语句。此状态发生在已创建新结构的表之后,但是将行复制到该表之前。对于此状态的线程,可以使用性能模式来获取有关复制操作的进度。
Copying to group table:如果语句具有差别ORDER BY和GROUP BY尺度,各行按组分列和复制到一个临时表。
Creating index:线程正在处置惩罚ALTER TABLE … ENABLE KEYS一个MyISAM表。
Creating sort index:线程正在处置惩罚一个SELECT使用内部临时表解析的线程 。
creating table:线程正在创建一个表,这包罗创建临时表。
committing alter table to storage engine:服务器已经完成就位ALTER TABLE并提交结果。
deleting from main table:服务器正在实行多表删除的第一部分,它仅从第一个表中删除,并从其他(引用)表中生存要用于删除的列和偏移量。
deleting from reference tables:服务器正在实行多表删除的第二部分,并从其他表中删除匹配的行。
discard_or_import_tablespace:线程正在处置惩罚ALTER TABLE … DISCARD TABLESPACE或ALTER TABLE … IMPORT TABLESPACE声明。
end:这发生在竣事,但的清算之前ALTER TABLE, CREATE VIEW, DELETE, INSERT, SELECT,或UPDATE语句。
executing:该线程已经开始实行一个语句。
Execution of init_command:线程正在init_command体系变量的值中实行语句 。
freeing items:线程已经实行了一个命令,在这种状态下完成的项目的一些释放涉及查询缓存,这个状态通常在后面cleaning up。
FULLTEXT initialization:服务器正在准备实行自然语言全文搜索。
init:此操作在初始化ALTER TABLE, DELETE, INSERT, SELECT, or UPDATE之前发生,服务器在该状态中采取的操作包罗刷新二进制日记、Innodb日记和一些查询缓存清算操作。对于终极状态, 大概会发生以下操作:更改表中的数据后删除查询缓存项、将事件写入二进制日记、释放内存缓冲区, 包罗blob。
Killed:实行KILL语句,向线程发送了一个声明,下次检查kill标记时应该停止。在MySQL的每个主循环中检查该标记,但在某些情况下,线程大概须要很短时间才能死掉。如果线程被某个其他线程锁定,则一旦其他线程释放锁定,该kill就会见效。
Locking system tables:线程正在尝试锁定体系表(比方,时区或日记表)。
login:连接线程的初始状态,直到客户端成功认证为止。
manage keys:服务器启用或禁用表索引。
NULL:该状态用于SHOW PROCESSLIST状态。
Opening system tables:线程尝试打开体系表(比方,时区或日记表)。
Opening tables:线程正在尝试打开一个表,这应该黑白常快的程序,除非有事变阻止打开。比方,一个ALTER TABLE或一个LOCK TABLE语句可以阻止打开一个表,直到语句完成。还大概须要关注table_open_cache参数的值是否足够大。对于体系表,使用Opening system tables状态。
optimizing:服务器正在实行查询的初始优化。
preparing:此状态发生在查询优化期间。
Purging old relay logs:线程正在删除不须要的中继日记文件。
query end:处置惩罚查询之后,freeing items状态之前会发生这种状态。
Removing duplicates:该查询的使用SELECT DISTINCT方式使得MySQL不能在早期阶段优化差别的操作。因此,MySQL须要一个额外的阶段来删除所有重复的行,然后将结果发送给客户端。
removing tmp table:处置惩罚语句后,该线程正在删除一个内部临时表SELECT 。如果没有创建临时表,则不使用该状态。
rename:线程正在重命名一个表。
rename result table:线程正在处置惩罚一个ALTER TABLE语句,已经创建了新表,并重新命名它来替换原始表。
Reopen tables:线程获得了表的锁,但在获得底子表结构更改的锁之后注意到。它释放了锁,关闭了table,并试图重新打开它。
Repair by sorting:修复代码正在使用排序来创建索引。
preparing for alter table:服务器正在准备当场实行ALTER TABLE。
Repair done:线程已经完成了一个MyISAM表的多线程修复 。
Repair with keycache:修复代码通过密钥缓存逐个使用创建密钥,这比慢得多Repair by sorting。
Rolling back:线程正在回滚事务。
Saving state:对于MyISAM表操作(如修复或分析),线程将新的表状态生存到.MYI文件头。状态包罗行数, AUTO_INCREMENT计数器和键分布等信息。
Searching rows for update:线程正在举行第一阶段,以便在更新之前查找所有匹配的行。如果UPDATE要更改用于查找涉及的行的索引,则必须实行此操作 。
setup:线程正在开始一个ALTER TABLE操作。
Sorting for group:线程正在做一个满意一个GROUP BY。
Sorting for order:线程正在做一个满意一个ORDER BY。
Sorting index:线程是排序索引页,以便在MyISAM表优化操作期间更有用地访问。
Sorting result:对于一个SELECT语句,这雷同于Creating sort index,但是对于非临时表。
statistics:服务器正在计算统计信息以开辟查询实行筹划。如果一个线程长时间处于这种状态,服务器大概是磁盘绑定的,实行其他工作。
update:线程正在准备开始更新表。
Updating:线程正在搜索要更新的行并正在更新它们。
updating main table:服务器正在实行多表更新的第一部分,它仅更新第一个表,并生存用于更新其他(引用)表的列和偏移量。
updating reference tables:服务器正在实行多表更新的第二部分,并从其他表更新匹配的行。
User lock:线程将要求或正在等候通过GET_LOCK()呼唤哀求的咨询锁定 。因为 SHOW PROFILE,这个状态意味着线程正在哀求锁定(不等候它)。
User sleep:线程调用了一个 SLEEP()调用。
logging slow query:线程正在向慢查询日记写入语句。
altering table:服务器正在实行当场ALTER TABLE。
Receiving from client:服务器正在从客户端读取数据包。
Copying to tmp table:服务器正在复制磁盘到内存的临时表,是直接在磁盘创建的临时表而并非从内存转到磁盘的临时表。
Copying to tmp table on disk:对于线程将临时表从内存中更改为基于磁盘的格式存储以节省内存后,又把临时表从磁盘复制到内存时的状态。
Creating tmp table:线程正在内存或磁盘上创建临时表。如果表在内存中创建,但后来转换为磁盘表,则该操作中的状态将为Copying to tmp table on disk。
Sending data:线程正在读取和处置惩罚SELECT语句的行,并将数据发送到客户端。由于在此状态期间发生的操作每每实行大量的磁盘访问(读取),所以在给定查询的整个生命周期内通常是最长的运行状态。
Sending to client:服务器正在向客户端写入数据包。
Waiting for commit lock:FLUSH TABLES WITH READ LOCK正在等候提交锁。
Waiting for global read lock:FLUSH TABLES WITH READ LOCK正在等候全局读锁定或read_only正在设置全局体系变量。
Waiting for tables:线程得到一个关照,表格的底层结构已经改变,须要重新打开表以获得新的结构。但是,要重新打开表格,必须等到所有其他线程都关闭该表。如果另一个线程已使用FLUSH TABLES或下面的语句之一:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或OPTIMIZE TABLE都会发生关照。
Waiting for table flush:线程正在实行FLUSH TABLES并正在等候所有线程关闭它们的表,或者线程得到一个关照,表中的底层结构已经改变,而且须要重新打开表以获得新的结构。但是,要重新打开表,必须等到所有其他线程都关闭该表。如果另一个线程已使用FLUSH TABLES或下面的语句之一:FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, 或OPTIMIZE TABLE都会发出这个关照。
Waiting for lock_type lock:服务器正在等候THR_LOCK从元数据锁定子体系获取锁或锁,此中lock_type指示锁的类型。THR_LOCK状态表示:Waiting for table level lock;这些状态表示等候元数据锁定:Waiting for event metadata lock、Waiting for global read lock、Waiting for schema metadata lock、Waiting for stored function metadata lock、Waiting for stored procedure metadata lock、Waiting for table metadata lock、Waiting for trigger metadata lock。
Writing to net:服务器正在将数据包写入网络,如果一个线程长时间在实行而且一直处于Writing to net状态,那么一直在发送数据包到网络,可以试着调整max_allowed_packet巨细。别的,这大概会导致其他线程大量壅闭。
Waiting on cond:线程等候条件成为true的一般状态,没有特定的状态信息可用。
System lock:线程已经调用mysql_lock_tables() ,且线程状态从未更新。这是一个非常普遍的状态,大概由于许多原因而发生。比方, 线程将哀求或正在等候表的内部或外部体系锁。当InnoDB在实行锁表时等候表级锁时, 大概会发生这种情况。如果此状态是由于哀求外部锁而导致的,而且不使用正在访问相同表的多个mysqld服务器MyISAM,则可以使用该–skip-external-locking选项禁用外部体系锁 。但是,默认情况下禁用外部锁定,因此这个选项很有大概不起作用。因为SHOW PROFILE,这个状态意味着线程正在哀求锁定(不等候它)。对于体系表,使用Locking system tables状态。
- 查询缓存状态(State)值(MySQL8已经取消查询缓存功能)
checking privileges on cached query:服务器正在检查用户是否具有访问缓存查询结果的权限。
checking query cache for query:服务器正在检查当前查询是否存在于查询缓存中。
invalidating query cache entries:查询缓存条目被标记为无效,因为底层表已更改。
sending cached result to client:服务器正在从查询缓存中获取查询的结果,并将其发送给客户端。
storing result in query cache:服务器将查询结果存储在查询缓存中。
Waiting for query cache lock:当会话正在等候采取查询缓存锁定时,会发生此状态。这种情况大概须要实行一些查询缓存操作,如使查询缓存无效的INSERT或DELETE语句,以及RESET QUERY CACHE等等。
这些状态适用于事件调理程序线程,创建用于实行调理事件的线程或终止调理程序的线程。
Clearing
调理程序线程或正在实行事件的线程正在终止,即将竣事。
Initialized
调理程序线程或将实行事件的线程已初始化。
Waiting for next activation
调理程序具有非空事件队列,但下一次激活是将来。
Waiting for scheduler to stop
线程发出SET GLOBAL event_scheduler=OFF并正在等候调理程序停止。
Waiting on empty queue
调理程序的事件队列是空的,它正在休眠。
除了上述几类,还有如复制主线程状态(State)值、复制从库IO线程状态(State)值、复制从库SQL线程(State)值、复制从库Connect线程(State)值。
主库线程状态(State)值
以下列表显示了主从复制中主服务器的Binlog Dump线程的State列中大概看到的最常见状态。如果Binlog Dump线程在主服务器上看不到,这意味着复制没有运行,也就是说,如今没有连接任何Slave主机。
Sending binlog event to slave
二进制日记由各种事件组成,一个事件通常为一个更新加一些其它信息。线程已经从二进制日记读取了一个事件而且正将它发送到从服务器。
Finished reading one binlog; switching to next binlog
线程已经读完二进制日记文件而且正打开下一个要发送到从服务器的日记文件。
Has sent all binlog to slave; waiting for binlog to be updated
线程已经从二进制日记读取所有主要的更新并已经发送到了从服务器。线程如今正空闲,等候由主服务器上新的更新导致的出如今二进制日记中的新事件。
Waiting to finalize termination
线程停止时发生的一个很简单的状态。
从库I/O线程状态(State)值
Connecting to master
线程正试图连接主服务器。
Checking master version
创建同主服务器之间的连接后立刻临时出现的状态。
Registering slave on master
创建同主服务器之间的连接后立刻临时出现的状态。
Requesting binlog dump
创建同主服务器之间的连接后立刻临时出现的状态。线程向主服务器发送一条哀求,索取从哀求的二进制日记文件名和位置开始的二进制日记的内容。
Waiting to reconnect after a failed binlog dump request
如果二进制日记转储哀求失败(由于没有连接),线程进入睡眠状态,然后定期尝试重新连接。可以使用–master-connect-retry选项指定重试之间的隔断。
Reconnecting after a failed binlog dump request
线程正尝试重新连接主服务器。
Waiting for master to send event
线程已经连接上主服务器,正等候二进制日记事件到达。如果主服务器正空闲,会连续较长的时间。如果等候连续slave_read_timeout秒,则发生超时。此时,线程以为连接被停止并企图重新连接。
Queueing master event to the relay log
线程已经读取一个事件,正将它复制到中继日记供SQL线程来处置惩罚。
Waiting to reconnect after a failed master event read
读取时(由于没有连接)出现错误,线程企图重新连接前将睡眠master-connect-retry秒。
Reconnecting after a failed master event read
线程正尝试重新连接主服务器,当连接重新创建后,状态变为Waiting for master to send event。
Waiting for the slave SQL thread to free enough relay log space
正使用一个非零relay_log_space_limit值,中继日记已经增长到其组合巨细超过该值。I/O线程正等候直到SQL线程处置惩罚中继日记内容并删除部分中继日记文件来释放足够的空间。
Waiting for slave mutex on exit
线程停止时发生的一个很简单的状态。
从库SQL线程状态(State)值
Reading event from the relay log
线程已经从中继日记读取一个事件,可以对事件举行处置惩罚了。
Has read all relay log; waiting for the slave I/O thread to update it
线程已经处置惩罚了中继日记文件中的所有事件,如今正等候I/O线程将新事件写入中继日记。
Waiting for slave mutex on exit
线程停止时发生的一个很简单的状态。
从库连接线程状态(State)值
这些线程状态发生在复制从库上,但与连接线程相关联,而不与I/O或SQL线程相关联。
Changing master
线程正在处置惩罚CHANGE MASTER TO语句。
Killing slave
线程正在处置惩罚STOP SLAVE语句。
Opening master dump table
此状态发生在Creating table from master dump之后。
Reading master dump table data
此状态发生在Opening master dump table之后。
Rebuilding the index on master dump table
此状态发生在Reading master dump table data之后。
常用的PROCESSLIST查询语句
- -- 查询当前正在运行的所有历程SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND != 'Sleep'; -- 查询特定用户的历程SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER='root'; -- 查询特定命令的历程SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE COMMAND='Query'; -- 杀掉特定用户的历程SELECT CONCAT('KILL ', ID, ';') FROM INFORMATION_SCHEMA.PROCESSLIST WHERE USER='root'; -- 杀掉特定ID的历程SELECT CONCAT('KILL ', ID, ';') FROM INFORMATION_SCHEMA.PROCESSLIST WHERE ID=12345;-- 按客户端 IP 分组,看哪个客户端的链接数最多select client_ip,count(client_ip) as client_num from (select substring_index(host,':' ,1) as client_ip from information_schema.processlist ) as connect_info group by client_ip order by client_num desc;-- 检察正在实行的线程,并按 Time 倒排序,看看有没有实行时间特殊长的线程select * from information_schema.processlist
- where Command != 'Sleep' order by Time desc;-- 找出所有实行时间超过 5 分钟的线程,拼集出 kill 语句,方便后面查杀select concat('kill ', id, ';') from information_schema.processlist where Command != 'Sleep' and Time > 300 order by Time desc;
复制代码 实行结果
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |