前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mysql 磁盘满了?检查是否为碎片导致

Mysql 磁盘满了?检查是否为碎片导致

作者头像
友儿
发布于 2022-09-11 09:29:32
发布于 2022-09-11 09:29:32
2.3K00
代码可运行
举报
文章被收录于专栏:友儿友儿
运行总次数:0
代码可运行
mysql碎片化是什么?

表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大。

当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片。

当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分。

定期清除碎片有什么好处?

降低访问表时的IO,提高mysql性能,释放表空间降低磁盘空间使用率。

怎么解决mysql碎片(data_free字段即为碎片)?

如何查看某个表的data_free?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- 第一种换算成MB查看(针对单一表来说)
      SELECT CONCAT(TRUNCATE(SUM(data_length)/1024/1024,2),'MB') AS data_size,
      CONCAT(TRUNCATE(SUM(max_data_length)/1024/1024,2),'MB') AS max_data_size,
      CONCAT(TRUNCATE(SUM(data_free)/1024/1024,2),'MB') AS data_free,
      CONCAT(TRUNCATE(SUM(index_length)/1024/1024,2),'MB') AS index_size
      FROM information_schema.tables WHERE TABLE_NAME = '表名';
-- 直接字节(k)查看(针对单一表来说)
      SHOW TABLE STATUS LIKE '表名';
-- 查看一个数据库连接所有已经产生碎片的表
      SELECT table_schema db, table_name, data_free, engine     
      FROM information_schema.tables 
      WHERE table_schema NOT IN ('information_schema', 'mysql')  AND data_free > 0;
-- MyISAM表清除表碎片
      OPTIMIZE TABLE 表名
-- InnoDB表清除表碎片
      ALTER TABLE 表名 engine=InnoDB

如果要清楚的碎片表已经删除?怎么清楚其碎片?
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#使用命令查看mysql安装的位置和配置文件所在的地方
[root@wewerrert ~]# ps -ef|grep mysql
root     1510501       1  0 Dec23 ?        00:00:00 /bin/sh /www/server/mysql/bin/mysqld_safe --datadir=/www/server/data --pid-file=/www/server/data/iZ8vbg5lal7crqjflxzizyZ.pid
mysql    1511162 1510501  0 Dec23 ?        00:05:58 /www/server/mysql/bin/mysqld --basedir=/www/server/mysql --datadir=/www/server/data --plugin-dir=/www/server/mysql/lib/plugin --user=mysql --log-error=iZ8vbg5lal7crqjflxzizyZ.err --open-files-limit=65535 --pid-file=/www/server/data/iZ8vbg5lal7crqjflxzizyZ.pid --socket=/tmp/mysql.sock --port=3306
#关闭mysql
  service mysql stop
#删除datadir目录下的ibdata1、ib_logfile0 ib_logfile1这些文件
  rm -rf  ibdata1 ib_logfile0  ib_logfile1
#移动mysql的启动参数
 mv /etc/my.cnf ./abc
#重新启动mysql 发现磁盘空间释放了
 service mysql start
#备份数据库
#还原数据

进行清楚是需要注意些什么?

MySQL官方建议不要经常(每小时或每天)进行碎片整理,一般根据实际情况, 只需要每周或者每月整理一次即可(我们现在是每月凌晨4点清理mysql所有实例下的表碎片)。

在OPTIMIZE TABLE运行过程中,MySQL会锁定表。因此,这个操作一定要 在网站访问量较少的时间段进行。Engine不同,OPTIMIZE 的操作也不一样的,MyISAM 因为索引和数据是分开的,所以 OPTIMIZE 可以整理数据文件,并重排索引。OPTIMIZE 操作会暂时锁住表,而且数据量越大,耗费的时间也越长,它毕竟 不是简单查询操作.所以把 Optimize 命令放在程序中是不妥当的,不管设置的命中率多低,当访问量增大的时候,整体命中率也会上升,这样肯定会对程序的运行效率造成很大影响.比较好的方式就是 做个shell,定期检查mysql中information_schema.TABLES字段,查看 DATA_FREE 字段,大于0话,就表示有碎片。

