1356天前2019-09-23 09:38:32 |    抢沙发  7743 
mysql锁表排查方法

mysql锁表


1,查询表被锁了多少次:

SHOW STATUS LIKE 'Table_locks%';
返回结果:

+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Table_locks_immediate | 106   |
| Table_locks_waited    | 0     |
+-----------------------+-------+
2 rows in set (0.00 sec)


说明:Table_locks_immediate 表示总共锁了多少次。Table_locks_waited 表示有多少请求等待表锁。


2,实时查看当前状态:

 A:查看正在被锁定的的表:

show OPEN TABLES where In_use > 0;
解释:in_use:多少个线程在使用。 name_locked:是否被锁。


B:查看正在锁的事务:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
C:查看等待锁的事务:

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
D:查询哪些线程正在运行:

show processlist;
解释:最关键的就是state列提示了当前的动作。

如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。
show processlist;只列出前100条,如果想全列出请使用show full processlist;


3,查询MyDB数据库里面存储引擎为MyISAM的表。

select table_catalog,table_schema,table_name,engine from information_schema.tables where table_schema='MyDB' and engine='MyISAM';
4,慢日志说字段说明。

首先格式是上面说明,下面语句。

# Time: 2019-09-20T04:54:02.696143Z
# User@Host: x[x] @  [127.0.0.1]  Id:   305
# Query_time: 5.932662  Lock_time: 0.000051 Rows_sent: 42  Rows_examined: 30576
SET timestamp=1568955242;
SELECT DISTINCT `child_id`
FROM `fqi_school_class_index`
WHERE `school_id` = '5902';  

解释:

    Query_time 表示查询相应时间;

    Lock_time 锁表时间;

    Rows_sent 返回记录数;

    Rows_examined 扫描行数;  


5,数据库当前状态查询。

A:查看最大连接数

show variables like '%max_connections%';
B:当前进程状态查询

show global status like 'Thread%';
反馈:

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 30    |
| Threads_connected | 301   |
| Threads_created   | 331   |
| Threads_running   | 299   |
+-------------------+-------+
4 rows in set (0.00 sec)

参数解释:

Threads_cached 线程缓存中的线程数
Threads_connected 打开的连接数
Threads_created 为处理连接而创建的线程数
Threads_running 激活的连接数,这个数值一般远低于connected数值


Threads_connected 跟show processlist结果相同,表示当前连接数。准确的来说,Threads_running是代表当前并发数


如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。
Threads_created表示创建过的线程数,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值.

C:查询服务器thread_cache_size值

show variables like 'thread_cache_size';
D:查看mysql当前状态:

show status;
参数解释:

命令:show status like '%下面变量%';

Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。
Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。
Connections 试图连接MySQL服务器的次数。
Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。
Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。
Delayed_writes 用INSERT DELAYED写入的行数。
Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。
Flush_commands 执行FLUSH命令的次数。
Handler_delete 请求从一张表中删除行的次数。
Handler_read_first 请求读入表中第一行的次数。
Handler_read_key 请求数字基于键读行。
Handler_read_next 请求读入基于一个键的一行的次数。
Handler_read_rnd 请求读入基于一个固定位置的一行的次数。
Handler_update 请求更新表中一行的次数。
Handler_write 请求向表中插入一行的次数。
Key_blocks_used 用于关键字缓存的块的数量。
Key_read_requests 请求从缓存读入一个键值的次数。
Key_reads 从磁盘物理读入一个键值的次数。
Key_write_requests 请求将一个关键字块写入缓存次数。
Key_writes 将一个键值块物理写入磁盘的次数。
Max_used_connections 同时使用的连接的最大数目。
Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。
Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。
Open_tables 打开表的数量。
Open_files 打开文件的数量。
Open_streams 打开流的数量(主要用于日志记载)
Opened_tables 已经打开的表的数量。
Questions 发往服务器的查询的数量。
Slow_queries 要花超过long_query_time时间的查询数量。
Threads_connected 当前打开的连接的数量。
Threads_running 不在睡眠的线程数量。
Uptime 服务器工作了多少秒。



发表评论

暂无评论

登录

忘记密码 ?

切换登录

注册

扫一扫二维码分享