写点什么

mysql 磁盘碎片整理

  • 2024-08-27
    北京
  • 本文字数:773 字

    阅读完需:约 3 分钟

背景

数据结转过程中经常进行 delete 操作,产生空白空间,如果进行新的插入操作,MySQL 将尝试利用这些留空的区域,但仍然无法将其彻底占用,于是造成了数据的存储位置不连续,以及物理存储顺序与理论上的排序顺序不同,久而久之就产生了碎片。

碎片治理思路

根据线上处理经验总结比对 4 种处理磁盘碎片优缺点


创建分区表


上述分区表,在某一分区内数据结转完成后,


ALTER TABLE warehouse_stock_flow drop PARTITION p24;
复制代码


当然不是所有的表都是可以创建分区表的。如果某一张数据表在很长一段时间内没有进行数据结转,且无法创建分区表的话,可以利用以下方法。

表名切换

如果某一张数据表在很长一段时间内没有进行数据结转,可以创建临时表,通过大数据将某一结转周期内数据推送至临时表,在代码层面进行数据的双写,最后再通过表名更换的方式进行表名转换。其实,治理磁盘碎片最好的方法就是删除表,不同业务对数据的要求不同。如果有可能的话新建一个临时表。


利用 rename 语句对数据库表信息进行修改,不会锁表,可以达到零延迟,无抖动,对线上无任何影响。



rename table xx_record to xx_record_temp1,xx_temp to xx_record,xx_record_temp1 to xx_record_temp;
复制代码

总结

不管是使用云还是商城数据库,只要使用 mysql,必然会遇到 Mysql 碎片问题痛点,数据量大的业务表应该设计成分区表方便磁盘碎片整理,降低维护成本和业务影响。 碎片清理前后,IO 性能会上升,SQL 执行效率更快。所以,在日常运维工作中,应对碎片进行定期清理,保证数据库有稳定的性能和充足的空间。

扩展

提到提高 IO 性能,在紧急情况下还可以考虑开启刷盘(设置 sync_binlog=0;innodb_flush_log_at_trx_commit=0 ),但开启刷盘会有数据丢失风险(集团数据库模板配置参数默认 sync_binlog=1;innodb_flush_log_at_trx_commit=1 )。

附件

mysql 数据库核心参数介绍: https://www.cnblogs.com/klvchen/p/10861850.html


发布于: 1 小时前阅读数: 5
用户头像

拥抱技术,与开发者携手创造未来! 2018-11-20 加入

我们将持续为人工智能、大数据、云计算、物联网等相关领域的开发者,提供技术干货、行业技术内容、技术落地实践等文章内容。京东云开发者社区官方网站【https://developer.jdcloud.com/】,欢迎大家来玩

评论

发布
暂无评论
mysql磁盘碎片整理_京东科技开发者_InfoQ写作社区