MySQL 5.7 缩小空间占用实践

某几个数据表越来越大,占用空间快达4T, 其中很多数据都是历史数据,可以被清空的数据。现在想要缩小空间,则需要:

  1. 删除表中的数据
  2. 重构表,因为删除数据并不会回收占用的空间,需要重构才行
  3. 删除和重构不能影响正式服务
  4. 重构的目的是为了缩小空间占用,但重构需要2倍的空间,但运服务器的空间扩大后,就无法缩小
  5. 不能直接在正式数据库进行操作

方案

  1. 搭建主从,使用Docker搭建
  2. 在从服务器上进行删除(需要写专门的删除逻辑)
  3. 在从服务器上,扩大硬盘大小至2倍,然后复制一份新表,把旧表删除,把新表重命名为旧表
  4. 从服务器上暂停同步,且停止数据库。添加一块容量为原硬盘大小一半的新的云盘,把数据从原硬盘使用rsync复制到新盘。这一步要特别注意,因为数据库特别大,使用rsync复制可能需要的时间非常长,我这边花了一天多的时间才复制完成。所以,主服务器上的binlog需要保存至少5天的时间,如果正式服务业务量比较大,存放binlog的硬盘需要有足够的容量。
  5. 把新盘做为mysql的盘,启动从服务,开始与主服务器进行数据同步,直到同步完成。
  6. 当同步完成后,在业务量很低的时间里,停止主服务器,对主数据盘做好快照,然后把从服务器上硬盘挂载的主服务器,让主服务器从这块新挂载的硬盘上启动
  7. 检查测试,确保数据和功能逻辑一切正常
  8. 释放主服务器老硬盘,完成缩容,释放空间的目的。