首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速删除巨型MySQL列的方法

快速删除巨型MySQL列的方法
EN

Stack Overflow用户
提问于 2018-08-21 12:05:19
回答 1查看 1.6K关注 0票数 1

当我们在RDS MySQL数据库实例上耗尽空间时,我们今天遇到了一些站点紧急情况。这是因为我试图在一个有3000万行的数据库表中填充一个新添加的MEDIUMTEXT列。糟了。

我认为,使问题复杂化的一件事是,在我意识到是什么让它耗尽了空间,并扼杀了update进程之后,我试图放弃新的专栏,愚蠢地认为这会腾出一些空间。

这实际上是不起作用的,因为当您删除Mysql中的一列时,您将无法获得磁盘空间,至少在不做一些额外的管理工作的情况下是不会的。

但是,我认为它实际上使事情变得更糟了,因为它增加了DB中临时文件的大小,大概是用来保存列数据的,从而使进程具有可事务性--实际上,它就像一个废纸篓,可以使被删除的数据具有可恢复性。

这使得它的空间更多了(我通过AWS控制台给了它更多的空间)。

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

是否有一种方法可以快速摆脱一列,即使对于大型表b)不会产生任何额外的临时数据,而c)实际上给了您一些磁盘空间?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-21 16:28:28

在不占用更多空间的情况下,减少存储空间的唯一方法是删除表或截断表,即使这样也只能在您有选项innodb_file_per_table=ON (默认情况下为MySQL 5.6)的情况下减少空间。

许多类型的ALTER操作都是表的临时副本,这将创建一个新的表空间。请参考https://dev.mysql.com/doc/refman/5.6/en/innodb-create-index-overview.html,并注意到每种类型的ALTER都是用"Rebuilds : Yes“来记录的。

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

基本上,任何更改行的大小,比如添加/删除列,更改列的数据类型,甚至更改列的空值,都会重新构建表。没有办法快速地或不临时地使用更多的空间来删除列。

其他一些类型的ALTER,如删除辅助键,释放表空间中的数据库页,而不重新生成表。但这些页面仍由表空间保存,并由后续数据或索引回收。

桌子的空间永远不会缩小。当它被复制到一个新的表空间时,它只能被删除,或者去碎片。

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51948287

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档