技术
alter table xxx engine
边界
操作是单表的维度
原理实例
假定:1主3从
方案1 手工方式
先压缩从,从升主,再压缩原主,前提是本机空间足够,系统处于较空闲状态
- 通过工具cli连接到从1 建立session_cli,关闭session_cli对应的binlog,不能让工具中的操作产生数据污染
- 通过工具cli 对从1 执行碎片整理 alter table xxx engine = innodb,在线操作,主从同步会稍微慢一些,但不会终止
- 依次对从2,从3 执行这个操作
- 在主从无差异的情况下(主只读来保证,会有业务影响),通过管控平台执行主从切换,通常是将从1 提升为主,元主变为从1,再对新从1执行
- 最终需要将原主再提为主
方案2:ghost工具:
原理:对主建立中间表,通过快照同步和差异同步的方式,将带压缩表的数据全部导入到新表中,然后表名称替换(rename),在主表中的操作,会通过binlog传递到从表中,从表也会执行以上操作
前提:磁盘空间足够,系统处于较空闲状态
大致过程:
- gh-ost在主库执行压缩命令 alter table xxx engine = innodb
- gh-ost会给待压缩表 通过create table命令创建中间表
- gh-ost内部会记录当前表的一个快照状态,即数据边界的,将此快照数据分批全部拷贝到中间表中(加锁的)
- Gh-ost同时将快照差异数据同步到中间表,持续解析每次copy之后的有变更的binlog的sql,在中间表执行
- 待db不忙,对原表加锁,判断两个表数据一致的情况下,rename(最强锁,会挂起dml操作)
分段处理:
10
update 1-30 ,
20 copy 新的
30 copy 新的
10 段的数据 bin log 中有此数据段的变更,从binlog中解析出来的redo log 只处理10段的数据,20和30段的不处理。
主库中的以上操作,都会通过binlog同步给从库,所有的从库也会按照主库的方式执行一遍。