Mysql数据库Slow_log中的lock_Time和Query_time

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 主要用简单的例子来说明,slow log里的lock_time和query_time的关系

作者:手辨



实为吾之愚见,望诸君酌之!闻过则喜,与君共勉 


说明:主要用简单的例子来说明,slow log里的lock_time和query_time的关系,得出的结论是:

当一个sql的执行时间(排除lock_time)大于long_query_time的时候,才会被记录到slow log中,并且query_time是累计了lock_time的(如果有lock_time),大概真正的执行时间需要减去lock_time的时间,当一个sql的执行时间(排除lock_time)小于long_query_time的时候(即使他锁等待了3个小时),也不会记录到slow log中的,故锁等待的时间并不决定记不记录slow log,下面的测试多是基于自建mysql进行




现象展示


有时在查slow log的信息时,可能会遇到,下面这种情况:


fae69244bbe2f87993e9806ccb4bf08623a9fafb


或者:


e5445953d7710c45ada5d1bab2bf71fec485182d


上面的信息,都出现了lock_time的时间很长的情况,并且sql的执行时间(query_time)也会出现时间很长的情况


 


问题复现


构建测试数据,手动造成锁等待,复现下这类问题


现象1:无自建主键的锁等待


无自建主键测试数据,locking Reads的结果和执行时间:


1ff4d75c33654f6a8b4f702b3acd22a0587b23ba


上图可以大概判断,select count(1) from MOCK_DATA for update;的执行时间一般会大于小于15S且大于5S


测试1::设置long_query_time为15s:


46fcb570734457dd2db6f80b3582d203075330ec


进行如下测试:


Session1:


534463011cbf354ec4776fddddc57a82d6d582be


Session1执行查询,不提交,不回滚


Session2:


64826de56699e316b3ed0f29fbc3af0e4345fe36


Session2被阻塞


 


Session1:


1909c53d1552cc809c116b0a60178c1521f9be42


等待一段时间后Session1回滚(不要超过锁等待超时时间)


 


Session2:


0c29b5fd7ed27db62ed0710ef4835f18af10b39e


Session2执行完成,执行时间是28.95sec


 


Session3:


查询mysql.slow_log,看下结果:


9b9338ec53a23f40ed7b1357603f63dbc7b616ad


没有看到session2执行的for update操作的sql


测试2:设置long_query_time为5s


7f1fa2e886ff3c6c9695e9ba94686a00d5ad9fb3


重复测试1的测试:


Session1:


12efd0200b5be5e7a31365fb20c5878eb58c2c04


Session 1执行查询,不提交不回滚


 


Session2:


5b8f31735431b00d20649578ff3cf4578e988bf6


Session2阻塞


 


Session1:


fc090b6243b3765b86590387f59b343549e4c2b0


等待一段时间后Session1回滚(不要超过锁等待超时时间)


 


Session2:


1dbf3f4d780a168a2e2607a178be1ee947432c75


Session2执行完成,执行时间是47.66sec


 


Session3:


查询mysql.slow_log,看下结果:


8376f68f2605a6a96e4dfd8613de1ce0726bc5d6


从上图可以看到,session2执行的for update操作的sql记录下来了,其中执行时间(query_time)是47s,在这47s里,锁定的时间(lock_time)是38s


 


结论:


当一个无自建主键的sql的执行时间(排除lock_time)大于long_query_time的时候,才会被记录到slow log中,并且query_time是累计了lock_time的,大概真正的执行时间需要减去lock_time的时间才是(该测试中,执行时间=47s-38s=9s,这个计算可能会有偏差),当一个sql的执行时间(排除lock_time)小于long_query_time的时候(即使他锁等待了3个小时),就不会记录到slow log中


 


现象2:有自建主键的锁等待


有自建主键测试数据,locking Reads的结果和执行时间:


e3ad8149443b8a325162d90fd20eafc47ef17a72


上图可以大概判断,select count(1) from MOCK_DATA where id<10000000 lock in share
mode;的执行时间一般会大于小于15S且大于5S,


测试1::设置long_query_time为15s:


7e91ac40b675d8a713c7b070ae0659876a269829


进行如下测试:


Session1:


0de214bac0145ed94df00b97f1ba6a328df2a6ff


Session1执行查询,不提交,不回滚


Session2:


291896bbda3ab24d69b92a14cf9e0b84b3877dd5


Session2被阻塞


 


Session1:


71366e4b15f66da9126ad0a82cc1688fe7ccf440


等待一段时间后Session1回滚(不要超过锁等待超时时间)


 


Session2:


31d6c817ab23316e2c659f87b72cbe4100474211


Session2执行完成,执行时间是31.04sec


 


Session3:


查询mysql.slow_log,看下结果:


ac80cfc6e4f11bfa4cbd1d20a7628d8d245359af


没有看到最新测试的session2执行的for update操作的sql,只有之前测试的那条记录


测试2:设置long_query_time为5s


7f1fa2e886ff3c6c9695e9ba94686a00d5ad9fb3


重复测试1的测试:


Session1:


9ba6f742907da23703a837f8c20eb80ecbf43765


Session 1执行查询,不提交不回滚


 


Session2:


10eb893fe8488c4b7975ecb378e35037fa974d56


Session2阻塞


 


Session1:


fc090b6243b3765b86590387f59b343549e4c2b0


等待一段时间后Session1回滚(不要超过锁等待超时时间)


 


Session2:


c6f38a8b5660143c858852d83f78285387bb480b


