mysql磁盘碎片整理

背景

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

碎片治理思路

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



治理方案优势缺点备注
将数据量巨大的表设计成分区表,按时间分区通过结转分区数据,删除分区释放磁盘碎片,磁盘IO抖动秒级别,对线上业务影响小估算数据量,每个分区不超过3亿数据350G为佳;库存流水,订单表这些表应该在创建时就应该设计成分区表,避免以后磁盘碎片痛点
重建表存储引擎,重新组织数据(ALTER TABLE tablename ENGINE=InnoDB;)整理过程加锁,周期长,且对线上业务影响较大:10亿数据量,1000G,tp99会持续超过60s谨慎操作
主从切换(DBA可使用一个磁盘更大的干净的库,进行主从切换)涉及面广,牵扯范围较大,处理时长在分钟级谨慎操作
创建临时表进行数据双写最后进行数据库表名切换零延迟,无抖动,对线上无任何影响需要磁盘空间较大



创建分区表



75d2bb7048be4eb28abebe237e1370cf~tplv-73owjymdk6-jj-mark-v1_0_0_0_0_5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5Lqs5Lic5LqR5byA5Y-R6ICF_q75 

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

ALTER TABLE warehouse_stock_flow drop PARTITION p24;

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



表名切换

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

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

05eeed0fd6644194847f1de0497a8517~tplv-73owjymdk6-jj-mark-v1_0_0_0_0_5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5Lqs5Lic5LqR5byA5Y-R6ICF_q75 

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

<p align="center"><img src="https://p0-xtjj-private.juejin.cn/tos-cn-i-73owjymdk6/9068570129f14ec3a3fd819123cf1bab~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5Lqs5Lic5LqR5byA5Y-R6ICF:q75.awebp?policy=eyJ2bSI6MywidWlkIjoiMjYzNDg1NDM4MDM0MDAwOCJ9&rk3s=f64ab15b&x-orig-authkey=f32326d3454f2ac7e96d3d06cdbb035152127018&x-orig-expires=1725343583&x-orig-sign=91i2dZm8HCxsiL1hcyzVByQr8WE%3D" alt="image.png"></p> <p align=center>扫一扫,加入技术交流群</p>
点赞
收藏

评论区

加载中...

相关推荐

Java实现顺序栈

一、分析  栈是限定仅在表的一端进行插入或删除操作的线性表,对于栈来说,操作端称为栈顶,另一端则称为栈底,栈的修改是按照后进先出的原则进行的,因此又称为后进先出的线性表。  顺序栈是指利用顺序存储结构实现的栈,即利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。  一个标准的顺序栈

MySQL 磁盘满了,怎么办??

问题使用命令发现磁盘使用率为100%了,还剩几十兆。一系列神操作:备份数据库,删除实例、删除数据库表、重启mysql服务.结果磁盘空间均为释放怎么办网上查了很多资源,说要进行磁盘碎片化整理。原因是datafree占据的空间太多啦。具体可以通过这个sql查看。SELECTCONCAT(TRUNCATE(S

MySql 备份+ 高可用(二)

一、Xtrabackup介绍  MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周实用完整备份,周一到周六实用增量备份。

mysql 数据库group by 按排序取值

mysql数据库groupby按排序取值 mysql5.7以后,groupby想要按照排序的顺序来取值,在子结果集中要有union,groupby等操作,不然按照id默认排序来取值示例:数据库:score表id user\_id num1 100     952 100     963

mysql存储引擎

什么是存储引擎?MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySql的存储引擎:MyISAM节省数据库空间,当数据读远大于修改时,可以使用该存储引擎InnoDB支持事务,

MySQL记录操作

\TOC\一、概览MySQL数据操作:DML在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括:1.使用INSERT实现数据的插入2.UPDATE实现数据的更新3.使用DELETE实现数据的删除4.使用SELECT查询数据以及。二、插入数据(insert)