即使设置了 innodb_file_per_table,Innodb ibdata1 文件如何增长 5 倍?

Dan*_*Dan 7 mysql innodb ibdata

我设置了 innodb_file_per_table 并且就在今天,在我对 800M 表进行了几次更改以将其减少到大约 600M 之后,我的 ibdata1 文件从 59M 跳到了 323M。该特定表的 .ibd 文件减少了,但服务器的 ibdata1 文件变得疯狂。有任何想法吗?

Rol*_*DBA 4

您可能会觉得这很奇怪,但是您知道 ibdata1 有几个移动部件吗?即使启用了innodb_file_per_table,这里的信息类也存储在 ibdata1 中

  • 数据字典
  • Double Write Buffer(支持数据一致性;用于Crash Recovery)
  • 插入缓冲区(缓冲区对辅助非唯一索引的更改)
  • 回滚段
  • 撤消空间(最不受控制的增长可能发生的地方)

InnoDB架构图解

InnoDB架构

什么可以让ibdata1突然增长?

根据mysqlperformanceblog.com 的Reasons for run-away main Innodb Tablespace

  • 许多交易变化
  • 超长交易
  • 滞后清除线程

只要您的 InnoDB 数据集总量相对较小并且您想缩小 ibdata1,您可以执行以下操作:

步骤 01:安排停机时间

步骤02:mysqldump所有数据库到/root/MySQLData.sql

mysqldump -uroot -p --all-databases --routines --triggers > /root/MySQLData.sql
Run Code Online (Sandbox Code Playgroud)

步骤 03:运行SET GLOBAL innodb_fast_shutdown = 0;

mysql步骤 04:删除除和information_schema数据库之外的所有数据库

步骤05:service mysql stop

步骤06:rm -f /var/lib/mysql/ib*

步骤 07:(service mysql start重新创建 ibdata1、ib_logfile0、ib_logfile1)

步骤08:登录mysql

步骤 09:在 mysql 提示符下,运行mysql> source /root/MySQLData.sql

就是这样。我已经做过很多很多次了:Howto:清理 mysql InnoDB 存储引擎?

从这里开始,您只需要忍受交易带来的奇怪增长。

试一试 !!!