和Checkpoint检查点相关的成员变量:
变量名描述ib_uint64_t next_checkpoint_no 每完成一次checkpoint递增该值
lsn_t last_checkpoint_lsn 最近一次checkpoint时的lsn,每完成一次checkpoint,将next_checkpoint_lsn的值赋给last_checkpoint_lsn
lsn_t next_checkpoint_lsn 下次checkpoint的lsn(本次发起的checkpoint的lsn)
mtr_buf_t* append_on_checkpoint 5.7新增,在做DDL时(例如增删列),会先将包含MLOG_FILE_RENAME2日志记录的buf挂到这个变量上。 在DDL完成后,再清理掉。(log_append_on_checkpoint),主要是防止DDL期间crash产生的数据词典不一致。 该变量在如下commit加上: a5ecc38f44abb66aa2024c70e37d1f4aa4c8ace9
ulint n_pending_checkpoint_writes 大于0时,表示有一个checkpoint写入操作正在进行。用户发起checkpoint时,递增该值。后台线程完成checkpoint写入后,递减该值(log_io_complete)
rw_lock_t checkpoint_lock checkpoint锁,每次写checkpoint信息时需要加x锁。由异步io线程释放该x锁
byte* checkpoint_buf Checkpoint信息缓冲区,每次checkpoint前,先写该buf,再将buf刷到磁盘
其他状态变量
变量名描述bool check_flush_or_checkpoint 当该变量被设置时,用户线程可能需要去检查释放要刷log buffer、或是做preflush、checkpoint等以防止Redo 空间不足
lsn_t write_lsn 最近一次完成写入到文件的LSN
lsn_t current_flush_lsn 当前正在fsync到的LSN
lsn_t flushed_to_disk_lsn 最近一次完成fsync到文件的LSN
ulint n_pending_flushes 表示pending的redo fsync,这个值最大为1
os_event_t flush_event 若当前有正在进行的fsync,并且本次请求也是fsync操作,则需要等待上次fsync操作完成
log_sys与日志文件和日志缓冲区的关系可用下图来表示:
Mini transactionMini transaction(简称mtr)是InnoDB对物理数据文件操作的最小事务单元,用于管理对Page加锁、修改、释放、以及日志提交到公共buffer等工作。一个mtr操作必须是原子的,一个事务可以包含多个mtr。每个mtr完成后需要将本地产生的日志拷贝到公共缓冲区,将修改的脏页放到flush list上。
mtr事务对应的类为mtr_t, mtr_t::Impl中保存了当前mtr的相关信息,包括:
变量名描述mtr_buf_t m_memo 用于存储该mtr持有的锁类型
mtr_buf_t m_log 存储redo log记录
bool m_made_dirty 是否产生了至少一个脏页
bool m_inside_ibuf 是否在操作change buffer
bool m_modifications 是否修改了buffer pool page
ib_uint32_t m_n_log_recs 该mtr log记录个数
mtr_log_t m_log_mode Mtr的工作模式,包括四种: MTR_LOG_ALL:默认模式,记录所有会修改磁盘数据的操作;MTR_LOG_NONE:不记录redo,脏页也不放到flush list上;MTR_LOG_NO_REDO:不记录redo,但脏页放到flush list上;MTR_LOG_SHORT_INSERTS:插入记录操作REDO,在将记录从一个page拷贝到另外一个新建的page时用到,此时忽略写索引信息到redo log中。(参阅函数page_cur_insert_rec_write_log)
fil_space_t* m_user_space 当前mtr修改的用户表空间
fil_space_t* m_undo_space 当前mtr修改的undo表空间
fil_space_t* m_sys_space 当前mtr修改的系统表空间
mtr_state_t m_state 包含四种状态: MTR_STATE_INIT、MTR_STATE_COMMITTING、 MTR_STATE_COMMITTED