暂无图片
optimize table 治理mysql 高水位和空间碎片
最近更新:2022-08-19 17:00:03

问题背景

随着系统上线时间的增长, mysql数据库的数据目录的文件系统使用率已经快要耗尽。从最初的两三个月 truancate一次 日志表,到最后每周要truancate 多次日志表。 业务侧将数据库中历史数据(超过全部数据的2/3)逐渐进行了迁移(采用目标库insert, 源库delete的方式),这些表中有多个超过100GB的大表, 甚至有两个在500GB以上的超大表。 虽然数据被迁移了,但是空间并没有被释放出来,业务侧的事情完成了,接下来需要我们在释放这些delete之后留下的空间。

注意事项

  • 锁表 image.png

引用在操作的准备阶段和提交阶段,会对表加排它锁。特别是准备阶段, 如果表上有大事务, 那 optimize操作在拿到锁之前会阻塞 后续的所有操作,包括select

  • 磁盘空间

引用执行过程中,会复制表的数据到一个中间文件中。所以需要注意有没有足够的空间进行此操作 执行过程中, 表上的DML 操作会记录到一个临时文件中, 文件的大小受innodb_online_alter_log_max_size控制,单位是字节。 如果表上的dml比较多, 执行操作前要调大 innodb_online_alter_log_max_size 参数。(此参数动态生效)

......