MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: MySQL Binlog--事务日志和BINLOG落盘参数对磁盘IO的影响

mysql主从延迟,最近项目中遇到一个mysql 主从同步延迟非常严重的问题。

修改双0,立马下来。

 

innodb_flush_log_at_trx_commit这个参数关系到事务日志落地,

默认参数1 每一次事务提交或事务外的指令都需要把日志写入硬盘,io开销大

参数0 每隔一秒把log buffer刷到文件系统中去,并且调用文件系统的“flush”操作将缓存刷新到磁盘上去。这样的话,可能丢失1秒的事务数据。

参数 2 在每次事务提交的时候会把log buffer刷到文件系统中去,但是每隔一秒调用文件系统的“flush”操作将缓存刷新到磁盘上去。


这里解释下,系统文件和磁盘介质之间也有缓存,这里的0 是提交日志之后,每隔1秒将logbuffer刷到系统文件中,并马上执行落盘操作,写到到物理介质

2呢是刷到系统文件系统之后,每隔1秒调用flush,写到物理介质,并不是马上


两者的区别是,0:当mysql挂了之后,可能会损失前一秒的事务信息

2:当mysql挂了之后,如果系统文件系统没挂,不会有事务丢失

 

参数说明

innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数,不同参数设置对磁盘IO影响不同。

 

参数innodb_flush_log_at_trx_commit


innodb_flush_log_at_trx_commit=0:每秒一次将Log Buffer中数据写入到Log File中,并且Flush到磁盘。事务提交不会主动触发写磁盘操作。
innodb_flush_log_at_trx_commit=1:每次事务提交时将Log Buffer数据写入到Log File中,并且Flush到磁盘。
innodb_flush_log_at_trx_commit=2:每次事务提交时将Log Buffer数据写入到Log File中,但不立即Flush到磁盘,MySQL会每秒一次刷新到磁盘。
由于进程调度问题,每条一次操作不能保证每一秒都执行一次。
当innodb_flush_log_at_trx_commit=0时,最近一秒的事务日志存在MySQL的Log Buffer中,无论时MySQL实例停止还是MySQL服务器宕机,都会导致最近一秒的事务日志丢失。
当innodb_flush_log_at_trx_commit=1时,最近一秒的事务日志存在操作系统的文件缓存中,MySQL实例停止不会导致事务日志丢失,但MySQL服务器宕机会导致最近一秒事务日志丢失。
上述的一秒一次刷新,取决于参数innodb_flush_log_at_timeout默认值为1,DDL或其他InnoDB内部操作并不受参数innodb_flush_log_at_trx_commit的限制。


图片来源于:https://www.h3399.cn/201809/614170.html

 

参数sync_binlog:

sync_binlog=0:每次事务提交后,将Binlog Cache中的数据写入到Binlog文件,但不立即刷新到磁盘。由文件系统(file system)决定何时刷新到磁盘中。
sync_binlog=N:每N次事务提交后,将Binlog Cache中的数据写入到Binlog文件,调用fdatasync()函数将数据刷新到磁盘中。
当sync_binlog=0(默认设置)时,不会执行强制刷盘指令,性能最好同时风险最高。
当sync_binlog=N时,当MySQL服务器宕机后,会导致最近N个事务的BINLOG丢失。

 

BINLOG和REDO/UNDO LOG的区别


1、处理层次不同,REDO/UNDO LOG由Innodb存储引擎处理,而BINLOG由MySQL 服务层处理。
2、记录内容不同,REDO/UNDO LOG记录的数据页的修改情况,REDO LOG采用物理日志+逻辑日志的方式存储,UNDO LOG采用逻辑日志方式存储,用于保证数据一致性;而BINLOG日志记录的事务操作的内容,用于主从复制。
3、记录时机不同,REDO/UNDO LOG在事务的执行过程中不断生成和写入,而BINLOG在事务最终COMMIT前写入。
4、涉及到数据更新的SELECT操作会被记录到BINLOG中(基于语句格式复制)。
5、BINLOG刷新到磁盘的行为由参数sync_binlog决定,而REDO LOG写入磁盘的行为受参数innodb_flush_log_at_trx_commit的影响。
6、可以通过会话级参数SQL_LOG_BIN来设置某事务不生成BINLOG,但不能通过参数控制是否生成事务日志。


 

某台从库存在严重的复制延迟,调整参数后性能变化:

