Mysql 中的三种常见的日志 redo log 重做日志,undo log 回滚日志 ,binlog 二进制日志
Redo log 日志 undo log 都是用来操作事务的,mysql中只有InnoDB可以操作事务,所以这两个日志应该是InnoDB独有日志方式。Binlog 是执行器用来记录逻辑操作的操作的二进制日志。
Redo log 操作执行于事务操作之后,提交之前,要么不执行,执行就会被记录,所以数据库在发生故障时可以使用redo log 恢复。Redo log 大小固定,记录满了以后就从头循环写。
Binlog 日志模块是Mysql Server 层面的叫做归档日志。记录的是原始逻辑。
Undo log 记录与实务执行之前,记录的数据的上一个版本,可以用于回滚。
注意:
- Redo log 和undo log 记录的都是数据的改变,而binlog 记录的是逻辑的操作。
- InnoDB中日志远比数据要重要。
- 单条sql语句也不能保证事务。
- data buffer 中数据会在合适时间由存储引擎写入data file。
一条更新语句执行的顺序
update T set c=c+1 where ID = 2;
- 事务开启undo日志到log buffer
- 执行器先找引擎ID=2这一行。 ID是主键,引擎直接使用树搜索找到这一行。如果ID=2这一行所在数据本来就在内存中,就直接返回给执行器;否则需要直接从磁盘读入内存,然后再返回。
- 执行器拿到引擎给的行数据,把这个值加上1,比如原来是N,现在就是N+1,得到新的一行数据,再调用引擎接口写入这行数据。
- 引擎将这行数据更新到内存中(执行事务),同时将这个更新操作记录(事务操作)到redo buff,这个时候引擎告诉执行器状态为prepare,
- 执行器生成这个操作binlog,并把binlog写入磁盘。
执行器调用引擎提交事务,redo buffer 落盘,修改redo log 为提交态,更新完成。
一条语句执行的顺序
三种日志的不同
1、binglog 是service 层的 执行器的日志 常用于主从备份
2、redo log innodb 的日志 ,每一才修改不可能都去操作磁盘所以会将记录写在redo log 中
在存储引擎空闲时再根据redo log日志跟新磁盘。 用于异常恢复。
3、undolog 引擎层的日志,记录执行前的数据,用于回滚和多版本控制