MySQL|空间碎片化问题处理

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 通过对TOP表数据量的监控,我们可以看到sys_rest_server_log的数据量已经达到7000w,除空间占用外,我们更关注的是该表对数据库带来的性能隐患。若业务上或者人为不当的查询该表数据,其操作的资源消耗在一定程度上一定会对正常业务造成影响。

一、空间碎片化严重案例分享

1.1 问题描述

实例磁盘空间近1个月上涨趋势明显,主要是个别日志表存储较大且部分表存在空间碎片化的现象。

1.2 处理流程

1、通过日常巡检以及监控发现某实例磁盘空间近1月上涨趋势明显

image.png

2、在询问业务方是否为正常的业务增长外,查看该实例top表空间的表,排查是否存在异常较大的表

1)查看数据存储量较大的schema

SELECT table_Schema  , round(SUM((DATA_LENGTH + INDEX_LENGTH + DATA_FREE) / 1024 / 1024), 2) AS Total_Size FROM tables GROUP BY table_schema ORDER BY Total_Size DESC;

image.png

2)查看具体schema下top表的空间使用情况

SELECT table_schema, table_name  , round(DATA_LENGTH / 1024 / 1024, 2) AS Data_Size , round(INDEX_LENGTH / 1024 / 1024, 2) AS Index_Size , round(DATA_FREE / 1024 / 1024, 2) AS Free_Size FROM tables WHERE table_schema = 'db_rim' ORDER BY Data_Size DESC LIMIT 10;

image.png

3、从以上截图中我们可以得到信息:db_rim库库下,rim_user_msg_log表的数据量很大,可查看是否可对该表中无效的数据进行清理?rim_user_msg_analyse这张表的碎片化将尽17G,可考虑对这些碎片化空间进行回收

4、最终采取的处理方法为:rim_user_msg_log表直接清空,rim_user_msg_analyse进行碎片化回收

1)清理前

image.png

2)清理后

image.png

3)实例磁盘空间使用趋势

image.png

二、表数据量过大清理案例

2.1 问题描述

通过对TOP表数据量的监控,我们可以看到sys_rest_server_log的数据量已经达到7000w,除空间占用外,我们更关注的是该表对数据库带来的性能隐患。若业务上或者人为不当的查询该表数据,其操作的资源消耗在一定程度上一定会对正常业务造成影响。

image.png

2.2 问题处理

1、该表当前的表现主要有两点,一点是某瞬时写入量极大,另外一点是表日增可达到300w记录数。对于数据库而言这种表行为或业务设计是不合理的,我们需要搞清楚该表究竟是用来记录哪些信息,业务设计是否合理?

通过观察表数据以及与相关开发人员沟通,我们得知该表会记录应用端所有的接口调用信息,我们所观察到的数据增长尖峰也正是由于业务量上涨而导致该表瞬间并发写入大量日志信息。

image.png

image.png

2、对于这种大数据量的日志记录信息,建议最好使用ELK这种日志分析服务,而不是使用数据库进行存储

3、限于开发人员开发能力有限,无法改造业务架构。针对该表日增长、瞬间增长都极大的情况,我们与开发人员沟通该表记录的数据是否可从源端上进行减少。只记录重要信息、非重要信息的接口日志入库进行屏蔽

4、确定表数据记录可从最根本减产后,我们仍需要对目前7000w的数据进行处理,将历史无效数据进行清理,并制定合适的数据清理策略

5、无效历史数据清理/数据清理策略

1、创建备份表: create table sys_rest_server_log_bak_0228_1 like sys_rest_server_log;  
2、表名替换 将源表sys_rest_server_log重命名为备份表,备份表sys_rest_server_log_bak_0208_1重命名为源表sys_rest_server_log,业务数据会写入空的新表,但是在rename期间这部分业务日志写入会失败【需关注】 rename table sys_rest_server_log to sys_rest_server_log_bak_0228_2,sys_rest_server_log_bak_0228_1 to sys_rest_server_log;  
3、将备份表sys_rest_server_log_bak_0208_2中的仍然需要的数据重新写入到sys_rest_server_log,分批次写入,sys_rest_server_log保留近15天数据。程序上可保证主键fd_id唯一,避免主键冲突。 insert into sys_rest_server_log select * from sys_rest_server_log_bak_0228_2 where fd_start_time between 'xxx' and 'xxx';  
4、调整平台数据清理策略,将服务运行日志备份天数改为15天,清除服务运行日志备份天数改为30天  
5、sys_rest_server_log_bak_0228_2表保留80+天记录数据,暂时可以不做清理,等程序维护的sys_rest_server_log_backup有完备的数据后,将sys_rest_server_log_bak_0228_2表清除;