下面分享一段使用shell脚本定时清楚mysql碎片的方法
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/sh  
mysql_user=root   
mysql_pass=123123  
time_log=/opt/time 
databases=/opt/databases  
/usr/bin/mysql -u$mysql_user -p$mysql_pass -e "show databases" | grep -v "Database" > /opt/databases  
sed -i "s/information_schema//" $databases  
sed -i "s/mysql//" $databases  
sed -i "s/test//" $databases  
databases1=$(cat /opt/databases)  
for i in $databases1  
do  
echo "database $i starting" 
tables=$(/usr/bin/mysql $i -u$mysql_user -p$mysql_pass -e "show tables" | grep -v "Tables" > /opt/$i)  
tablelist=$(cat /opt/$i)  
echo "optimize database $i starting" >> $time_log  
echo "$i start at $(date  +[%Y/%m/%d/%H:%M:%S])" >> $time_log  
for list in $tablelist  
do  
echo $list  
/usr/bin/mysql $i -u$mysql_user -p$mysql_pass -e "optimize table $list" 
done  
echo "$i end   at $(date  +[%Y/%m/%d/%H:%M:%S])" >> $time_log  
echo >> $time_log  
done 
温馨提醒,参考使用前最好先在本地mysql测试一下在用于生产环境
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如果mysql磁盘满了,会发生什么?
网上查了很多资源,说要进行磁盘碎片化整理。原因是datafree占据的空间太多啦。具体可以通过这个sql查看。
良月柒
2020/11/09
1.6K0
如果mysql磁盘满了,会发生什么?
Linux下查看MySQL占用磁盘空间大小
1、进入mysql数据库 2、查看所有库: select TABLE_SCHEMA, concat(truncate(sum(data_length)/1024/1024,2),' MB') as data_size, concat(truncate(sum(index_length)/1024/1024,2),'MB') as index_size from information_schema.tables group by TABLE_SCHEMA order by data_length desc
看、未来
2022/05/06
10.6K0
Mysql空间回收总结
MySQL 5.6中开始支持把undo log分离到独立的表空间,并放到单独的文件目录下;这给我们部署不同IO类型的文件位置带来便利,对于并发写入型负载,我们可以把undo文件部署到单独的高速存储设备上。增加了如下几个参数来控制该行为。
mingjie
2022/05/12
1K0
查看MYSQL表数据大小
在MySQL数据库中,有一个内置的database叫做information_schema, 该数据库中的tables表包含了数据库中所有表的基本信息,tables表结构如下:
后场技术
2020/09/03
5.7K0
MySQL中Myisam、InnoDB碎片优化
起因:查看线上数据库中Table Information时发现有一个日志表数据大小和索引大小有915M,但实际行数只有92行。该表需要频繁插入并且会定时去删掉旧的记录。表类型为Myisam,已建立一个索引,所以应该是产生了大量碎片,使用 Optimize table 表名 优化后大小变为2.19M,少了很多, 同时可以看出该表上的索引建的多余,因为插入操作比查询操作要多很多,而且查询不多,查询的数据量也一般比较小。
用户7657330
2020/08/14
1.3K0
MySQL 案例:表空间碎片
经常使用 MySQL 的话,会发现 MySQL 数据文件的磁盘空间一般会不停的增长,而且有时候删了数据或者插入一批数据的时候,磁盘空间有时候还会毫无变化。引发这个其妙现象的就是 MySQL 的表空间碎片。
王文安@DBA
2021/03/08
5.7K4
MySQL 案例:表空间碎片
MySQL 回收表碎片实践教程
在 MySQL 数据库中,随着数据的增删改操作,表空间可能会出现碎片化,这不仅会占用额外的存储空间,还可能降低表的扫描效率,特别是一些大表,在进行数据清理后会产生大量的碎片。本篇文章我们一起来学习下如何进行碎片回收以及相关注意点。
MySQL技术
2024/10/23
2320
MySQL 回收表碎片实践教程
MySQL 清除表空间碎片
(1)表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白、被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大;
Java后端技术
2018/08/09
4.4K0
MySQL 清除表空间碎片
MySQL8.0​ 字典表增强的意义
MySQL中数据字典是数据库重要的组成部分之一,INFORMATION_SCHEMA首次引入于MySQL 5.0,作为一种从正在运行的MySQL服务器检索元数据的标准兼容方式。用于存储数据元数据、统计信息、以及有关MySQL server的访问信息(例如:数据库名或表名,字段的数据类型和访问权限等)。
MySQL轻松学
2020/06/23
8330
技术分享 | MySQL 表空间碎片整理方法
MySQL 的表在进行了多次 delete 、update 和 insert 后,表空间会出现碎片。定期进行表空间整理,消除碎片可以提高访问表空间的性能。
爱可生开源社区
2021/07/16
1.5K0
MySQL ·查看数据库表详情
在 mysql 中,使用 delete 命令删除数据后,会发现这张表的数据文件和索引文件却奇怪的没有变小。这是因为 delete 操作并不会真的把数据删除,mysql 实际上只是给删除的数据打了个标记,标记为删除,因此你使用 delete 删除表中的数据,表文件在磁盘上所占空间不会变小,我们这里暂且称之为假删除。
数媒派
2022/12/01
15.4K0
MySQL存储文件组成和常见相关问题
查询语句:SELECT table_schema AS "Database", ROUND(SUM(data_length + index_length + data_free) / 1024 / 1024, 2) AS "Size (MB)" FROM information_schema.TABLES GROUP BY table_schema;
andelwu
2019/02/22
1.7K0
MySQL 占用空间一键查询实践
本文介绍如何查询和分析 MySQL 数据库的磁盘空间使用情况,包括使用 SQL 查询命令和工具进行查询和分析的方法。同时,还介绍了如何使用 MySQL 的系统表查询数据库磁盘空间使用情况,并给出了相关示例和查询结果。
莫韵
2017/03/23
4.6K2
MySQL 清除表空间碎片
表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白 当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,就形成了碎片 当MySQL扫描表时,扫描的对象实际是包含碎片空间的 例如 一个表有1万行,每行10字节,会占用10万字节存储空间 执行删除操作,只留一行,实际内容只剩下10字节 但MySQL在读取时,仍看做是10万字节的表进行处理 所以,碎片越多,就会越来越影响查询性能 查看表碎片大小 01 查看某个表的碎片大小 mysql> SH
dys
2018/04/03
3.5K0
MySQL之表碎片简介
对于mysql和Infobright等数据库,information_schema数据库中的表都是只读的,不能进行更新、删除和插入等操作,也不能加触发器,因为它们实际只是一个视图,不是基本表,没有关联的文件。MySQL的information_schema.tables存储了数据表的元数据信息,它详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。这里我们首先看看information_schame中的表tables的各个字段的含义(代码可左滑):
AsiaYe
2019/11/06
1.2K0
计算MySQL表碎片的SQL整理
当然整理的过程不光是知识梳理的过程,也是转化为实践场景的一个过程,通过这样一个体系,对于整个MySQL对象生命周期管理有了较为深入的认识,这里我来抛砖引玉,来作为深入学习MySQL数据字典的一个入口,这个问题就是:如何较为准确的计算MySQL碎片情况?
jeanron100
2019/09/26
3K0
计算MySQL表碎片的SQL整理
MySQL delete 删数据后磁盘空间未释放
在 MySQL 中使用 delete 语句删除数据之后,监控视图中可用的磁盘空间没有增加,磁盘使用率没有下降等等。
DBA实战
2024/09/06
4820
MySQL delete 删数据后磁盘空间未释放
[MYSQL] mysql空间问题案例分享
某环境自上线以来, 空间使用越来越多. 总是扩空间也不是办法啊. 于是只能看能不能从数据库层面来释放一部分空间了.
大大刺猬
2025/02/20
2340
[MYSQL] mysql空间问题案例分享
MySQL常用SQL
DBM
2024/04/26
2010
MySQL常用SQL
【MySQL 系列】冷门 SQL 整理
查看当前链接所有业务数据库 SELECT schema_name AS db_name FROM information_schema.schemata WHERE schema_name NOT IN ( 'information_schema', 'sys', 'mysql', 'performance_schema' ); PS: information_schema 中的数据默认不是实时的数据,如果需要实时的数据,需要执行下面命令: SET GLOBAL information_sch
框架师
2022/09/02
4960
相关推荐
如果mysql磁盘满了,会发生什么?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验