分享

Binlog 增长过快,MySQL性能骤降?5个方法搞定!

 昵称10087950 2023-06-22 发布于江苏

binlog(归档日志)的增长过快,可能导致 MySQL 的性能下降存储空间消耗数据恢复慢等问题。

例如:

电商平台的大量订单数据被写入数据库,每次订单状态变更,都会产生相应的数据库操作。

binlog 的增长就会很快,可能影响 MySQL 的性能及存储消耗等。

大家好,我是爱分享的程序员宝妹儿,分享即学习。

本篇我们深入探讨:binlog 增长过快的原因,及具体解决方案

图片

这也是 MySQL 的重要知识点及高频面试点,宝妹儿顺便将这个题目以及答案,整理到2023版《MySQL 大厂高频面试题大全》PDF了,方便系统学习、面试通关。

宝妹儿精编的2023版《MySQL 大厂高频面试题大全》,已收录100+道真题,近30000字,长期迭代、持续更新。吃透它,应付MySQL面试没问题。

公众号Java面试题宝,自取。

01
Binlog 增长过快会怎样?

MySQL 中,binlog(归档日志)主要用于记录数据库的修改操作,以实现数据的持久化和恢复。

binlog 增长过快时,磁盘空间占用过多,就会导致磁盘空间不足性能下降等问题,从而影响数据库性能和稳定性。

1)磁盘空间不足


大量的 binlog 日志占用磁盘空间,磁盘空间很快就不够用,导致数据库无法正常工作。


2)性能下降


由于 binlog 的写入操作需要消耗系统资源,当 binlog 增长过快时,就会增加系统的负担,导致数据库性能下降。

02
Binlog 增长过快的原因是什么?

binlog(归档日志)增长过快的常见原因

2.1 大事务

当执行一个包含大量操作的事务时,每个操作都会被记录到 binlog 中,生成大量的 binlog 记录,将会导致 binlog 文件的增长。

2.2 频繁的 DDL 操作

频繁的 DDL 操作会导致 binlog 不断增长,尤其是在表结构变更频繁的情况下。

2.3 长时间的读事务

读事务本身不会产生 binlog 记录,但当读事务持续时间较长时,就会导致 binlog 文件无法被清理。

这是因为 MySQL 需要确保 binlog 中的所有事务都被持久化,直到最长的读事务结束。

2.4 错误的配置参数

不正确的 MySQL 配置参数,例如:将 binlog_format 参数设置为 ROW 模式。

不合理的 binlog 大小限制(max_binlog_size)和 binlog 保留时间(expire_logs_days)设置。

03
Binlog 增长过快的解决方案?

3.1 拆分大事务

大事务是导致 binlog 增长过快的常见原因之一。

当执行一个包含大量操作的事务时,每个操作都会被记录到 binlog 中,生成大量的 binlog 记录,将会导致 binlog 文件的增长。

通过将大事务拆分为多个较小的事务,每个小事务所产生的 binlog 记录更有限,这样就能减少每个事务产生的 binlog 记录数量,起到减缓 binlog 增长速度的目的。














-- 原始大事务BEGIN;-- 大事务的操作语句COMMIT;
-- 拆分为小事务BEGIN;-- 小事务的操作语句COMMIT;
BEGIN; -- 小事务的操作语句COMMIT;


3.2 优化 DDL 操作


DDL(数据定义语言)操作也会产生 binlog 记录,例如:创建表、添加索引等。


频繁的 DDL 操作会导致 binlog 不断增长,尤其是在表结构变更频繁的情况下。


对此,我们可以考虑优化 DDL 操作的执行方式。


例如:合并多个 DDL 操作为一个批处理操作。












COLUMN column1 INT;ALTER TABLE table1 ADD COLUMN column2 INT;ALTER TABLE table2 MODIFY COLUMN column1 VARCHAR(100);
-- 合并为批处理操作ALTER TABLE table1 ADD COLUMN column1 INT, ADD COLUMN column2 INT;
ALTER TABLE table2 MODIFY COLUMN column1 VARCHAR(100);

通过将多个 DDL 操作合并为一个批处理操作,减少了每次操作所产生的 binlog 记录数量,从而降低了 binlog 的增长速度。

3.3 增加 binlog 的回滚点


设置 binlog 的回滚点可以限制 binlog 的生成量,防止无限增长。


通过设置合适的回滚点,我们可以根据实际需求来控制 binlog 的生成量(保留时长或大小),避免过快增长。


设置 binlog 的保留时长为3天。



SET GLOBAL binlog_expire_logs_seconds = 259200;

设置 binlog 保留大小为 1GB。


SET GLOBAL max_binlog_size = 1073741824;


3.4 定期清理和归档


定期清理过期的 binlog 文件,以释放磁盘空间。


例如:

使用 PURGE BINARY LOGS 命令,来删除不再需要的 binlog 文件,并保留最近一段时间内的 binlog 文件作为备份和恢复所需。

3.5 将 raw 模式改为 Statement 模式













mysql> show global variables like '%binlog_format%';+---------------+-----------+| Variable_name | Value     |+---------------+-----------+| binlog_format | STATEMENT |+---------------+-----------+1 row in set (0.01 sec)
mysql> SET global binlog_format='STATEMENT';Query OK, 1 rows affected (0.00 sec)mysql> reset master;Query OK, 0 rows affected (1.49 sec)

MySQL 5.7.7 之后,binlog 的存储格式默认 Row,Row 是最详细、也是最消耗磁盘的。

关于 binlog 的三种模式,这篇文章有详细介绍:吃透3大Binlog模式,MySQL数据零丢失

04
总结

通过本文,我们学习并掌握了 binlog 增长过快的影响、原因及解决方案。

遇到类似问题,可以参考下本文,逐一排查处理,能少走一些弯路。

分享即学习,我是爱分享的程序员宝妹儿。

如果觉得有用,请顺手【点赞】支持下哦,这将是对宝妹儿的最大鼓励,谢谢~

PS. 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多