快速删除巨型mysql列

xxslljrj  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(537)

今天,当我们的rds mysql数据库示例空间不足时,我们遇到了一点站点紧急情况。这是因为我试图在一个有3000万行的数据库表中填充一个新添加的mediumtext列。哎呀。
我认为,有一件事使问题更加复杂,那就是当我意识到是什么导致它耗尽了空间,杀死了它 update 在这个过程中,我试图删除新的专栏,愚蠢地认为这样可以腾出一些空间。
这实际上是注定行不通的,因为当你在mysql中删除一个列时,你不会得到磁盘空间,至少不做一些额外的整理是不行的。
但是,我认为通过增加数据库中临时文件的大小(可能是保存列数据的临时文件)实际上会让事情变得更糟,从而使流程可事务化—就像一个废纸篓一样,有效地为删除的数据提供可恢复性。
这使得它的空间更加耗尽(我通过aws控制台给了它更多的空间)。
所以,这不是一个美好的早晨(早上7点我的孩子也在我耳边尖叫)。
有没有一种方法可以去掉一个列,它是a)快速的,即使是对于大型表b)不会生成任何额外的临时数据c)实际上会给您一些磁盘空间?

lxkprmvk

lxkprmvk1#

在不临时占用更多空间的情况下减少存储使用量的唯一方法是删除表或截断表,即使这样也只能在您有选择的情况下减少空间 innodb_file_per_table=ON (从MySQL5.6开始,默认情况下是开启的)。
许多类型的alter table操作都会生成表的临时副本,从而创建一个新的表空间。参考https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html 注意每一种类型的alter table都用“rebuilds table:yes”标记
重建表意味着创建一个新表,将旧表中的所有数据复制到新表中,同时适应新表中列的更改,然后用新表替换旧表,最后删除旧表。对于大表来说,这需要时间,并且临时需要同时存储表和新表。
基本上,任何更改行大小的更改(如添加/删除列、更改列的数据类型,甚至更改列的可空性)都会重建表。如果不临时占用更多空间,就无法快速删除列。
其他一些类型的alter table(如删除辅助键)释放表空间中的数据库页,而不重建表。但这些页仍然由表空间保存,并由后续数据或索引回收。
表空间永远不会缩小。它只能被删除,或者在复制到新表空间时进行碎片整理。
因此,这取决于您是否有足够的可用磁盘空间来存储最大表的第二个副本(如果二进制日志存储在同一个卷上,则加上二进制日志,但我不知道rds是否在同一个卷上存储binlog)。

相关问题