Session2执行完成,执行时间是1min 0.40sec


 


Session3:


查询mysql.slow_log,看下结果:


5bfc8605d2603a6a78ad20bc534d10c78a119efb


从上图可以看到,最新测试的session2执行的for update操作的sql记录下来了,其中执行时间(query_time)是1分钟,在这1分钟里,锁定的时间(lock_time)是51s


 


结论:


当使用主键查询的一个sql的执行时间(排除lock_time)大于long_query_time的时候,才会被记录到slow log中,并且query_time是累计了lock_time的,大概真正的执行时间需要减去lock_time的时间,当一个sql的执行时间(排除lock_time)小于long_query_time的时候(即使他锁等待了3个小时),就不会记录到slow log中


 


现象3:secondary index的锁等待


Secondary index测试数据,locking
Reads的结果和执行时间:


104106f868ebd0fa2945e8fa5f11bc83f78f8aa5


上图可以大概判断,select count(1) from MOCK_DATA where ram_num=7 for update;的执行时间一般会大于小于10S且大于1S,


测试1::设置long_query_time为10s:


d699d27ccdd3e851affa63134f5c9bdb1df0b865


进行如下测试:


Session1:


74010215c285b09f082a77125426c958efbdf6f6


Session1执行查询,不提交,不回滚


Session2:


3b118cd15b179c4830dfd9de0559031f4900cd26


Session2被阻塞


 


Session1:


71366e4b15f66da9126ad0a82cc1688fe7ccf440


等待一段时间后Session1回滚(不要超过锁等待超时时间)


 


Session2:


8fb014dc3678e48d042e85498252d62fcc605293


Session2执行完成,执行时间是1min
44.02sec


 


Session3:


查询mysql.slow_log,看下结果:


98e39549e3def0bd276daa803cb68f2786ce15f9


没有看到最新测试的session2执行的for update操作的sql,只有之前测试的那条记录


测试2:设置long_query_time为1s


0001837f31066811a704108e4987b690ca1608c2


重复测试1的测试:


Session1:


080ad7121417b0f5385b58418cfdea3753420e73


Session 1执行查询,不提交不回滚


 


Session2:


f8ccfdb513e61a14275e6d47749b7426000abb63


Session2阻塞


 


Session1:


fc090b6243b3765b86590387f59b343549e4c2b0


等待一段时间后Session1回滚(不要超过锁等待超时时间)


 


Session2:


66f3c6411d3c3defee149339ab60d8563929dbb3


Session2执行完成,执行时间是1min 6.66sec


 


Session3:


查询mysql.slow_log,看下结果:


ef385ea901d4062888a39a3ea859bef294b9b1ac


从上图可以看到,最新测试的session2执行的for update操作的sql记录下来了,其中执行时间(query_time)是1分06秒,在这1分06秒里,锁定的时间(lock_time)是1分02秒


 


结论:


当使用secondary index查询的一个sql的执行时间(排除lock_time)大于long_query_time的时候,才会被记录到slow log中,并且query_time是累计了lock_time的,大概真正的执行时间需要减去lock_time的时间,当一个sql的执行时间(排除lock_time)小于long_query_time的时候(即使他锁等待了3个小时),就不会记录到slow log中


 


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
135 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
11天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
26天前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的全量日志文件
MySQL全量日志记录所有操作的SQL语句,默认禁用。启用后,可通过`show variables like %general_log%检查状态,使用`set global general_log=ON`临时开启,执行查询并查看日志文件以追踪SQL执行详情。
|
29天前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的binlog日志文件
MySQL的binlog日志记录了所有对数据库的更改操作(不包括SELECT和SHOW),主要用于主从复制和数据恢复。binlog有三种模式,可通过设置binlog_format参数选择。示例展示了如何启用binlog、设置格式、查看日志文件及记录的信息。
|
28天前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的慢查询日志
MySQL的慢查询日志用于记录执行时间超过设定阈值的SQL语句,帮助数据库管理员识别并优化性能问题。通过`mysqldumpslow`工具可查看日志。本文介绍了如何检查、启用及配置慢查询日志,并通过实例演示了慢查询的记录与分析过程。
107 3
|
2月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1684 14
|
1月前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL的撤销日志文件和错误日志文件
本文介绍了MySQL的物理存储结构,重点讲解了InnoDB存储引擎中的撤销日志文件(undo log)和错误日志文件。从MySQL 8.0开始,默认生成两个10MB的undo表空间文件,并支持动态扩容和收缩。错误日志文件记录了MySQL启动、运行、关闭过程中的问题,通过示例展示了如何查看和使用这些日志。
|
2月前
|
SQL 存储 关系型数据库
Mysql主从同步 清理二进制日志的技巧
Mysql主从同步 清理二进制日志的技巧
32 1
|
2月前
|
关系型数据库 MySQL 数据库
DZ社区 mysql日志清理 Discuz! X3.5数据库可以做定期常规清理的表
很多站长在网站日常维护中忽略了比较重要的一个环节,就是对于数据库的清理工作,造成数据库使用量增加必须多的原因一般有2个:后台站点功能开启了家园,此功能现在很少有论坛会用到,但是灌水机会灌入大量垃圾信息致使站长长时间未能发觉;再有就是程序默认的一些通知类表单会存放大量的、对于网站日常运行并无意义的通知信息。
99 2
|
2月前
|
存储 关系型数据库 数据库
数据库启用慢速查询日志如何增强 Postgres 可观测性
数据库启用慢速查询日志如何增强 Postgres 可观测性
38 1