一、背景

在mysql处理死锁问题时,由于show engine innodb status输出来的死锁日志无任务事务上下文,并不能很好地诊断相关事务所持有的所有锁信息,包括:锁个数、锁类型等。

于是,需要能查看到更详细的事务锁占用情况。

二、INNODB监控机制(InnoDB Monitors)

mysql提供一套INNODB监控机制,用于周期性(每15钞)输出INNODB运行相关状态(INNODB运行状态、表空间状态、表状态等)到mysqld服务标准错误输出。另外,INNODB标准监控和锁监控,也可以通过命令:show engine innodb status输出到控制台。

此部分内容一般输出到mysql error log里(查找日志位置,参见“补充知识”)。

官方说明(详见参考文档1)如下:

1

When you enable InnoDB monitors for periodic output, InnoDB writes their output to the mysqld server standard error output (stderr). In this case, no output is sent to clients. When switched on, InnoDB monitors print data about every 15 seconds. Server output usually is directed to the error log (see Section 5.4.2, “The Error Log”). This data is useful in performance tuning. On Windows, start the server from a command prompt in a console window with the --console option if you want to direct the output to the window rather than to the error log.

该类监控机制默认是关闭状态,分析问题需要查看监控日志时再开启。

建议分析问题后,将监控关闭;否则,每15秒输出一次INNODB运行状态信息到错误日志,会使用日志变得特别大。

三、开启状态监控

INNODB监控机制目前主要提供如下四类监控:

标准监控(Standard InnoDB Monitor):监视活动事务持有的表锁、行锁;事务锁等待;线程信号量等待;文件IO请求;buffer pool统计信息;InnoDB主线程purge和change buffer merge活动。

锁监控(InnoDB Lock Monitor):提供额外的锁信息。

表空间监控(InnoDB Tablespace Monitor):显示共享表空间中的文件段以及表空间数据结构配置验证。

表监控(InnoDB Table Monitor):显示内部数据字典的内容。

关于四类监控开启与关闭方法,一言以蔽之,主要是通过创建系统可识读的特殊表名来完成。特别地,除表空间(InnoDB Tablespace Monitor)监控和表监控(InnoDB Table Monitor)外,其他二类监控还可能通过修改系统参数来完成。

基于系统表的方式和基于系统参数的方式,只要使用二者其中一种方式开启监控即可。

1. 标准监控(Standard InnoDB Monitor)

基于系统表:innodb_monitor

mysql会通过检查是否存在名为innodb_monitor的数据表,来判断是否开启标准监控,并打印日志。

需要开启,则创建表;需要关闭,则删除表。

1

2

CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB;

DROP TABLE innodb_monitor;

基于系统参数:innodb_status_output

自mysql 5.6.16版本之后,可以通过设置系统参数(innodb_status_output)的方式开启或者关闭标准监控。

1

2

set GLOBAL innodb_status_output=ON;

set GLOBAL innodb_status_output=OFF;

2. 开启锁监控(InnoDB Lock Monitor)

基于系统表:innodb_lock_monitor

mysql会通过检查是否存在名为innodb_lock_monitor的数据表,来判断是否开启锁监控,并打印日志。

需要开启,则创建表;需要关闭,则删除表。

1

2

CREATE TABLE innodb_lock_monitor (a INT) ENGINE=INNODB;

DROP TABLE innodb_lock_monitor;

基于系统参数:innodb_status_output_locks

自mysql 5.6.16版本之后,可以通过设置系统参数(innodb_status_output_locks)的方式开启或者关闭标准监控。

1

2

3

4

set GLOBAL innodb_status_output=ON;

set GLOBAL innodb_status_output_locks=ON;

set GLOBAL innodb_status_output_locks=OFF;

注:前提需要开启 innodb_status_output

3. 开启表空间监控(InnoDB Tablespace Monitor)

基于系统表:innodb_tablespace_monitor

mysql会通过检查是否存在名为innodb_tablespace_monitor的数据表,来判断是否开启表空间监控,并打印日志。

