mysqldump 备份参数深度解析:--single-transaction 与 --master-data
前言 在 MySQL 备份实践中,mysqldump --single-transaction --master-data=2 是最常见的组合。但很多 DBA 只知道"这样用不锁表",却不清楚底层原理。今天我们深入剖析这两个参数的工作机制,以及为什么它们必须配合使用。 一、MVCC 可见性规则(理论基础) 在理解 --single-transaction 之前,必须先掌握 InnoDB 的 MVCC 机制。 1.1 Read View 结构 当事务执行 START TRANSACTION WITH CONSISTENT SNAPSHOT 时,InnoDB 会创建一个 Read View: 1 2 3 4 5 6 7 struct read_view_t { trx_id_t m_low_limit_id; // 系统中尚未分配的最小事务ID(当前最大事务ID + 1) trx_id_t m_up_limit_id; // 活跃事务列表中的最小事务ID trx_id_t m_creator_trx_id; // 创建此 Read View 的事务ID trx_id_t *m_ids; // 创建 Read View 时的活跃事务ID数组(降序) ulint m_n_trx_ids; // 活跃事务数量 }; 注意:InnoDB 的命名反直觉 m_low_limit_id 虽然叫 “low limit”,但实际是最大值(下一个要分配的事务ID) m_up_limit_id 虽然叫 “up limit”,但实际是最小值(最小活跃事务ID) 1.2 可见性判断规则 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 def is_visible(row_trx_id, read_view): # 规则1:如果是当前事务自己修改的,可见 if row_trx_id == read_view.m_creator_trx_id: return True # 规则2:如果行的事务ID < m_up_limit_id(最小活跃事务ID),说明在 Read View 创建前已提交,可见 if row_trx_id < read_view.m_up_limit_id: return True # 规则3:如果行的事务ID >= m_low_limit_id(下一个要分配的ID),说明在 Read View 创建后才开始,不可见 if row_trx_id >= read_view.m_low_limit_id: return False # 规则4:如果在 [m_up_limit_id, m_low_limit_id) 区间内 # 需要检查是否在活跃事务列表 m_ids 中 if row_trx_id in read_view.m_ids: return False # 在活跃列表中,说明创建 Read View 时未提交,不可见 else: return True # 不在活跃列表中,说明已提交,可见 可见性判断示例: ...