1、主库(MySQL 5.5版本)凌晨2点开始清理历史数据。
2、从库(MySQL 5.7版本)开启多线程复制,但由于从库做多源复制且单线程复制(主库MySQL 5.5),磁盘使用率飙升至80%,出现复制延迟。
3、从库在08:35调整参数为双0,CPU使用率从3%提升至7%,磁盘使用率从75%降至8%,磁盘写次数从8500下降至2200,复制延迟开始下降。
4、从库在08:51复制无延迟,积压时间被消费完,CPU使用率恢复至1%,磁盘使用率从8%降至1%,磁盘写次数从2200下降至300。
5、从库在09:01调整参数为双1,CPU使用率无变化,磁盘使用率从1%升至8%,磁盘写次数从300升职2200。

 

IOPS测试

创建测试表:


## 创建测试表
CREATE TABLE `tb003` (
  `ID` bigint(20) NOT NULL AUTO_INCREMENT,
  `C1` int(11) DEFAULT NULL,
  `DT` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


创建测试脚本:

#!/bin/bash
for i in $(seq 1 10000)  
do   
/export/servers/mysql/bin/mysql --host='127.0.0.1' --port=3358 --user='root' --password="root_psw" -e 'insert into db001.tb003(c1)values(0);' 1>/dev/nul 2>&1
done

运行测试脚本发现,每秒执行230个左右事务,使用iostat -dxk 1查看发现服务器每秒写1380,事务提交次数和每秒IO写次数的比约为1:6。

 

https://www.cnblogs.com/gaogao67/p/11023837.html


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
MySQL锁机制:并发控制与事务隔离
本文深入解析了MySQL的锁机制与事务隔离级别,涵盖锁类型、兼容性、死锁处理及性能优化策略,助你掌握高并发场景下的数据库并发控制核心技巧。
|
4月前
|
存储 监控 Oracle
MySQL事务
MySQL事务具有ACID特性,包括原子性、一致性、隔离性和持久性。其默认隔离级别为可重复读,通过MVCC和间隙锁解决幻读问题,确保事务间数据的一致性和并发性。
MySQL事务
|
5月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
2月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的事务隔离级别
数据库并发访问时易引发数据不一致问题。如客户端读取到未提交的事务数据,可能导致“脏读”。MySQL通过四种事务隔离级别(读未提交、读已提交、可重复读、可序列化)控制并发行为,默认为“可重复读”,以平衡性能与数据一致性。
261 0
|
3月前
|
关系型数据库 MySQL 数据库
MySql事务以及事务的四大特性
事务是数据库操作的基本单元,具有ACID四大特性:原子性、一致性、隔离性、持久性。它确保数据的正确性与完整性。并发事务可能引发脏读、不可重复读、幻读等问题,数据库通过不同隔离级别(如读未提交、读已提交、可重复读、串行化)加以解决。MySQL默认使用可重复读级别。高隔离级别虽能更好处理并发问题,但会降低性能。
164 0
|
5月前
|
安全 关系型数据库 MySQL
mysql事务隔离级别
事务隔离级别用于解决脏读、不可重复读和幻读问题。不同级别在安全与性能间权衡,如SERIALIZABLE最安全但性能差,READ_UNCOMMITTED性能高但易导致数据不一致。了解各级别特性有助于合理选择以平衡并发性与数据一致性需求。
185 1
|
10月前
|
关系型数据库 MySQL
图解MySQL【日志】——磁盘 I/O 次数过高时优化的办法
当 MySQL 磁盘 I/O 次数过高时,可通过调整参数优化。控制刷盘时机以降低频率:组提交参数 `binlog_group_commit_sync_delay` 和 `binlog_group_commit_sync_no_delay_count` 调整等待时间和事务数量;`sync_binlog=N` 设置 write 和 fsync 频率,`innodb_flush_log_at_trx_commit=2` 使提交时只写入 Redo Log 文件,由 OS 择机持久化,但两者在 OS 崩溃时有丢失数据风险。
257 3
|
9月前
|
SQL 数据库
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到
|
3月前
|
SQL 运维 关系型数据库
深入探讨MySQL的二进制日志(binlog)选项
总结而言,对MySQL binlogs深度理解并妥善配置对数据库运维管理至关重要;它不仅关系到系统性能优化也是实现高可靠性架构设计必须考虑因素之一。通过精心规划与周密部署可以使得该机能充分发挥作用而避免潜在风险带来影响。
135 6
|
4月前
|
存储 SQL 关系型数据库
MySQL中binlog、redolog与undolog的不同之处解析
每个都扮演回答回溯与错误修正机构角色: BinLog像历史记载员详细记载每件大大小小事件; RedoLog则像紧急救援队伍遇见突發情況追踪最后活动轨迹尽力补救; UndoLog就类似时间机器可倒带历史让一切归位原始样貌同时兼具平行宇宙观察能让多人同时看见各自期望看见历程而互不干扰.
235 9

推荐镜像

更多