MySQL之binlog和redo log

本文详细探讨了MySQL中binlog和redolog的作用及写入机制,包括它们在备份、恢复和主从复制中的角色,以及如何通过调整参数提升IO性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章回答这样几个问题
1.binlog和redo log是什么,有什么用
2.binlog和redo log的写入机制
3.在业务高峰期调参数提升性能的方法

binlog和redo log是什么,有什么用

这两个日志都可以用于数据库的备份和恢复,以及主从复制。区别在于

binlogredo log备注
在sql 层产生在innoDB存储引擎层产生
记录数据行修改记录数据页修改
先提交事务,再产生binlog先产生redo log再提交事务
用于主从复制在在mysql崩溃时,恢复未提交事务数据

binlog和redo log写入机制

先说共性,这两个log的写入都要走这个过程:
先写入mysql server的buffer,再写入os buffer,再写入磁盘。

两个buffer之间的写入是内存操作,很快的,耗费io的操作是调用fsync写入磁盘的操作。

redo log 的写入机制

innodb_flush_log_at_trx_commit的值有三种0、1、2。控制log写入磁盘的频率。

innodb_flush_log_at_trx_commit的值写入策略
1事务commit后马上将log buffer写入os buffer并且调用fsync写入磁盘
0每秒写入os buffer并立刻调用fsync写入磁盘
2commit后立即写入os buffer,然后每秒调用fsync写磁盘

binlog 的写入机制

每个线程一个binlog缓存,因为binlog写入要求事务的完整性,即一个事务完成才能把事务binlog完整的写入。

sync_binlog的值写入策略
1事务commit后马上将log buffer写入os buffer并且调用fsync写入磁盘
0每秒写入os buffer并立刻调用fsync写入磁盘
N(N>1)commit后立即写入os buffer,积累N个事务调用fsync写磁盘

组提交机制(group commit)

双1配置是说将sync_binlog和innodb_flush_log_at_trx_commit都设置为1.那是不是说每次commit都要两次刷盘?但是是否定的。用组提交机制来实现。

如果你想提升 binlog 组提交的效果,可以通过设置binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_count实现:

binlog_group_commit_sync_delaybinlog_group_commit_sync_no_delay_count
调用多少微妙后再调用fsync积累多少次后调用fsync

应对IO性能瓶颈

如果IO出现性能瓶颈,可以考虑以下三个解决办法

  • 调大binlog_group_commit_sync_delay和binlog_group_commit_sync_no_delay_count,后果是可能增加sql执行时间,但是数据不会丢失。
  • sync_binlog设置大于1的数,风险是,断电后悔丢掉binlog日志
  • innodb_flush_log_at_trx_commit设置为2,风险是,断电后会丢失数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值