【问题标题】:MySQL ALTER TABLE on tables too large to duplicateMySQL ALTER TABLE 在太大而无法复制的表上
【发布时间】:2012-01-07 00:12:19
【问题描述】:

当向 MyISAM 表添加列时,MySQL 将 Create>Copy>Drop>Rename。我有一个足够大的表,它不能在服务器的剩余可用空间中复制。尝试添加列会导致磁盘填充。时间在这里不是问题,表可用性也不是问题,只是磁盘空间。

除了将数据复制到另一台服务器、截断、更改和复制回来之外,有没有办法将列添加到 MyISAM 表中它会创建一个临时表并复制所有数据?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以创建一个新的空表,手动将数据分块移动(插入新表,从旧表删除一定数量的行),删除旧表并重命名新表。本质上是 MySQL 所做的,但移动数据而不是复制数据,这应该可以让您使用更少的空间。

    【讨论】:

    • 我很害怕这个,但希望能少一些手动的方法。这可能就是我最终要做的事情。
    • 最终,这种方法失败了,尽管我的切片大小仍会填满磁盘。 MySQL 没有从已删除的行中释放磁盘。运行 OPTIMIZE 以告诉 MySQL 释放已填满磁盘的磁盘。
    • 我猜它与 InnoDB 一起工作会更好,因为新表将重用 idb 文件中的空闲页面。恐怕我没有其他想法,抱歉。
    • 谢谢,这似乎是我唯一的选择 :-)
    【解决方案2】:

    一般来说,我会尽量保留足够的可用空间来重建我最大的表。这允许我在必要时运行OPTIMIZE TABLEALTER TABLE

    您的服务器上是否安装了另一个磁盘?

    当空间太紧而无法重建给定表时,我首选的解决方法是将一些其他表临时移动到单独的磁盘卷。为此,我停止 MySQL,移动相关数据文件(MYD 和 MYI,或 ibd),然后在指向新位置的原始位置创建符号链接,然后启动 MySQL。表重建完成后,我会反转该过程以将其他表移回其原始位置。

    【讨论】:

    • 很遗憾,此主机没有附加存储空间。
    • 即使我们安装了单独的磁盘,实际上也不可能在生产服务器上这样做:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    相关资源
    最近更新 更多