1. redo log事务提交后,数据绝对不会丢失的意义
只要你事务提交的时候保证你做的修改以日志形式写入redo log日志,此时宕机,mysql重启之后,把redo log在Buffer Pool里重做一遍,即可以数据不丢失了。
redo log的意义在于,如果更新的缓存页直接刷回磁盘,会很慢,靠redo log的顺序写速度很快。
2. redo log长什么样
redo log本质上记录的是在对某个表空间的某个数据页的某个偏移量的地址修改了几个字节的值,具体修改的值是什么,它记录的就是入日志类型+表空间号+数据页号+偏移量+修改几个字节的值+具体的值
根据修改数据页的几个字节的值,划分不同类型,MLOG_1BYTE类型就是修改了1个字节的值,MLOG_2BYTE、MLOG_4BYTE、MLOG_8BYTE,修改大串值就是MLOG_WRITE_STRING
3. redo log block&redo log buffer
redo log block 大小是512字节,12字节header,496字节是body,4字节是trailer
12字节头具体分为:
- 4字节block no ,块唯一编号
- 2字节data length,已写入多少字节
- 2字节的first record group。每个事务都会有多个redo log,是一个redo log gruop。这边存储是第一组的redo log偏移量
- 4字节的checkpoint on
redo log写入redo log block中然后整体落盘记录日志。
redo log buffer默认16MB,通过innodb_log_buffer_size控制。redo log buffer拥有N个redo log block。
4. redo log落盘时机
- 写入redo log buffer的日志已经占据总容量的一半时,就会刷盘
- 一个事务提交的时候,它的那些redo log所在的redo log block都刷盘
- 后台线程定时刷新,每隔1s刷盘
- mysql关闭的时候,也会刷盘
通过参数innodb_log_group_home_dir、innodb_log_file_size与innodb_log_files_in_groups,一个指定目录,一个指定大小(默认48MB),一个指定数量(默认2)
默认情况下,目录中两个文件,ib_logfile0个ib_logfile1,每个48MB,先写一个,写满了写第二个。第二个也满了,继续写第一个,覆盖第一文件。
一个redo log很小,默认的96M,足够存储上百万条了。
5. undo log长啥样
insert的undo log类型是TRX_UNDO_INSERT_REC,包含如下信息:
- 这条日志的开始位置
- 主键的各列长度和值
- 表id
- undo log日志编号
- undo log日志类型
- 这条日志的结束位置
有了这些信息,当需要回滚的时候,取出日志信息,根据表Id加主键找到对应的缓存页直接删除掉插入的数据。