我使用的是MySQL数据库,所有的表都是InnoDB,打开了file_per_table配置。但我仍然看到巨大的ibdata文件(~50 But )。所有表都有.ibd文件。这是我通过转储和加载创建的一台机器。这是什么原因。
发布于 2015-03-22 03:01:33
你可能有很多大的交易或者一个非常大的交易。
看看Vadim对InnoDB的图形表示

如果您查看系统表(ibdata1)内部,就会看到回滚段和撤消日志。
当回滚段回滚事务时,它必须使用它存储在撤消空间中的MVCC信息。这是大部分增长发生的地方。Percona在Jun 10, 2010 (逃出主要Innodb表空间的原因)上提到了这一点。
我以前也讨论过这个
Apr 23, 2013:Innodb ibdata1 1文件如何能以5倍的速度增长?_文件_每_桌子准备好了?Mar 31, 2014:mysql目录在一次查询后增长到246g,该查询由于表已满而失败。Jun 16, 2014:表上的MySQL索引创建失败已满如果您确信数据字典是原因,则只有一种确定的方法可以验证这一点。
--no-data)ls -l /var/lib/mysql/ibdata1 | awk '{print $5}'出来的数字将是ibdata1的大小,只有当前表列表的数据字典条目,但其中没有数据。
在你最后的评论,你说
因此,公开交易似乎不是正确的理由。我们每天创建大约200-300个表(通过我们的ETL工具),并在一些处理之后定期删除它们(每2-3周删除一些2k-5k表),这个属性可以归因于大文件吗?
您可能出于同样的原因是正确的:就像回滚段和撤销空间没有为操作系统回收未使用的磁盘空间一样,删除表和创建新的表同样没有为操作系统回收未使用的磁盘空间的准备。
要证明这一点,您必须使用该新服务器处理所有表,但不包含任何数据。然后,每周执行相同的删除和创建表的操作。如果ibdata1只是为了实现这个目的而增长,那么无可否认地证明,单是删除和创建表就可以在启用innodb_file_per_table的情况下增长ibdata1。
如果你想清理ibdata1,请看我的帖子
Sep 26, 2012:如何在不转储所有数据库的情况下收缩innodb文件ibdata1 1? (关于为什么您必须转储所有数据、删除ibdatat1和创建一个新的ibdata1)Oct 29, 2010:如何清除mysql InnoDB存储引擎? (关于如何实际做到这一点)https://dba.stackexchange.com/questions/95759
复制相似问题