1. redu log日志
1.1什么是redo log
- 它是InnoDB存储引擎的日志,利用redo log能够实现事务持久化。
- 它是物理逻辑日志,记录了数据页的物理修改,而不是记录某个sql逻辑语句。
- 内存中有一个redo log buffer,用于作为redo log日志的缓冲池。大小设置8M就够了。
1.2 执行过程
-
先将数据页读入内存缓冲池 -
?修改内存数据页 -
将redo log日志写入内存的redo log buffer中 -
将内存的redo log buffer中的数据写入redo日志文件,(顺序写入,IO性能高) -
事务完成提交。 -
后续mysql数据库找机会将脏页刷盘到磁盘的数据页中。
1.3 什么时候刷新redo log buffer
- master thread每秒定时刷新
- redo log buffer 使用大于二分之一会进行刷新
- 事务提交时自动刷新(默认innodb_flush_log_at_trx_commit=1)
- innodb_flush_log_at_trx_commit=0 :提交事务时将redo日志写入内存redo log buffer中。(这样可能会丢失1秒中的数据)
- innodb_flush_log_at_trx_commit=1 :提交事务时将redo日志写入redo log日志文件中(fsync函数:写入磁盘文件。)
- innodb_flush_log_at_trx_commit=2?:提交事务时将redo日志写入操作系统缓存中,这样如果数据库宕机但是操作系统没重启的话,数据页不会丢失。(fwrite函数:写入操作系统缓存,不一定写入磁盘文件)
1.4 补充
- 物理日志:记录每个页的变化
- 逻辑日志:记录类似于sql语句
- 物理逻辑日志:根据数据页进行记录,但是记录的内容又是逻辑的。
- 记录哪次(sequence)如何操作(update,insert)哪页(page)的哪行(row)
1.5 binlog日志与redo log日志对比
- binlog日志是逻辑日志,记录的是类似sql语句,redo log日志是物理(逻辑)日志,记录的是对数据页的修改。
- binlog日志在事务提交时才会一次性写入磁盘,而redo log在事务开始时,就开始写入内存的redo log buffer中(这个缓冲区每隔一秒自动刷新到磁盘),在提交的时候会将这些更新刷新到磁盘。
- 举个例子,一个事务里面,有多条更新语句。每执行一条更新语句,就会向redo log buffer中写入redo日志。而执行到commmit时,才会向二进制日志文件写入二进制日志。
1.6 binlog与redolog写入磁盘顺序
- 开启事务
- 修改数据:此时会触发向内存中redo log buffer写入日志(每隔一秒会自动刷新到磁盘)
- 提交事务:会触发向redo log 磁盘文件写入日志,再触发向二进制磁盘文件写入日志
1.7 事务提交时(commit)如何保证redo日志和binlog日志都写入了磁盘
- innodb存储引擎先向磁盘中redo日志文件中写入一个prepare redo log
- 然后向磁盘中二进制文件写入binlog
- 最后innodb存储引擎再向磁盘中redo日志文件中写入一个commit redo log
- 如果步骤1成功,步骤2与3失败,则回滚事务。
- 如果步骤1和步骤2成功,则重新执行步骤三即可?
2. undo log
2.1 介绍
- undo log属于逻辑日志,记录的是一个变化的过程
- 在数据库事务开始之前,会将要修改的记录存放到Undo日志里,当事务回滚时或者数据库奔溃时,可以利用undo日志,撤销未提交事务对数据库产生的影响
- undo的销毁:在事务提交时,并不会立刻删除undo log,innodb会将该事务对应的undo log 放入到删除列表,后面会通过后台线程purge thread进行回收处理。
|