MySQL .ibd 文件太大

Nik*_*aya 10 mysql innodb

我在 linux 中遇到内存问题。当我使用 df -hi 检查内存分配时,找到了一个路径 /dev/sda1 并且它被 100% 使用。当我挖掘更多时,我发现 /var/lib/mysql 文件几乎占用了所有内存。最后我遇到了一张扩展名为 .ibd 的表,几乎有 20GB。当我点击 sudo du -a | 排序-nr | 头命令,我终于找到了实际的表。它是这样的:

20937708        ./var/lib/mysql/databasename/tablename.ibd
Run Code Online (Sandbox Code Playgroud)

我不知道发生了什么。请帮帮我。由于存储问题,我的服务器几乎停止了。

rog*_*ack 6

看来*.ibd文件(如 file ibdata1)默认情况下永远不会缩小,它们只能增长。如果您有,它们就会被创建

innodb_file_per_table

配置集(这是 ubuntu 上的默认设置)。如果未设置,那么您将从文件中看到相同的行为ibdata,基本上所有表都汇总为一个。显然,如果您有“全部汇总为一个”选项,那么除了转储所有表并从磁盘重新加载它们之外,没有简单的解决方法。但你不这样做,所以你在那里很好。

对于 .ibd 文件,如果您想回收它们,显然有一个选项 optimize table tablename可以基本上锁定表并重写它,并回收所有磁盘空间。

提到的另一个命令(我认为与optimizeis做同样的事情ALTER TABLE ... ENGINE=InnoDB;

另请参阅此处

有点相关的是,即使打开了 innodb_file_per_table,idbdata1 文件也会增长“一点”(并且永远不会缩小),因为它仍然包含“迄今为止最大的事务”的回滚。去搞清楚。


小智 6

这是mysql的痛点之一。我们的服务器只有100G空间,mysql现在占据了近80%。

我们能够通过清除旧记录然后优化表来解决这个问题

optimize table <db.tablename>
Run Code Online (Sandbox Code Playgroud)

如果mysql无法优化它,它会自动为你分析并重新创建它。

请注意,在此命令执行期间表将被锁定,这可能是一个漫长的过程。


Rol*_*DBA 3

您要做的第一件事是从两个角度确定桌子的大小

  • 操作系统
  • 信息架构

请运行以下命令

MYSQL_USER=root
MYSQL_PASS=rootpass
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
DB=databasename
TB=tablename
SQL="SELECT data_length+index_length FROM information_schema.tables"
SQL="${SQL} WHERE table_schema='${DB}' AND table_name='${TB}'"
TBLSIZE_OPER=`ls -l /var/lib/mysql/${DB}/${TB}.ibd` 
TBLSIZE_INFO=`mysql ${MYSQL_CONN} -ANe"${SQL}"`
(( TBLSIZE_FRAG = TBLSIZE_OPER - TBLSIZE_INFO ))
(( TBLSIZE_FRAG_GB = TBLSIZE_FRAG / 1073741824 ))
echo ${TBLSIZE_FRAG} ${TBLSIZE_FRAG_GB}
Run Code Online (Sandbox Code Playgroud)

这将告诉您有多少字节和千兆字节的浪费空间

如果您觉得这是很多碎片,那么只需运行以下命令

USE databasename
ALTER TABLE tablename ENGINE=InnoDB;
Run Code Online (Sandbox Code Playgroud)

这将创建一个没有碎片的临时表,然后重命名该临时表。

我大约一年前写过这个:How to Monitor mysql百分比磁盘利用率?


归档时间:

查看次数:

19135 次

最近记录:

5 年,1 月 前