mysql redo文件切换
在把log buffer写入磁盘的过程中,需要检查是否log file有足够的空间,如果没有足够空间时需要循环等待。
log_writer
|--> log_writer_mutex_enter
|--> Log_thread_waiting::wait // 等待log buffer中有未write完的redo,或者用户线程触发的 writer_event
| |--> os_event_wait_for -> log.writer_event (os_event::timed_wait(pthread_cond_timedwait))
| |--> stop_condition()
| | |--> log_advance_ready_for_write_lsn // 检查 log buffer中是否有 需要write的连续内容
| | | |--> recent_written::advance_tail_until; // 重要函数 更新link buf;
|--> log_writer_write_buffer // 如果发现有需要写的内容,开始干活
| |--> log_writer_wait_on_checkpoint // 循环等待直到log file有空间
| |--> log_files_write_buffer // write 到 page cache
| | |--> compute_how_much_to_write // 计算需要写入的数据大小
| | |--> prepare_full_blocks // 更新即将写入的 LOG BLOCK的物理信息
| | |--> write_blocks -> fil_redo_io -> do_redo_io // redo write io
| | | |--> os_file_write [见下文]
| | |--> log.write_lsn.store // 更新 新的 write_lsn
| | |--> notify_about_advanced_write_lsn // 【见下文】
| | |--> log_update_buf_limit // 更新 buf_limit_sn,上文 log_buffer_reserve有,判断log buffer空间
https://zhuanlan.zhihu.com/p/459433088
- 点赞
- 收藏
- 关注作者
评论(0)