Mysql 日志系统
1)Redo日志
基于innoDB引擎
redo log通常是物理日志,记录的是数据页的物理修改,而不是某一行或者某几行的修改,用来恢复提交后的物理数据页。
redo log使用WAL(write ahead logging)技术,每次提交事务后,都会讲存储引擎中的log buffer中的日志写入内核中的OS buffer中,再从OS Buffer写到磁盘的redo log file中。
redo log有三种写入方式:
0)redo log每秒钟写入OS buffer中,再持久化到磁盘。
1)redo log在每次事务提交后,写入os buffer,在从os buffer写入磁盘。
2)redo log在每次事务提交后,写入os buffer,每秒钟从os buffer写入磁盘。
由 innodb_flush_log_at_trx_commit 参数控制。
innodb 的 redo log 有固定大小,write pos 记录当前写入的位置,check point指向当前擦除的位置
2)binlog
逻辑日志,server 端日志
通过和redo log合作,通过两段式提交和保证日志和数据的一致性。
redo log prepare-> 写binlog-> redo log commit
3)undo log
undo log是为了实现事务的原子性,在innoDB中还使用undo log实现MVCC
在操作任何数据之前,先将数据备份到一个地方(undo log),然后进行数据的修改。如果出现错误或者用户调用了ROLLBACK语句,系统可以使用undo log将数据恢复到事务开始前的状态。
undo log是逻辑日志,可以理解为生成增删改操作对应相反的一条语句。