简述 undo log 和 redo log 的作用
# binlog和redo log是什么,有什么用
这两个日志都可以用于数据库的备份和恢复,以及主从复制。区别在于
binlog | redo 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写入磁盘 2 | commit后立即写入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_delay | binlog_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,风险是,断电后会丢失数据。
编辑 (opens new window)
上次更新: 2022/05/22, 00:01:01