三、总结归纳

2.1 如何判断表碎片化问题是否严重

表数据的频繁更新容易对表空间造成一定的碎片化,我们可以通过information_schema.table表中的data_free字段判断该表碎片化是否严重。

2.2 如何处理碎片化问题

optimize table tableName; alter table tablName engine=innodb;

2.3 大表历史数据清楚过程中的关注点

1、通过创建bak表与源表进行rename替换,rename期间会造成业务对该表数据写入失败 
2、bak表创建的时需关注primayr key 
1)程序上保证主键唯一可不需要关注 
2)若主键使用自增长,建议在创建bak表创建时提高当前的auto_increment指,空余一部分buffer空间,保证后续将源表历史数据写入rename后的新表时主键不冲突 
3、对于此类经常需要进行数据清理的表,建议使用分区表进行存储,后续对数据的处理仅仅需要删除指定分区
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6月前
|
关系型数据库 MySQL Unix
linux优化空间&完全卸载mysql——centos7.9
linux优化空间&完全卸载mysql——centos7.9
139 7
|
23天前
|
SQL 存储 关系型数据库
MySQL 回收表碎片实践教程
在 MySQL 数据库中,随着数据的增删改操作,表空间可能会出现碎片化,这不仅会占用额外的存储空间,还可能降低表的扫描效率,特别是一些大表,在进行数据清理后会产生大量的碎片。本篇文章我们一起来学习下如何进行碎片回收以及相关注意点。
57 1
MySQL 回收表碎片实践教程
|
4月前
|
存储 关系型数据库 MySQL
MySQL数据库碎片化:隐患与解决策略
UUID作为主键可能导致MySQL存储碎片,影响性能。频繁的DML操作、字段长度变化和非顺序插入(如UUID)都会造成碎片。碎片增加磁盘I/O,降低查询效率,浪费空间,影响备份速度。建议使用自增ID,固定长度字段,并适时运行OPTIMIZE TABLE来减少碎片。
|
24天前
|
SQL 存储 关系型数据库
mysql 数据库空间统计sql
mysql 数据库空间统计sql
43 0
|
3月前
|
SQL 数据库 数据安全/隐私保护
CTFHUB 2021-第五空间 yet_another_mysql_injection
CTFHUB 2021-第五空间 yet_another_mysql_injection
29 0
|
5月前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用问题之 MySQL数据库中,执行delete命令删除数据后,存储空间通常不会立即释放,该如何优化
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
115 2
|
5月前
|
运维 关系型数据库 MySQL
PolarDB产品使用问题之迁移到从polardb mysql的数据空间里是否需要修改数据源地址
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
6月前
|
自然语言处理 监控 关系型数据库
mysql造数据占用临时表空间
【5月更文挑战第20天】MySQL在处理复杂查询时可能使用临时表,可能导致性能下降。临时表用于排序、分组和连接操作。常见问题包括内存限制、未优化的查询、数据类型不当和临时表清理。避免过度占用的策略包括优化查询、调整系统参数、优化数据类型和事务管理。使用并行查询、分区表和监控工具也能帮助管理临时表空间。通过智能问答工具如通义灵码,可实时续写SQL和获取优化建议。注意监控`Created_tmp_tables`和`Created_tmp_disk_tables`以了解临时表使用状况。
396 5
|
6月前
|
存储 关系型数据库 MySQL
9.3 【MySQL】系统表空间
9.3 【MySQL】系统表空间
73 0
|
存储 NoSQL 关系型数据库
深入探索地理空间查询:如何优雅地在MySQL、PostgreSQL及Redis中实现精准的地理数据存储与检索技巧
深入探索地理空间查询:如何优雅地在MySQL、PostgreSQL及Redis中实现精准的地理数据存储与检索技巧
2037 0
下一篇
无影云桌面