本文共 1594 字,大约阅读时间需要 5 分钟。
purge 线程主要负责清理 InnoDB 存储引擎中的两个关键区域:del flag 记录和 undo 记录(即事务回滚日志)。其工作机制涉及协调线程和多个工作线程,通过特定的规则和参数配置来保证数据库的高效运行。
协调线程的主要职责是监控和管理 purge 线程的工作状态。其工作流程如下:
等待与唤醒机制:
历史长度检测:
rseg_history_len 未增加,且小于 5000,协调线程会进入长时间等待状态。为了防止清理过程中影响当前正在读取的数据,purge 线程会在每次清理前克隆最老的 read view。这样可以确保清理操作不会干扰到正在进行的读取操作。
purge 线程通过优先队列(priority queue)管理待清理的事务回滚段。具体操作如下:
trx_no 小于等于最旧的 read view 的 low_limit_no,则直接清理该段。在清理过程中,purge 线程会根据以下规则判断是否需要清理当前事务回滚段:
trx_no 大于等于最旧的 read view 的 low_limit_no,则需要清理。purge 线程每次清理默认会处理 300 个页面(由参数 innodb_purge_batch_size 控制)。清理过程会持续执行,直到没有更多需要清理的页面为止。
一旦协调线程确认需要清理,工作线程会接手具体的清理操作。清理过程包括:
row_purge 函数进行实际的删除操作。为了防止 undo history 无限膨胀,purge 线程会根据以下规则进行清理:
innodb_purge_rseg_truncate_frequency 控制。undo history 的清理主要包括以下步骤:
如果需要进行 undo tablespace 截断,则需要满足以下条件:
innodb_undo_log_truncate 必须开启。innodb_max_undo_log_size。通过以上流程可以看出,purge 线程的工作机制非常复杂且高效。它通过协调线程和工作线程的协同工作,确保了数据库中的 del flag 记录和 undo 记录能够及时清理,从而保证了数据库的稳定运行。
如果需要进一步了解相关技术,可以通过扫描二维码添加作者的微信,获取更多深入的技术内容。
转载地址:http://htyk.baihongyu.com/