mysql log长度_MySQL如何计算统计redo log大小

在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的事务日志文件大概能支撑多长时间就会切换。有具体数据支撑,你才好分析判断,否则巧妇也难为无米之炊。

在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 'redo log的大小,单位为mb'

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT 'redo日志大小信息表';

--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_REDOLOG_SIZE

ON SCHEDULE EVERY 10 MINUTE STARTS '2020-10-16 08:00:00'

ON COMPLETION PRESERVE

DO CALL mysql.Record_Innodb_Log_Size;

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值