redo日志-mysql45讲-打卡活动

2021/10/13 19:16:08

本文主要是介绍redo日志-mysql45讲-打卡活动,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

  1. redo log 文件格式

type:日志类型

space ID:表空间ID

page number:页号

data:日志内容

  1. 日志类型

MLOG_1BYTE

MLOG_2BYTE

MLOG_4BYTE

MLOG_8BYTE

MLOG_WRITE_STRING

MLOG_REC_INSERT

MLOG_COMP_REC_INSERT

MLOG_COMP_PAGE_CREATE

MLOG_COMP_PAGE_REC_DELETE

MLOG_COMP_LIST_START_DELETE

MLOG_LIST_END_DELETE

MLOG_ZIP_PAGE_COMPRESS

  1. MLOG_COMP_REC_INSERT,除了上面的格式外,还有n_fields,n_uniques,field1_len,field2_len,field n_len,offset(前一条记录的地址),end_seg_len(从该字段可以计算出当前记录总共占用存储空间的大小),extra_size(记录额外信息占用的存储空间大小),mixmatch index
  2. MLOG_MULTI_REC_END,这个类型的redo日志,只有type字段,来保证redo log日志的完整性,因为在操作数据页时,会发生乐观插入或悲观插入,所谓乐观插入,就是插入的数据,数据页有足够空闲空间,则不会产生特别多的日志,而悲观插入会发生页分裂,会修改free链表、free_frag链表等,会产生日志有二三十条,为了保证这些日志原子性插入,就在日志后面加上了这一个特殊的日志,表示操作日志结束,在崩溃恢复时,只有解析到这一类型的日志,才认为是一组完整的日志
  3. Mini-Transaction:指对底层页面进行一次原子访问的过程
  4. redo log block:生成的redo日志都放在大小为512字节页中,这种页称为block,redo log block结构为:log block header(12字节)、log block body(496字节)和log block trailer(4字节),一共512字节,log block trailer存log block checksum四个字节,而log block header分为:LOG_BLOCK_HDR_NO(编号值),LOG_BLOCK_HDR_DATA_LEN(表示block用了多少字节),LOG_BLOCK_FIRST_REC_GROUP(redo log记录组的偏移量)、LOG_BLOCK_CHECKPOINT_NO(表示checkpoint序号)
  5. redo log缓冲区(redo log buffer),全局变量buf_free指明后续写入的redo日志写到redo log buffer中的哪个位置
  6. 刷盘时机:第一个为redo log buffer空间不足,如何才算不足呢?当前定稿log buffer日志量占满了总容量的50%左右;第二个为事务提交
  7. show variables like 'datadir',查看数据目录,下面有两个文件ib_logfile0和ib_logfile1,redo log buffer默认刷盘会刷到这两个磁盘文件中,可以通过innodb_log_group_home_dir修改redo日志文件所在目录,innodb_log_file_size指定文件大小,5.7.30版本默认为48MB,innodb_log_files_in_group为文件个数,默认为2,最大值为100
  8. redo log文件:这个文件前面2048字节,是四个特殊的block,格式为log file header记录文件一些整体属性,LOG_HEADER_FORMAT,日志的版本,LOG_HEADER_PAD1没什么意义,LOG_HEADER_START_LSN,LOG_HEADER_CREATOR描述创建者是谁,一般为mysql版本号,LOG_BLOCK_CHECKSUM,校验值,后面跟着checkpoint,结构为:LOG_CHECKPOINT_NO,LOG_CHECKPOINT_LSN,LOG_CHECKPOINT_OFFSET,LOG_CHECKPOINT_LOG_BUF_SZE,LOG_BLOCK_CHECKSUM
  9. log sequence number(lsn):初始值为8704,这是mysql设计规定的
  10. flushed_to_disk_lsn:表示刷新到磁盘中的redo日志量的全局变量,buf_next_to_write全局变量,指明当前log buffer有哪些日志被刷到磁盘
  11. checkpoint:计算当前系统中可以被覆盖的redo日志对应的lsn值最大是多少,将checkpoint_lsn与对应的redo日志文件组偏移量以及此次checkpoint的编号写到日志文件的管理信息(checkpoint1..)中,checkpoint_no来统计目前系统执行了多少次checkpoint,为奇数时,写到checkpoint1
  12. innodb_flush_log_at_trx_commit,为0时,表示在事务提交时不立即向磁盘同步redo log,由后台线程处理,为1时表示事务提交时需要将redo日志同步到磁盘,默认为1,为2时,表示事务提交时需要将redo log写到操作系统的缓区中,但并不需要保证将日志真正地刷新到磁盘
  13. 崩溃恢复,从redo日志文件组第一个文件的管理信息中取最近发生的那次checkpoint信息,然后从checkpoint_lsn在日志文件组中对应的偏移量开始,一直扫描日志文件中的block,直到某个block的LOG_BLOCK_HDR_DATA_LEN值不等于512为止,过程中,使用哈希表加快过程,并且会跳过已经刷新到磁盘的页面,这个哈希表为根据redo log的space id、page number计算出哈希值,把space id和page number相同的redo日志放到哈希表的同一个槽中,如果有多个,则通过链表连接起来

 



这篇关于redo日志-mysql45讲-打卡活动的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程