mysql中常见的三种log,分别是重做日志(redo log),回滚日志(undo log),以及二进制日志(binlog)
1. redo log
作用:当数据库对数据做修改的时候,需要把数据页从磁盘读到buffer pool中,然后在buffer pool中进行修改,那么这个时候buffer pool中的数据页就与磁盘上的数据页内容不一致,称buffer pool的数据页为dirty page 脏数据,如果这个时候发生非正常的DB服务重启,那么这些数据还没在内存,并没有同步到磁盘文件中(注意,同步到磁盘文件是个随机IO),也就是会发生数据丢失,所以在重启mysql服务的时候,可以根据redo log进行重做,从而达到事务的持久性
内容:物理日志,即记录修改后的数据行
什么时候产生:事务开始之后产生redo log
什么时候释放:当对应事务的脏页写入到磁盘之后,redo log即可被覆盖
什么时候写入磁盘:
Master Thread每秒一次执行刷新Innodb_log_buffer到重做日志文件
每个事务提交时将重做日志刷新到重做日志文件
当重做日志缓存可用空间少于一半时,重做日志缓存被刷新到重做日志文件
2. undo log
作用:保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC)
内容:物理日志,修改前的数据行
什么时候产生:事务开始之前,将当前版本生成undo log,undo也会产生redo来保证undo log的可靠性
什么时候释放:当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间
3. binlog
作用:用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步;用于数据库的基于时间点的还原
什么时候产生:事务提交的时候,一次性将事务中的sql语句或者是修改过后的语句按照一定的格式记录到binlog中
什么时候释放:由参数expire_logs_days决定
与redo log的不同点:
作用不同:redo log用来保证事务的持久性,binlog则用来复制数据库
内容不同:redo log是物理日志,binlog通常是逻辑日志
生命周期不同
效率不同:基于物理日志的redo log回复数据的效率高于binlog