需要开启,则创建表;需要关闭,则删除表。

1

2

CREATE TABLE innodb_tablespace_monitor (a INT) ENGINE=INNODB;

DROP TABLE innodb_tablespace_monitor;

注:表空间监控暂不支持通过参数方式配置,并且未来会被废弃。

4. 开启表监控(InnoDB Table Monitor)

mysql会通过检查是否存在名为innodb_table_monitor的数据表,来判断是否开启表监控,并打印日志。

需要开启,则创建表;需要关闭,则删除表。

1

2

CREATE TABLE innodb_table_monitor (a INT) ENGINE=INNODB;

DROP TABLE innodb_table_monitor;

注:表监控暂不支持通过参数方式配置,并且未来会被废弃。

四、注意事宜

1. 监控复位

需要特别注意的一点是:mysql服务重启后,需要重启开启相应监控,才会生效。换句话说,服务重启后,之前配置的所有监控都被复位,处于关闭状态。

基于系统表方式开启的监控,在mysql服务重启后,即使表存在,监控也不会生效。需要重启drop表,再create表,才能使监控生效。

基于系统参数方式开启的监控,在mysql服务重启后,相关系统参数值都是OFF。需要重启设置对应的参数,才能使用监控生效。

2. 错误日志大小

不在停机或重启情况下,mysql每15秒输出一次INNODB运行状态信息到错误日志。

这会使用日志变得越来越大。建议在需要的时候开启,不需要的时候关闭掉。

3. 基于表方式将来会被废弃

基于表方式将来会被废弃,使用基于系统参数的方式开启。

Use INFORMATION_SCHEMA or PERFORMANCE_SCHEMA tables or SET GLOBAL innodb_status_output=ON.

4. 基于表方式无关表结构及内容

基于表方式,mysql只检验表名被创建,则开启监控。

至于,表创建到哪个数据库、表具体的数据结构、表里的内容都不关心,不会对监控开启有任何影响。

5. 日志状态输出时间

虽说状态日志是每15秒周期性输出一次,但是由于状态收集与输出也会占用一些时间,特别是表空间日志(INNODB TABLE MONITOR OUTPUT)和表日志(INNODB TABLESPACE MONITOR OUTPUT)。因此,两次日志时间并不是规律的间隔15秒,而是自上次输出后15秒加上收集输出监控日志的时间。

五、补充知识

1. 查看错误日志输出位置

1

2

3

4

5

6

mysql [email protected]:test> select @@log_error;

+----------------------------------------+

| @@log_error |

|----------------------------------------|

| /usr/local/mysql/data/mysqld.local.err |

+----------------------------------------+

2. 查看历史日志开启状态与输出位置

1

2

3

4

5

6

7

mysql [email protected]:test> show VARIABLES like ‘general%‘;

+------------------+---------------------------------------+

| Variable_name | Value |

|------------------+---------------------------------------|

| general_log | ON |

| general_log_file | /usr/local/mysql/data/yerba-buena.log |

+------------------+---------------------------------------+

3. 监控日志解读

详见参考文档2及参考文档5

六、参考文档

