我有一张很大的 InnoDB 表,我想通过添加一个小列来修改它。我准备等一段时间,但我想知道该ALTER TABLE
命令运行时会占用多少磁盘空间?我的磁盘上是否需要足够的空间来存放两份完整的表副本?
答案1
是的。您需要足够的空间来存放表的两个副本。MySQL 通过创建新表、从旧表复制数据,然后删除旧表来执行表的更改。
答案2
我知道它已经过时了,但我认为接受的答案是不完整的。
MySQL 在许多ALTER TABLE
操作中都会创建表的临时副本。但它会在临时文件夹中创建该副本:
临时排序文件的空间
重建表的在线 DDL 操作在索引创建期间将临时排序文件写入 MySQL 临时目录 ($TMPDIR 在 Unix 上,%TEMP% 在 Windows 上,或 --tmpdir 指定的目录)。临时排序文件不会在包含原始表的目录中创建。每个临时排序文件都足够大,可以容纳一列数据,并且每个排序文件在其数据合并到最终表或索引中时都会被删除。涉及临时排序文件的操作可能需要的临时空间等于表中的数据量加上索引。如果在线 DDL 操作使用了数据目录所在文件系统上的所有可用磁盘空间,则会报告错误。
如果 MySQL 临时目录不足以容纳排序文件,请将 tmpdir 设置为其他目录。或者,使用 innodb_tmpdir 为在线 DDL 操作定义一个单独的临时目录。引入此选项是为了帮助避免由于临时排序文件过大而导致的临时目录溢出。
引自MySQL 8.0 参考手册但我相信这种行为相当古老,并且适用于迄今为止所有相关的 MySQL 版本(目前是 5.6、5.7 和 8.0)