【发布时间】:2012-01-07 00:12:19
【问题描述】:
当向 MyISAM 表添加列时,MySQL 将 Create>Copy>Drop>Rename。我有一个足够大的表,它不能在服务器的剩余可用空间中复制。尝试添加列会导致磁盘填充。时间在这里不是问题,表可用性也不是问题,只是磁盘空间。
除了将数据复制到另一台服务器、截断、更改和复制回来之外,有没有办法将列添加到 MyISAM 表中它会创建一个临时表并复制所有数据?
【问题讨论】:
标签: mysql
当向 MyISAM 表添加列时,MySQL 将 Create>Copy>Drop>Rename。我有一个足够大的表,它不能在服务器的剩余可用空间中复制。尝试添加列会导致磁盘填充。时间在这里不是问题,表可用性也不是问题,只是磁盘空间。
除了将数据复制到另一台服务器、截断、更改和复制回来之外,有没有办法将列添加到 MyISAM 表中它会创建一个临时表并复制所有数据?
【问题讨论】:
标签: mysql
您可以创建一个新的空表,手动将数据分块移动(插入新表,从旧表删除一定数量的行),删除旧表并重命名新表。本质上是 MySQL 所做的,但移动数据而不是复制数据,这应该可以让您使用更少的空间。
【讨论】:
一般来说,我会尽量保留足够的可用空间来重建我最大的表。这允许我在必要时运行OPTIMIZE TABLE 或ALTER TABLE。
您的服务器上是否安装了另一个磁盘?
当空间太紧而无法重建给定表时,我首选的解决方法是将一些其他表临时移动到单独的磁盘卷。为此,我停止 MySQL,移动相关数据文件(MYD 和 MYI,或 ibd),然后在指向新位置的原始位置创建符号链接,然后启动 MySQL。表重建完成后,我会反转该过程以将其他表移回其原始位置。
【讨论】: