这里咱们先抛出答案,经过答案再展开分析mysql
特性 | 实现 |
---|---|
A(原子性) | redo |
C(一致性) | undo |
I(隔离性) | lock |
D(持久性) | redo/undo |
本节针对redo展开分析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重启,只要操做系统没重启,那数据仍是在的额
先弄个图看看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 和数据文件分开,选择更快的磁盘