【发布时间】:2018-07-29 16:00:39
【问题描述】:
我刚刚观察到一些非常奇怪的事情,希望有人可以向我解释。我在 Linux 虚拟服务器上有一个带有 InnoDB 表的 MySQL 5.5.58 数据库。其中一张表称为stats_archive,在普通用法中是只写的:它永远不会被读取或删除。其内容纯粹出于法律合规目的而保留一段时间,并且每月的 cronjob 应该删除旧条目。不幸的是,cronjob 默默地失败了,结果表被允许变得过大。今天早上我试图删除数据:
master:~# du -sh /var/lib/mysql
6.3G /var/lib/mysql
master:~# mysql -u root -p
mysql> select count(*) from stats_archive;
+-----------+
| count(*) |
+-----------+
| 26339050 |
+-----------+
1 row in set (39.40 sec)
mysql> delete from stats_archive where archive_date < '2018-01-01';
Query OK, 24628026 rows affected (7 min 17.61 sec)
master:~# du -sh /var/lib/mysql
7.4G /var/lib/mysql
如您所见,MySQL 使用的存储空间增长了 1GB 多一点。当我这样做时,没有其他明显的数据库活动。删除不是在未提交的事务中完成的,所以数据库不应该仍然保留它以防我回滚。
/var/lib/mysql/ibdata1 使用了额外的 1GB 空间(不出所料),据我了解,这个文件永远不会缩小,所以I'm stuck with it until I can do something major 喜欢删除我所有的数据库,从备份中恢复并设置innodb_file_per_table=1(它目前不是)。我会在适当的时候这样做。
但我真正想知道的是为什么会发生这种情况,并且每次我从数据库中删除行时都会发生同样的情况吗?
注意:这不是与this question 的重复。这个问题是关于未释放的存储,这在 InnoDB 中是众所周知的,与question I linked to 基本相同。我的问题是删除导致存储使用量增长显着。
【问题讨论】:
-
当您从表中删除行时。行空间将保留以供将来在该表中插入数据。要回收未使用的数据,请尝试优化表 Check here
-
这不是与this question 的副本。这个问题是关于存储没有被释放的,这在 InnoDB 中是众所周知的。事实上,我什至链接到一个类似的问题。我的问题是删除导致存储使用量显着增长。那是完全不同的效果。请你重新打开这个问题,@Shadow。
-
不是效果不同,根本原因是一样的:innodb没有回收删除记录留下的空间。但是明白你的意思,你需要解释为什么会发生这种情况,而不是解决如何控制文件增长。