MySQL 引擎特性 InnoDB redo log漫游(2)

其中与 redo log 文件相关的成员变量包括:

变量名描述
log_groups   日志组,当前版本仅支持一组日志,对应类型为 log_group_t ,包含了当前日志组的文件个数、每个文件的大小、space id等信息  
lsn_t log_group_capacity   表示当前日志文件的总容量,值为:(Redo log文件总大小 - redo 文件个数 * LOG_FILE_HDR_SIZE) * 0.9,LOG_FILE_HDR_SIZE 为 4*512 字节  
lsn_t max_modified_age_async   异步 preflush dirty page 点  
lsn_t max_modified_age_sync   同步 preflush dirty page 点  
lsn_t max_checkpoint_age_async   异步 checkpoint 点  
lsn_t max_checkpoint_age   同步 checkpoint 点  

上述几个sync/async点的计算方式可以参阅函数log_calc_max_ages,以如下实例配置为例:

innodb_log_files_in_group=4 innodb_log_file_size=4G 总文件大小: 17179869184

各个成员变量值及占总文件大小的比例:

log_sys->log_group_capacity = 15461874893 (90%) log_sys->max_modified_age_async = 12175607164 (71%) log_sys->max_modified_age_sync = 13045293390 (76%) log_sys->max_checkpoint_age_async = 13480136503 (78%) log_sys->max_checkpoint_age = 13914979615 (81%)

通常的:

当当前未刷脏的最老lsn和当前lsn的距离超过max_modified_age_async(71%)时,且开启了选项innodb_adaptive_flushing时,page cleaner线程会去尝试做更多的dirty page flush工作,避免脏页堆积。
当当前未刷脏的最老lsn和当前Lsn的距离超过max_modified_age_sync(76%)时,用户线程需要去做同步刷脏,这是一个性能下降的临界点,会极大的影响整体吞吐量和响应时间。
当上次checkpoint的lsn和当前lsn超过max_checkpoint_age(81%),用户线程需要同步地做一次checkpoint,需要等待checkpoint写入完成。
当上次checkpoint的lsn和当前lsn的距离超过max_checkpoint_age_async(78%)但小于max_checkpoint_age(81%)时,用户线程做一次异步checkpoint(后台异步线程执行CHECKPOINT信息写入操作),无需等待checkpoint完成。

log_group_t结构体主要成员如下表所示:

变量名描述
ulint n_files   Ib_logfile的文件个数  
lsn_t file_size   文件大小  
ulint space_id   Redo log 的space id, 固定大小,值为SRV_LOG_SPACE_FIRST_ID  
ulint state   LOG_GROUP_OK 或者 LOG_GROUP_CORRUPTED  
lsn_t lsn   该group内写到的lsn  
lsn_t lsn_offset   上述lsn对应的文件偏移量  
byte** file_header_bufs   Buffer区域,用于设定日志文件头信息,并写入ib logfile。当切换到新的ib_logfile时,更新该文件的起始lsn,写入头部。 头部信息还包含: LOG_GROUP_ID, LOG_FILE_START_LSN(当前文件起始lsn)、LOG_FILE_WAS_CREATED_BY_HOT_BACKUP(函数log_group_file_header_flush)  
lsn_t scanned_lsn   用于崩溃恢复时辅助记录扫描到的lsn号  
byte* checkpoint_buf   Checkpoint缓冲区,用于向日志文件写入checkpoint信息(下文详细描述)  

与redo log 内存缓冲区相关的成员变量包括:

变量名描述
ulint buf_free   Log buffer中当前空闲可写的位置  
byte* buf   Log buffer起始位置指针  
ulint buf_size   Log buffer 大小,受参数innodb_log_buffer_size控制,但可能会自动extend  
ulint max_buf_free   值为log_sys->buf_size / LOG_BUF_FLUSH_RATIO - LOG_BUF_FLUSH_MARGIN, 其中: LOG_BUF_FLUSH_RATIO=2, LOG_BUF_FLUSH_MARGIN=(4 * 512 + 4* page_size) ,page_size默认为16k,当buf_free超过该值时,可能触发用户线程去写redo;在事务拷redo 到buffer后,也会判断该值,如果超过buf_free,设置log_sys->check_flush_or_checkpoint为true  
ulint buf_next_to_write   Log buffer偏移量,下次写入redo文件的起始位置,即本次写入的结束位置  
volatile bool is_extending   Log buffer是否正在进行扩展 (防止过大的redo log entry无法写入buffer), 实际上,当写入的redo log长度超过buf_size/2时,就会去调用函数log_buffer_extend,一旦扩展Buffer,就不会在缩减回去了!  
ulint write_end_offset   本次写入的结束位置偏移量(从逻辑来看有点多余,直接用log_sys->buf_free就行了)  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/8cd87edb4eabf47a36398be5984e79ac.html