632 字
3 分钟
面试鸭-MySQL中的日志类型有哪些?binlog、redo log和undo log的作用和区别是什么?
MySQL中的日志类型有哪些?binlog、redo log和undo log的作用和区别是什么?
MySQL中有三种核心日志: binlog负责主从复制和数据恢复 redo log保证崩溃后数据不丢失 undo log用于事务回滚和MVCC。
- binlog是Server层的日志,记录的是逻辑操作,主要用来做主从同步,从库拉取主库的binlog重放一遍就能保持数据一致。
- redo log是InnoDB引擎独有的,记录物理变更,用于实现事务持久性。在写数据到磁盘的时候,如果出现宕机的情况,重启后可以根据redo log重放还恢复。
- undo log也是InnoDB引擎独有的,记录数据变更之前的旧值,用于实现事务回滚。并且MVCC的快照读也要依赖undo log,别的事务需要读历史版本,可以顺着undo log链去往前找。
区别: binlog记录数据变更的逻辑语言,由Server层生成,跨引擎通用。redo log和undo log服务与InnoDB的事务与恢复机制,依赖引擎内部实现,只有InnoDB才有。 binlog可以无限追加,redo log是循环覆盖写,满了会强制推进checkpoint把一部分脏页刷到磁盘中。
问题:
redo log写满了会怎么样?
MySQL会阻塞所有更新操作,然后强制推进checkpoint,将一部分脏页写到磁盘中,有空间了在继续写,这会导致性能下降。如果发现redo log经常接近写满可以调大其默认存储大小。(innodb_log_file_size)
binlog有几种格式?有什么优缺点?
有三种格式: statement格式:记录原始sql,日志量小,但是在读已提交隔离级别下有可能会导致主从不一致的问题。 row格式:记录行的实际物理变更数据,日志量大,但是比较安全,一般都用这个。 mixed格式:自动判断要用statement还是row,但是实际判断不够智能很少用。
为什么redo log要设计成循环写,而不是直接追加?
因为redo log的作用是崩溃恢复,防止数据没有成功写入就出问题了。当数据写入后对应的日志就没有作用了,因此,设计成循环写可以节省磁盘空间,并且磁盘顺序读取比较快。binlog使用追加是因为它要用来做主从复制和历史记录恢复,得长期保留不能清除。
面试鸭-MySQL中的日志类型有哪些?binlog、redo log和undo log的作用和区别是什么?
http://www.shineacz.top/posts/面试鸭-mysql中的日志类型有哪些binlogredo-log和undo-log的作用和区别是什么/