快速删除巨型MySQL专栏的方法

时间:2018-08-21 12:05:20

标签: mysql rds diskspace

今天,当我们的RDS MySQL数据库实例空间不足时,我们有点站点紧急情况。这是由于我试图在具有3000万行的数据库表中填充新添加的MEDIUMTEXT列。糟糕!

使问题复杂化的一件事是,当我意识到导致空间耗尽的原因并杀死了update进程之后,我然后尝试删除新列,愚蠢地认为这会释放一些空间。

这实际上注定是行不通的,因为当您在Mysql中删除一列时,您不会获得磁盘空间,至少是没有做一些额外的整理工作。

但是,我认为通过增加数据库中临时文件的大小实际上使情况变得更糟,大概是保存列数据,使该过程可交易-像废纸waste一样,有效地使数据库具有可恢复性。删除的数据。

然后,它使空间用尽了更多空间(我通过AWS控制台为其提供了更多空间)。

所以,这不是一个美好的早晨(这也是我的孩子早上7点在我耳边尖叫的时候)。

有没有一种方法可以摆脱a)快速的列,即使对于大表也是如此b)不会产生任何额外的临时数据,并且c)实际上为您提供了一些磁盘空间?

1 个答案:

答案 0 :(得分:3)

减少使用存储空间而不临时占用更多空间的唯一方法是DROP TABLE或TRUNCATE TABLE,即使只有选项innodb_file_per_table=ON,这也会减少空间。 (自MySQL 5.6起,默认情况下处于启用状态。)

许多类型的ALTER TABLE操作都会创建表的临时副本,从而创建新的表空间。请参考https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html并注意“重建表:是”中注明的每种ALTER TABLE类型

重建表意味着创建一个新表,将所有数据从旧表复制到新表,同时适应新表中列的更改,然后将新表替换为旧表,最后删除旧表。大表需要花费时间,并且暂时需要同时存储表和新表。

基本上,任何更改行大小的更改(例如添加/删除列,更改列的数据类型,甚至更改列的可空性)都将重建表。无法快速删除列或不临时占用更多空间。

其他一些类型的ALTER TABLE,例如删除辅助键,释放表空间中的数据库页面,而无需重建表。但是这些页面仍保留在表空间中,并由后续数据或索引回收。

表空间永远不会缩小。在复制到新表空间时,只能将其删除或进行碎片整理。

因此,要确保至少有足够的可用磁盘空间来存储最大表的第二个副本(如果二进制日志存储在同一卷上,还要加上二进制日志,但是我不知道RDS是否存储二进制日志)相同的音量)。