重作日志相关

Ⅰ、事务的实现

这里咱们先抛出答案,经过答案再展开分析mysql

特性 实现
A(原子性) redo
C(一致性) undo
I(隔离性) lock
D(持久性) redo/undo

本节针对redo展开分析sql

Ⅱ、redo详解

2.1 redo log buffer

  • redo就是咱们常说的重作日志,用来实现持久性
  • mysql目录下两个ib_logfile文件,就是重作日志文件,在ssd场景下至少设置为4G
  • redo log里面记录的是每一个page修改操做的物理逻辑日志(不是彻底的二进制的差别值,好比一个sql修改了一千万行,一千万个page被修改了,那记录的是1000w page的变化,而不是sql语句)

redo由redo log buffer和redo log file组成,重作日志先写入一块内存,再按期刷新到磁盘缓存

先看下redo log bufferoracle

它由不少个log block组成,每一个log block 512个字节,不须要doublewrite
性能

innodb_log_buffer_size    8M便可,不须要太大,一秒钟写满8M不太可能

redo log刷盘的条件spa

①master thread    每秒从内存刷到磁盘
  5.6版本后,增长innodb_flush_log_at_timeout参数,能够设置刷新间隔,默认为1,调大一点可减小io,提高性能,但不建议

②redo log buffer  使用大于1/2也会刷

③事务提交时进行刷新,即便上面两个条件不知足(事务持久性的要求)
  innodb_flush_log_at_trx_commit={0|1|2},默认为1,事务提交时将redo log buffer写到磁盘(即便上面两个条件不知足,这样crash了就还能够经过redo恢复),只有是1的时候innodb才能真正达到持久性的标准
  事务对page作了修改,提交的时候并不须要保证赃页刷到磁盘,只须要保证将对应修改的日志刷过去就能够了
  0表示交给master thread每秒刷新,事务提交不将redo log buffer刷到磁盘,最多会丢失1s的事务
  2表示事务提交时仅将redo log buffer写到操做系统缓存,因此mysql重启,只要操做系统没重启,那数据仍是在的额

2.2 redo log file

先弄个图看看redo buffer刷盘吧操作系统

每一个ib_logfile都分为不少个512bits的块,最前头2k是留出来写checkpoint的,经过对比两个cp可知哪一个是最新的,cp1和cp2轮询写确保cp不会坏掉,一个坏了也没事,即便用小的cp顶多就是恢复的时候多一点时间,没有oracle的归档

优势: 这样作的好处是不须要归档,少了IO操做
缺点: 若是redo_log_file过小则可能须要等待,由于当要覆盖log_file中的log_block时,若是该log_block中的脏页尚未进行刷新的话,则须要等待这个脏页进行刷新
因此须要把redo log file设置的尽量的大

redo日志分类3d

物理日志:记录整个page的变化(diff)日志

逻辑日志:Like SQL语句code

物理逻辑日志:根据page进行记录,内容逻辑

redo log file与redo log buffer内容一致

+---------------+----------+---------+---------------+
| redo_log_type | space no | page no | redo log body |
+---------------+----------+---------+---------------+
#  redo log 类型  表空间号     页号    redo log 内容
MLOG_REC_INSERT
+------+--------+------+---------+------------+-------+---------+-----------+----------+
| type | space  | page | cur_rec | len &      | info  | origin  | mis_match | rec body |
|      |   no   |  no  | _offset | extra_info | _bits | _offset | _index    |          |
+------+--------+------+---------+------------+-------+---------+-----------+----------+
MLOG_REC_DELETE
+------+----------+---------+--------+
| type | space no | page no | offset |
+------+----------+---------+--------+

rec body根据page的变化来记录,而不是根据操做SQL来记录,因此偏物理日志
由于还记录了redo log body,一个具体操做,因此又叫逻辑

每种不一样类型的redo log的内在格式可能长得不同

相关参数

innodb_log_file_size 单个redo文件大小(推荐8G,官方推荐等于bp)
  以前不建议调大由于有bug,若是调大,恢复速度会很慢O(N^2)
  5.5版本的redo文件总大小(num * size)最大只能4G
  5.6以后限制未512G,调大后惟一的问题就是恢复的内容变多了
  5.6以后,正常关闭MySQL,而后调整该值,会自动调整文件大小
innodb_log_files_in_group
innodb_log_group_home_dir 和数据文件分开,选择更快的磁盘
相关文章
相关标签/搜索