关于这三个log,redo log 和 undo log 是归属于Innodb 存储引擎的 ,bin log 是归属于 mysql Server 这个层面的。
redo log 和 undo log 都是存储引擎层面上生成的日志,并且都记录了数据的修改,只不过 redo log记录的是"物理级别"上的页修改操作,undo log 记录的是逻辑操作日志,比如对某一行数据进行了INSERT语句操作,那么 undo log就记录一条与之相反的DELETE操作。
Redo Log —— 保证事务持久性,数据异常恢复和服务重启时页数据同步恢复
redo log作用是为了保证数据的可靠性,最终落盘。但是又为了提升写入速度引入了redo log(buffer),然后通过一些策略再落盘到对应的 redolog file 中,关于redolog需要注意一下几点:
- 当发生数据修改的时候,会不断产生redolog,这些redolog 会先写入redo log buffer,同时innodb引擎会在合适的时机将记录刷新到磁盘中
- redo log 的大小是固定的,是循环写的过程
- 有了redo log之后,innodb就可以保证即使数据库发生异常重启,之前的记录也不会丢失,叫做crash-safe
Redo 落盘细节和落盘配置方式
Mysql 在写日志的时候在用户空间有一个 log Buffer区域,对应在操作系统 内核空间有一个OS Buffer,通过一定的策略,对应的log buffer中的数据刷新到os buffer中,然后再将osbuffer中的数据刷新到log文件
如果数据更新到内存中,还没有进行持久化,也就是内存中已经存在,但是没有更新到磁盘中,如果这个时候断电,重启后磁盘和内存中数据会丢失,为了保证数据尽可能完整,mysql 提供了一个配置策略 ,有三个选项,即innodb_flush_log_at_trx_commit = 0|1|2。(默认是1)
innodb_flush_log_at_trx_commit 的配置
0:提交事务的时候 ,是每隔一秒把 log buffer 中的数据刷新到os buffer,并调用 fsync() 写入到log文件,也就是说一秒之前的日志都是保存在log buffer缓冲区中,如果宕机,重启可能会丢失1s 的数据。