mysql-空间压缩杂记

技术

alter table xxx engine

边界

操作是单表的维度

原理实例

假定:1主3从

方案1 手工方式

先压缩从,从升主,再压缩原主,前提是本机空间足够,系统处于较空闲状态

  1. 通过工具cli连接到从1 建立session_cli,关闭session_cli对应的binlog,不能让工具中的操作产生数据污染
  2. 通过工具cli 对从1 执行碎片整理 alter table xxx engine = innodb,在线操作,主从同步会稍微慢一些,但不会终止
  3. 依次对从2,从3 执行这个操作
  4. 在主从无差异的情况下(主只读来保证,会有业务影响),通过管控平台执行主从切换,通常是将从1 提升为主,元主变为从1,再对新从1执行
  5. 最终需要将原主再提为主
方案2:ghost工具:

原理:对主建立中间表,通过快照同步和差异同步的方式,将带压缩表的数据全部导入到新表中,然后表名称替换(rename),在主表中的操作,会通过binlog传递到从表中,从表也会执行以上操作

前提:磁盘空间足够,系统处于较空闲状态

大致过程:

  1. gh-ost在主库执行压缩命令 alter table xxx engine = innodb
  2. gh-ost会给待压缩表 通过create table命令创建中间表
  3. gh-ost内部会记录当前表的一个快照状态,即数据边界的,将此快照数据分批全部拷贝到中间表中(加锁的)
  4. Gh-ost同时将快照差异数据同步到中间表,持续解析每次copy之后的有变更的binlog的sql,在中间表执行
  5. 待db不忙,对原表加锁,判断两个表数据一致的情况下,rename(最强锁,会挂起dml操作)

分段处理:
10
update 1-30 ,
20 copy 新的
30 copy 新的

10 段的数据 bin log 中有此数据段的变更,从binlog中解析出来的redo log 只处理10段的数据,20和30段的不处理。

主库中的以上操作,都会通过binlog同步给从库,所有的从库也会按照主库的方式执行一遍。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容