0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

mysql磁盘碎片整理

京东云 来源:jf_75140285 作者:jf_75140285 2024-08-27 15:26 次阅读

背景

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

碎片治理思路

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



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



创建分区表

wKgaombNf52AKKGpABCZGfhqC9I055.png

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

ALTER TABLE warehouse_stock_flow drop PARTITION p24;

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



表名切换

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

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

wKgZombNf56AMgbUAAQwDHqV6Cg590.png

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

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据库
    +关注

    关注

    7

    文章

    3761

    浏览量

    64272
  • 磁盘碎片整理

    关注

    0

    文章

    2

    浏览量

    5501
  • MySQL
    +关注

    关注

    1

    文章

    801

    浏览量

    26437
收藏 人收藏

    评论

    相关推荐

    MySQL还能跟上PostgreSQL的步伐吗

    Percona 的老板 Peter Zaitsev最近发表一篇博客,讨论了MySQL是否还能跟上PostgreSQL的脚步。Percona 作为MySQL 生态扛旗者,Percona 开发了知名
    的头像 发表于 11-18 10:16 123次阅读
    <b class='flag-5'>MySQL</b>还能跟上PostgreSQL的步伐吗

    详解MySQL多实例部署

    详解MySQL多实例部署
    的头像 发表于 11-11 11:10 162次阅读

    MySQL编码机制原理

    前言 一位读者在本地部署 MySQL 测试环境时碰到一个问题,我觉得挺有代表性的,所以写篇文章介绍一下,看完相信你会对 MySQL 的编码机制有最本质的了解,本文的目录结构如下 读者问题简介
    的头像 发表于 11-09 11:01 160次阅读

    适用于MySQL的dbForge架构比较

    dbForge Schema Compare for MySQL 是一种工具,用于轻松有效地比较和部署 MySQL 数据库结构和脚本文件夹差异。该工具提供了 MySQL 数据库架构中所有差异的全面视图。
    的头像 发表于 10-28 09:41 142次阅读
    适用于<b class='flag-5'>MySQL</b>的dbForge架构比较

    Linux磁盘IO详细解析

      在讲解磁盘IO前,先简单说下什么是磁盘磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态
    的头像 发表于 08-05 15:49 564次阅读
    Linux<b class='flag-5'>磁盘</b>IO详细解析

    MySQL知识点汇总

    大家好,这部分被称为DQL部分,是每个学习MySQL必须要学会的部分,下面就让我来介绍MySQL中的其他部分。
    的头像 发表于 08-05 15:27 366次阅读
    <b class='flag-5'>MySQL</b>知识点汇总

    MySQL的整体逻辑架构

    支持多种存储引擎是众所周知的MySQL特性,也是MySQL架构的关键优势之一。如果能够理解MySQL Server与存储引擎之间是怎样通过API交互的,将大大有利于理解MySQL的核心
    的头像 发表于 04-30 11:14 424次阅读
    <b class='flag-5'>MySQL</b>的整体逻辑架构

    MySQL忘记root密码解决方案

    mysql登录密码为password()算法加密,解密成本太高,以下为通用方案; 原理:mysql提供了特殊启动方式,即跳过权限表验证,启动后,登录不需要提供密码; 登录后,即可修改mysql数据库的user表,重置
    的头像 发表于 04-23 16:08 651次阅读

    【服务器数据恢复】服务器raid6阵列多块磁盘离线的数据恢复案例

    一台网站服务器中有一组由6块磁盘组建的RAID6磁盘阵列,操作系统层面运行MySQL数据库和存放一些其他类型文件。
    的头像 发表于 02-23 13:13 551次阅读

    MySQL密码忘记了怎么办?MySQL密码快速重置方法步骤命令示例!

    MySQL密码忘记了怎么办?MySQL密码快速重置方法步骤命令示例! MySQL是一种常用的关系型数据库管理系统,如果你忘记了MySQL的密码,不必担心,可以通过一些简单的步骤来快速重
    的头像 发表于 01-12 16:06 720次阅读

    如何使用Golang连接MySQL

    首先我们来看如何使用Golang连接MySQL
    的头像 发表于 01-08 09:42 3243次阅读
    如何使用Golang连接<b class='flag-5'>MySQL</b>

    mysql密码忘了怎么重置

    mysql密码忘了怎么重置  MySQL是一种开源的关系型数据库管理系统,密码用于保护数据库的安全性和保密性。如果你忘记了MySQL的密码,可以通过以下几种方法进行重置。 方法一:使用MySQ
    的头像 发表于 12-27 16:51 6329次阅读

    mysql配置失败怎么办

    MySQL是一款广泛使用的关系型数据库管理系统,但在配置过程中可能会出现各种问题,导致配置失败。本文将详细介绍MySQL配置失败的常见原因和对应的解决方案,以帮助读者快速排查和解决问题。 一、检查
    的头像 发表于 12-06 11:03 3373次阅读

    mysql数据库基础命令

    MySQL是一个流行的关系型数据库管理系统,经常用于存储、管理和操作数据。在本文中,我们将详细介绍MySQL的基础命令,并提供与每个命令相关的详细解释。 登录MySQL 要登录MySQL
    的头像 发表于 12-06 10:56 551次阅读

    php的mysql无法启动

    MySQL是一种常用的关系型数据库管理系统,而PHP是一种广泛应用于服务器端的脚本语言。在使用PHP开发网站或应用时,经常会碰到MySQL无法启动的问题。本文将详细介绍解决MySQL无法启动的方法
    的头像 发表于 12-04 15:59 1437次阅读