ibdata1导致mysql打不开_ibtmp1和ibdata1文件过大导致MySQL异常的原因和解决办法

本文探讨了MySQL中ibdata1文件过大的原因,如大量并发事务、旧事务未提交、I/O性能差等,并提供了设置初始大小、增加purge线程数等解决方案。同时,也分析了ibtmp1文件的增长问题,建议调整innodb_temp_data_file_path配置并注意innodb_fast_shutdown参数的设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 ibdata1相关

InnoDB中有共享表空间和独立表空间的概念。共享表空间就是ibdata1,独立表空间放在每个表的.ibd(数据和索引)和.frm(表结构)为后缀的文件中。单独的表空间只存储该表的数据,索引和插入缓冲的BITMAP等信息,其余还放在共享表空间中

1、ibdata1文件介绍

ibdata1是一个用来构建innodb系统表空间的文件,这个文件包含了innodb表的元数据、撤销记录、修改buffer和双写buffer。

ibdata1存储了Data dictionary,Double write buffer,Insert buffer,Rollback segments,UNDO space,Forign key constraint system tables等

2、ibdata1暴涨的原因

ibdata1存放数据,索引和缓存等,是MYSQL的最主要的数据。所以随着数据库越来越大,表也会越大,这个无法避免的。如果时间长了,越来越大。

具体原因有下面几个:

有大量并发事务,产生大量的undo log;

有旧事务长时间未提交,产生大量旧undo log;

file i/o性能差,purge进度慢;

初始化设置太小不够用;

32-bit系统下有bug。

3、ibdata1问题背景

当my.cnf选项innodb_file_per_table = 0时,在ibdata1文件中还需要存储InnoDB表数据&索引。ibdata1文件从5.6.7版本开始,默认大小是12MB,而在这之前默认大小是10MB,其相关选项是innodb_data_file_path,默认设置是innodb_data_file_path = ibdata1:1G:autoextend。

当然了,无论是否启用了 innodb_file_per_table = 1,ibdata1文件都必须存在,因为它必须存储上述 InnoDB 引擎所依赖&必须的数据,尤其是上面加粗标识的rollback segments 和undo space,它俩是引起ibdata1文件大小增加的最大原因。

4、解决方法

升级到5.6以上(64-bit),采用独立undo表空间

初始化设置时,把ibdata1文件至少设置为1GB以上

增加purge线程数 innodb_purge_threads

升高file I/O能力,该上SSD的赶紧上

事务及时提交,不要积压

默认打开autocommit=1,避免忘了某个事务长时间未提交

检查开发框架,确认autocommit=0的地方,事务结束后都有提交或回滚

二 ibtmp1相关

ibtmp1是非压缩的innodb临时表的独立表空间,通过innodb_temp_data_file_path参数指定文件的路径,文件名和大小,默认配置为ibtmp1:12M:autoextend,也就是说在支持大文件的系统这个文件大小是可以无限增长的。

针对临时表及相关对象引入新的“non-redo” undo log,存放于临时表空间。该类型的undo log非 redolog 因为临时表不需崩溃恢复、也就无需redo logs,但却需要undo log用于回滚、MVCC等。默认的临时表空间文件为ibtmp1,位于数据目录在每次服务器启动时被重新创建,可通过innodb_temp_data_file_path指定临时表空间。http://dev.mysql.com/doc/refman/5.7/en/innodb-temporary-table-undo-logs.html

解决办法:

1,修改my.cnf配置文件:

innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:5G

2,设置innodb_fast_shutdown参数

SET GLOBAL innodb_fast_shutdown = 0;

在mysql关闭时,参数innodb_fast_shutdown 影响着表的存储引擎为innodb的行为。参数为0,1,2三个值。

0,代表当MYSQL关闭时,Innodb需要完成所有full purge和merge insert buffer操作,这需要花费时间来完成。如果做Innodb plugin升级,通常需要将这个参数调为0,,然后在关闭数据库

1, 是参数的默认值,不需要完成full purge和merge insert buffer操作,但是在缓冲池的一些数据脏页还是会刷新到磁盘。

2 表示 不需要完成full purge和merge insert buffer操作 ,也不将缓冲池中的数据脏页写回磁盘,。而是将日志都写入日志文件。这样不会有任何事物丢失,但是mysql在下次启动时,会执行恢复操作(recovery)

3,关闭mysql服务

4,删除ibtmp1文件

5,启动mysql服务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值