B.4.6.1 ALTER TABLE 的问题
如果使用ALTER TABLE更改字符集或字符列的排序规则时出现重复键错误,则原因可能是新列的排序规则将两个键 Map 到相同的值,或者 table 已损坏。在后一种情况下,您应该在 table 上运行REPAIR TABLE。 REPAIR TABLE适用于MyISAM
,ARCHIVE
和CSV
table。
如果ALTER TABLE因以下错误而死亡,则问题可能是 MySQL 在较早的ALTER TABLE操作期间崩溃了,并且周围有一个名为A-xxx
或B-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。