一、主从相同表空间相差巨大
1.1 问题描述
我们知道MySQL主从基本上是逻辑的复制,那么有少量的空间差异没有问题,但是本案例主库表只有10G,但是从库表有100G,这么大的差距比较少见,需要分析原因。
1.2 问题分析
实际上这个问题还是要从read view和purge 线程2个方面进行分析,不得不在老生常谈一下(复制一下以前的文章)。
1.2.1 read view和可见性简述
一致性读取(consistent read),根据隔离级别的不同,会在不同的时机建立read view,如下:
- RR 事务的第一个select命令发起的时候建立read view,直到事务提交释放
- RC 事务的每一个select都会单独建立read view
有了read view 就能够对每行数据的可见性进行判断了,下面是read view中的关键属性
- m_up_limit_id:如果行的trx id 小于了m_up_limit_id则可见。
- m_low_limit_id:如果行的trx id 大于了m_low_limit_id则不可见。
- m_ids:是用于记录建立read view时刻的读写事务的vector数组,用于对于m_up_limit_id和m_low_limit_id之间的trx需要根据它来进行判定,是否处于活跃状态。
- m_low_limit_no则用于记录建立read view时刻的最小trx no,主要用于purge线程判断清理undo使用。
而对于可见性的判断我们可以参考如下函数:
/** Check whether the changes by