一、前言
redo log、undo log、bin log是MySQL中的三大核心日志,其中redo log、undo log是innoDB引擎层的日志,bin log是server层的日志。理解这三种日志,对于帮助我们理解事务有十分重要的意义。
二、redo log
作用:确保事务的持久性,记录数据修改之后的值,当数据写入到内存,但还没写到磁盘时,服务器出现故障,重启MySQL后,会从redo log恢复发生故障之前的数据,叫做crash-safe
提升性能:更新数据时,为了减少磁盘IO次数,每次操作都会先将数据写入到内存中,再根据策略将redo log中的数据刷到磁盘中去。
刷盘策略:通过innodb_flush_log_at_trx_commit 值来控制刷盘策略
- 值为0时,每次提交事务不进行刷盘操作,而是每秒执行一次将数据刷新写入到磁盘中,在事务提交后,Log Buffer不会直接将数据写入到OS Buffer,而是每秒写入一次数据到OS Buffer并调用fsync()写入磁盘,所以MySQL服务挂了或服务器宕机时有可能导致1秒钟数据丢失,性能最高
- 值为1时,每次提交事务都会将Log Buffer写入OS Buffer再调用fsync()写入磁盘。即使过程中MySQL服务挂了或服务器宕机,也不会丢失数据,但性能最差,也是默认的策略
- 值为2时,每次提交事务都会写入到OS Buffer中,再每秒调用fsync()写入磁盘,只有服务器宕机才有可能丢失一秒钟数据,性能居中,但比起值为0时的策略要安全很多
OS buffer:操作系统的缓存
log buffer:MySQL的缓存
通过show variables like '%innodb_log%' ;可以查看redo log的文件大小等信息
二、undo log
作用:确保事务的原子性,同时可以实现多版本并发控制(MVCC)
内容:undo log是逻辑日志,会通过逻辑将数据恢复到事务开始之前的的状态
产生时间:在事务开始之前就会产生
存储位置:默认存储在共享空间中,可通过以下语法查看
show global variables like "innodb_data_file_path%";
三、bin log
作用:可以恢复数据库,可以帮助实现MySQL主从复制
bin log与redo log的区别
- bin log是server层面的,redo log是innoDB独有的
- bin log是逻辑日志,redo log是物理日志
- redo log的恢复效率比bin log快
- redo log是循环写的,有空间限制,redo log是追加的
|