一次mysql的.ibd文件过大处理过程记录

 更新时间:2022年06月29日 11:20:04   作者:精神病院里病最重的人  
mysql数据库的每个表都有ibd和frm两种格式的文件,ibd文件是表的数据文件,存放表的数据,修改文件后缀,无法在MySQL数据库中查询表数据,这篇文章主要给大家介绍了关于一次mysql的.ibd文件过大处理过程的相关资料,需要的朋友可以参考下

一条zabbix微信的磁盘告警打破了往常的宁静

收到告警之后发现是mysql的datadir目录,按着平时习惯开始排查;过程就不说了,最后发现某个库的目录大小异常,然后进去查看之后发现jdp_tb_trade.ibd过大,达到46G;跟真实数据量不符,就此打算对它下手处理。

那么,我们知道ibd文件是每个数据库里面每个表的数据空间,每个表的数据和索引都会存在自已的表空间中。

这么重要的东西肯定不能直接在线上操作,毕竟之前完全不知道处理这个东西会产生什么影响,那接下来就是测试环境的再现过程了:

测试环境:配置直接cp线上的my.cnf

然后建库建表,插入数据,使该表的ibd文件增大

最后如图:

该文件46G,表里面的数据也有八百多万条,接下来就是再现线上环境的操作了(线上环境增删操作多),先删个10数据,并且用优化命令对该表进行优化(optimize):

但是发现在等待该命令执行结果的过程中,根目录一直在增长:

直到跟目录被占用百分百之后,优化命令报错了:

报错之后跟目录空间瞬间释放了:

这里我当时猜想到是因为临时表的问题,但是不知道怎么改临时表的存储目录,那肯定是不懂就问。

问了DBA 大佬后,说是修改tmpdir参数即可(默认是指向tmp目录):

熟练的vim my.cnf

在[mysqld]下添加:

tmpdir = /ssd_data2/158mysql/107.sla

重启mysql实例

在mysql命令符下查看该参数目录是否生效:

那就再执行一遍优化命令:

成功了,文件也缩小了一个G。

接下来我又进一步测试,删除表里面数据,只保留10万条数据;再执行optimize命令,并且观察目录占用大小情况:

这里值得一提的是:optimize命令执行时间只用了15分钟,通过观察目录的变化发现临时表大小大概在45G左右。

接下来是总结:

1)我原以为做一些小小的改动(只删除了10条数据)会很快得到实验的结果,结果可以在图上面看到optimize命令执行了一个半小时;但是后面我再一次测试发现只用了15分钟,可能是服务器上其他业务影响了,时间上不好下结论。
这个命令会产生锁表的效应,所以时间上需要注意。

2)学习知识点:

1、ibd文件为何物,里面是放什么东西的:
上面也说到,是放表的元数据,索引。

2、optimize这个命令的相关知识,会对数据库造成什么影响等:
已知有:
执行过程中会锁表
会产生临时表,占用一定的空间
会影响主从延迟
(欢迎留言补充)

3、tmpdir这个参数:
临时表指定存放目录
可以跟innodb_tmpdir参数对比学习

4、这里要提一个参数 “innodb_file_per_table=1”
配置文件里最好把这个参数打开,因为生产环境用的是innoDB的引擎,然后innodb会默认将所有库的表数据都存储在一个共享空间中:ibdata1,这样不方便我们平时的优化。
该参数是让每个表都会产生一个独立的ibd文件(也就是数据空间)

3)为什么会产生这样的事情呢?:

个人理解:平时我们删除数据时,会使得表的ibd文件产生空隙:也就是说,删除数据之后它会傻傻的空在哪里,如果没有数据补进来就会一直空着;然后重复这增加,删除一系列操作之后,该文件随着时间的推移变得越来越大。

目前我所知没有特别好的办法避免这一点,不过定时优化就好;

总结

到此这篇关于一次mysql的.ibd文件过大处理过程的文章就介绍到这了,更多相关mysql .ibd文件过大处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mysql存储过程原理与使用方法详解

    mysql存储过程原理与使用方法详解

    这篇文章主要介绍了mysql存储过程原理与使用方法,结合实例形式详细分析了mysql存储过程的优缺点、定义、调用方法及相关操作注意事项,需要的朋友可以参考下
    2019-12-12
  • MySQL查询用户权限的方法总结

    MySQL查询用户权限的方法总结

    这篇文章主要介绍了MySQL查询用户权限的方法总结内容,需要的朋友们可以参考下。
    2020-03-03
  • MySQL regexp 命令详解

    MySQL regexp 命令详解

    REGEXP命令用于在查询中进行正则表达式匹配,支持多种符号和语法,如^、$、.、*、+、?、|、[]等,示例展示了如何匹配特定字符、数字、多个选项等,使用BINARY关键字可以区分大小写,本文介绍MySQL regexp 命令,感兴趣的朋友一起看看吧
    2025-03-03
  • 优化MySQL Join算法的性能的操作方法

    优化MySQL Join算法的性能的操作方法

    本文介绍了优化MySQL JOIN算法性能的多种方法,包括索引优化、表结构设计、查询语句优化和系统配置调整,通过合理创建索引、优化表结构、选择合适的驱动表以及调整相关系统参数,可以有效提高JOIN操作的性能,感兴趣的朋友一起看看吧
    2025-02-02
  • MySQL中主键与rowid的使用陷阱总结

    MySQL中主键与rowid的使用陷阱总结

    这篇文章主要给大家总结介绍了关于MySQL中主键与rowid的使用陷阱,文中通过示例代码介绍的非常详细,对大家的学习或者使用MySQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • MYSQL同步 Slave_IO_Running: No 或者Slave_SQL_Running: No的解决方法[已测]

    MYSQL同步 Slave_IO_Running: No 或者Slave_SQL_Running: No的解决方法[已测

    为了服务器更好的安全特将mysql服务器同步一下,show slave status\G出现了Slave_IO_Running: No 错误,特整理了下,方便以后配置
    2011-06-06
  • 深入了解MySQL中的慢查询

    深入了解MySQL中的慢查询

    什么是MySQL慢查询呢?其实就是查询的SQL语句耗费较长的时间。具体耗费多久算慢查询呢?这其实因人而异,有些公司慢查询的阈值是100ms,有些的阈值可能是500ms。本文将通过示例和大家聊聊慢查询的危害和常用场景,感兴趣的可以了解一下
    2022-10-10
  • 深入理解MySQL中的事务机制

    深入理解MySQL中的事务机制

    这篇文章主要介绍了MySQL中的事务机制,事务机制在各大MySQL教程中均为重要知识,需要的朋友可以参考下
    2015-06-06
  • MySQL的事件调度器使用介绍

    MySQL的事件调度器使用介绍

    这篇文章主要介绍了MySQL的事件调度器使用介绍,本文讲解了事件调度器的开启、创建、修改、删除等操作的使用实例,需要的朋友可以参考下
    2015-06-06
  • MySQL数据库安装方法与图形化管理工具介绍

    MySQL数据库安装方法与图形化管理工具介绍

    这篇文章介绍了MySQL数据库安装方法与图形化管理工具,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05

最新评论