B.4.6.1 ALTER TABLE 的问题

如果使用ALTER TABLE更改字符集或字符列的排序规则时出现重复键错误,则原因可能是新列的排序规则将两个键 Map 到相同的值,或者 table 已损坏。在后一种情况下,您应该在 table 上运行REPAIR TABLEREPAIR TABLE适用于MyISAMARCHIVECSVtable。

如果ALTER TABLE因以下错误而死亡,则问题可能是 MySQL 在较早的ALTER TABLE操作期间崩溃了,并且周围有一个名为A-xxxB-xxx的旧 table:

Error on rename of './database/name.frm'
to './database/B-xxx.frm' (Errcode: 17)

在这种情况下,转到 MySQL 数据目录并删除名称以A-B-开头的所有文件。 (您可能希望将它们移到其他位置,而不是删除它们.)

ALTER TABLE以以下方式工作:

  • 使用所请求的结构更改创建一个名为A-xxx的新 table。

  • 将所有行从原始 table 复制到A-xxx

  • 将原始 table 重命名为B-xxx

  • A-xxx重命名为原始 table 名。

  • 删除B-xxx

如果重命名操作出了问题,MySQL 会尝试撤消更改。如果出现严重错误(尽管这应该不会发生),MySQL 可能会将旧 table 保留为B-xxx。在系统级别对 table 文件进行简单的重命名应该可以恢复您的数据。

如果您在事务 table 上使用ALTER TABLE或使用 Windows,则对 tableLOCK TABLE进行解锁后,ALTER TABLE会解锁该 table。这样做是因为InnoDB和这些 os 无法删除正在使用的 table。