mysql l查看历史等锁信息_查看锁信息(开启InnoDB监控)相关推荐

  1. mysql 存储过程 百万数据 innodb_详解mysql数据库一键查看锁信息(开启InnoDB监控)...

    概述 很多时候在mysql处理死锁问题时,由于show engine innodb status输出来的死锁日志无任务事务上下文,并不能很好地诊断相关事务所持有的所有锁信息,包括:锁个数.锁类型等. ...

  2. mysql 查询事务信息_查看MySQL最近的事务执行信息

    查看MySQL最近的事务执行信息 发布时间:2020-03-03 12:35:07 来源:51CTO 阅读:103 作者:wjw555 课题:查看MySQL最近的事务执行信息 *虽然我们可以通过查询慢 ...

  3. mysql乐观锁重试_乐观锁加重试,并发更新数据库一条记录导致:Lock wait timeout exceeded...

    背景: mysql数据库,用户余额表有一个version(版本号)字段,作为乐观锁. 更新方法有事务控制: @Transactional(rollbackFor = Exception.class) ...

  4. mysql悲观锁乐观锁定义_悲观锁乐观锁的定义

    悲观锁,正如其名,具有强烈的独占和排他特性,它指的是对数据被外界修改持保守态度.乐观锁机制采取了更加宽松的加锁机制,乐观锁是相对悲观锁而言,也是为了避免数据库幻读.业务处理时间过长等原因引起数据处理错 ...

  5. mysql乐观锁重试_乐观锁失败重试

    1.乐观锁失败后会报:ObjectOptimisticLockFailureException 2.处理方案:捕获到对应乐观锁失败异常后进行重试,代码参考如下 在写入数据库的时候需要有锁,比如同时写入 ...

  6. 同步方法中的锁对象_互斥锁与读写锁:如何使用锁完成Go程同步?

    图转自https://colobu.com/2018/12/18/dive-into-sync-mutex/ 这张图容易让人产生误解,容易让人误以为goroutine1获取的锁,只有goroutine ...

  7. form:errors path 不显示出错信息_视觉激光雷达信息融合与联合标定

    一.引言 最近在为车辆添加障碍物检测模块,障碍物检测可以使用激光雷达进行物体聚类,但是我们使用的是16线的velodyne,线数还是有些稀疏,对于较远的物体过于稀疏的线数聚类效果并不好,因此考虑使用视 ...

  8. 自旋锁和互斥锁实例_自旋锁和互斥锁的实现以及使用区别

    一.自旋锁和互斥锁的实现 基于硬件原语的一些抽象(比如:中断禁用.原子操作指令),怎么实现?可以参考清华大学操作公开课(向勇.陈渝老师讲的),以下摘抄一部分实现代码来实现抽象. Test And Se ...

  9. 如何查看mysql警告信息_查看MySQL的警告信息

    在王MySQL数据库导入数据的时候经常会出现警告,这些警告很容易被忽视,今天到数据的时候突然想看看警告的内容是什么,百度了一下mysql查看警告的命令 show warnings; 命令很简明,一查看 ...

最新文章

  1. 摘录cocos2d-x 从环境搭建到win32项目移植android平台
  2. 惊天大谎:让穷人都能上网是Facebook的殖民阴谋?
  3. arduino上ESP8266用Adafruit_SSD1306库驱动OLED屏
  4. 腾讯正式开源图计算框架Plato,十亿级节点图计算进入分钟级时代
  5. curl循环监控_阿里巴巴开源性能监控神器Arthas
  6. C++ 类模板二(类模版与友元函数)
  7. 工作220:git clone的时候地址需要改成自己的用户名
  8. django 配置mysql_Django配置MySQL数据库方法
  9. 如何使用BOOTSTRAP 栅格系统?
  10. Power BI 报表服务器企业一站式全链路解决方案
  11. flask框架_Flask: flask框架是如何实现非阻塞并发的
  12. TLS(Thread Local Storage)问题demo
  13. 统计系统中所有进程占用内存的方法
  14. BTC:关键阻力的突破会带来持续的积极情绪
  15. ubuntu 18.04 更新显卡驱动
  16. QGIS获取OSM地图矢量数据
  17. mac用u盘安装linux系统教程视频,教你如何用u盘重装mac系统教程
  18. LeetCode 247. 中心对称数
  19. 2362:数字游戏(小k和小p的传奇)
  20. 记zabbix正常启动,但是没有监听任何端口问题

热门文章

  1. Jetpack(五)—— Navigation
  2. Curl de 详细介绍
  3. java中获取输入的几种方式
  4. 联发科2022暑期实习笔试题
  5. ubt搭建rabbitMQ消息队列
  6. 互联网测试校招系列2:准备越充分,机会越大!
  7. python爬虫之正则表达式(爬取妹子网图片)
  8. 51妹子图客户端,开放源代码啦,欢迎拍砖
  9. 通货膨胀理解之计算1年后100w贬值多少
  10. Corn 表达式使用方法