Mysql 包含了 redo log(重做日志)、binlog(归档日志)、undo log (回滚日志),下面介绍下每个日志的作用。
redo log(重做日志)
让InnoDB存储引擎拥有了崩溃恢复能力。InnoDB 存储引擎为 redo log 的刷盘策略提供了 innodb_flush_log_at_trx_commit 参数,它支持三种策略:
- 0 :设置为 0 的时候,表示每次事务提交时不进行刷盘操作
- 1 :设置为 1 的时候,表示每次事务提交时都将进行刷盘操作(默认值)
- 2 :设置为 2 的时候,表示每次事务提交时都只把 redo log buffer 内容写入 page cache
innodb_flush_log_at_trx_commit 参数默认为 1 ,也就是说当事务提交时会调用 fsync 对 redo log 进行刷盘
另外,InnoDB 存储引擎有一个后台线程,每隔1 秒,就会把 redo log buffer 中的内容写到文件系统缓存(page cache),然后调用 fsync 刷盘。
binlog(归档日志)
保证了MySQL集群架构的数据一致性。
记录格式:
statement,row,mixed
两阶段提交 为了解决两份日志之间的逻辑一致问题,
InnoDB存储引擎使用两阶段提交方案。 先写 redo log 变成 prepare,提交事务写 binlog 完成后让 redo log 提交。通过事务id关联bing log 和 redo log 的取别?
binlog记载的是update/delete/insert这样的SQL语句,而redo log记载的是物理修改的内容(xxxx页修改了xxx)。 所以在搜索资料的时候会有这样的说法:redo log记录的是数据的物理变化,binlog记录的是数据的逻辑变化
undo log
主要有两个作用:回滚和多版本控制(MVCC)
在数据修改的时候,不仅记录了redo log,还记录undo log,如果因为某些原因导致事务失败或回滚了,可以用undo log进行回滚undo log主要存储的也是逻辑日志,比如我们要insert一条数据了,那undo log会记录的一条对应的delete日志。我们要update一条记录时,它会记录一条对应相反的update记录。
