在MySQL中如何计算、统计重做日志(redo log)的生成情况呢? 例如10分钟内,生成了多少M的redo log呢?30分钟内又生成了多少M的redo log.....。MySQL没有像Oracle中那样的系统视图统计这些数据,但是我们可以通过一些方法曲线的统计二进制日志的生成量。

虽然我在这篇博客“MySQL中Redo Log相关的重要参数总结”中介绍了,MySQL 8.0引入了innodb_dedicated_server自适应参数,可基于服务器的内存来动态设置innodb_buffer_pool_size,innodb_log_file_size和innodb_flush_method。默认情况下,此参数是关闭的。但是在MySQL 8.0之前,通过计算重做日志(redo log)的生成量来判断判断innodb_log_buffer_size和innodb_log_file_size的大小是否合适是非常必要的,个人认为即使MySQL 8.0版本下,这个也是非常有参考和研究意义的。我们通过统计、分析计算重做日志(redo log)的生成量,从而判断InnoDB的事务日志文件(ib_logfile0)大概能支撑多长时间等待。有具体数据支撑,你才好分析判断,否则巧妇也难为无米之炊。

在MySQL的information_schema.global_status或performance_schema.global_status中有个服务器状态变量(Server Status Variables)Innodb_os_log_written,它记录了Innodb的重做日志(redo log)的生成量,它记录写入InnoDB重做日志文件的字节数,它是一个累积值。官方文档关于此服务器状态变量的描述如下

Innodb_os_log_written

The number of bytes written to the InnoDB redo log files.

我们主要通过一个计划任务/事件调度定期的去采集Innodb_os_log_written服务器状态变量获取重做日志的大小,将其存储在innodb_log_size_his表中,方便分析统计。具体脚本如下:

注意:performance_schema.global_status是MySQL 5.7引入的,而MySQL 8.0开始,information_schema.global_status直接被丢弃了。所以注意MySQL版本,选择合适脚本。

USE mysqls;
 
CREATE TABLE IF NOT EXISTS innodb_log_size_his
(
    log_id          INT AUTO_INCREMENT PRIMARY KEY COMMENT '日志编号',
    log_date        DATETIME COMMENT '记录当前数据的时间',
    log_size        DOUBLE COMMENT 'binlog的大小,单位为mb'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT '二进制日志大小信息表';
 
 
--MySQL 5.*版本用下面脚本
DELIMITER &&
 
DROP PROCEDURE IF EXISTS `Record_Innodb_Log_Size`&&
 
CREATE PROCEDURE Record_Innodb_Log_Size()
BEGIN
      INSERT INTO mysql.`innodb_log_size_his`
      (
          log_date,
          log_size
      )
      SELECT now() AS log_date,
             ROUND(CAST(VARIABLE_VALUE AS DOUBLE )/1024/1024, 1) as log_size
      FROM information_schema.global_status
      WHERE VARIABLE_NAME = 'innodb_os_log_written';
END &&
 
DELIMITER ;
 
 
--MySQL 8.0以上版本使用下面脚本
DELIMITER &&
 
DROP PROCEDURE IF EXISTS `Record_Innodb_Log_Size`&&
 
CREATE PROCEDURE Record_Innodb_Log_Size()
BEGIN
      INSERT INTO mysql.`innodb_log_size_his`
      (
          log_date,
          log_size
      )
      SELECT now() AS log_date,
             ROUND(CAST(VARIABLE_VALUE AS DOUBLE )/1024/1024, 1) as log_size
      FROM performance_schema.global_status
      WHERE VARIABLE_NAME = 'innodb_os_log_written';
    
END &&
 
DELIMITER ;

然后创建MySQL的计划任务/事件调度,这个可以根据需求弹性设定。

CREATE EVENT DPA_BINGLOG_SIZE 
ON SCHEDULE EVERY 10 MINUTE STARTS '2020-10-16 08:00:00' 
ON COMPLETION PRESERVE 
DO CALL mysql.Record_Innodb_Log_Size;

然后你就可以基于这个表做一些简单的分析和统计了,例如,统计10分钟内生成重做日志生成了多少。如下所示:

SELECT m.*
      ,@lag  AS last_redo_size
      ,ROUND(m.log_size - @lag,2) AS gen_redo_size
      ,@lag:=log_size
FROM mysql.`innodb_log_size_his` m, (SELECT @lag :='') AS n
WHERE m.log_date >= date_add(now(), interval -1 day)
ORDER BY m.log_id;

最新文章

  1. gprs/gsm 在linux下的应用
  2. ubuntu 用apt-get 安装apache 和php 之后php不能解析的问题
  3. 安卓log4k问题解决
  4. Revit 自定义RibbonPanel到Revit中
  5. git初学习体会
  6. max number of threads [1024] for user [lish] likely too low, increase to at least [2048]
  7. Leetcode | Linked List Cycle I && II
  8. HTTP和FTP的区别
  9. Python(2.7.6) 迭代器
  10. Agile&DevOps究竟谁是魔法棒
  11. Java多线程并发工具类
  12. 【转载】SQL语句将一个表的数据写入到另一个表中
  13. SNF快速开发平台MVC-瀑布式分页组件
  14. 【转载】谈谈自己对REST、SOA、SOAP、RPC、ICE、ESB、BPM知识汇总及理解
  15. MySQL中NULL与空字符串
  16. linux挂载根文件系统过程
  17. 最简单的java多线程代码(重写thread或者runnable的run方法)
  18. Selenide 阶段性总结介绍(UI自动化测试工具)
  19. python socket详解
  20. 1073 Scientific Notation

热门文章

  1. C语言讲义——内联函数
  2. MySQL的两种日志类型,redo log,binlog
  3. Codeforces Round #677 (Div. 3)
  4. Golang自学系列
  5. 如何破解QQ闪照
  6. Spring Boot 2.x 多数据源配置之 MyBatis 篇
  7. sql server full join拼接表数据,按组加序号
  8. PyQt(Python+Qt)学习随笔:QTreeWidget的topLevelItemCount属性
  9. 转:为什么浏览器的user-agent字符串以'Mozilla'开头呢?
  10. 二分查找——没有想象中的容易(详解各种变式,超深度理解,c++)