- 对数据库进行DML语句(insert,update,delete,create)等等操作,那么数据库服务端执行的时候就会涉及到 redo log(重做日志) 和 binlog(归档日志) 两个日志文件的变动。
- 数据库的数据更新使用一种叫做WAL(Write-Ahead Logging)的技术,就是先写日志,再写磁盘;这么做的作用有两点,第一是保证数据写入的原子性和持久性,既在磁盘写入过程中出现断电的情况,数据库也可以根据日志来进行恢复工作。第二是写日志是顺序写入的,要比写磁盘随机写入快;等到存储引擎空闲时会将日志中的操作条目写入磁盘。
- 日志之所以能在断电后还有该条目是因为日志也是写在磁盘上。
如有数据写入操作:
- server层解析sql后通过执行器调用存储引擎。
- 引擎先将这条这条数据更新到内存中,同时将更新日志写入redo log中,此时redo log的状态处于prepare状态。然后告知执行器执行完成了,随时可以提交事务
- 执行器将操作写入binlog,并将binlog写入磁盘。
- 执行器调用引擎的提交事务接口,引擎把刚刚写入的redo log的状态改为commit状态,完成此次更新。
- redo log是物理log,既数据库实际哪一行修改成什么样,bin log是逻辑log,既进行了一条怎么的逻辑操作。redo log可用于故障恢复,bin log可用于数据库备份恢复。
- 两次提交是为了保证redo log 和binlog的一致性
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。