You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将MyISAM表转换为InnoDB?解决转换时的1005错误问题

解决MyISAM转InnoDB时Error 1005 (errno:140)的办法

1. 先查原表的创建语句,找不兼容项

先导出原表的建表语句,排查有没有InnoDB不支持的设置:

SHOW CREATE TABLE `file_exist`;

重点关注这些点:

  • MyISAM专属选项:比如DELAY_KEY_WRITE=1、PACK_KEYS=1,或者指定了DATA DIRECTORY/INDEX DIRECTORY(如果未开启InnoDB独立表空间,或是权限不足)
  • 字符集/排序规则:部分旧字符集InnoDB支持有限,比如latin1_german2_ci,可换成utf8mb4或utf8
  • 全文索引:MySQL 5.6及之前版本的InnoDB不支持全文索引,原表有这类索引需先删除
  • 分区设置:MyISAM支持的部分分区类型InnoDB不兼容,比如某些KEY分区的写法

2. 移除不兼容项后重新转换引擎

根据排查结果修改表结构,再执行转换操作:
比如原表带有DELAY_KEY_WRITE选项,先移除:

ALTER TABLE `file_exist`
DELAY_KEY_WRITE = 0; -- 清除MyISAM专属选项
-- 如果存在不支持的全文索引,添加:DROP INDEX `你的全文索引名`;

之后再执行引擎转换:

ALTER TABLE `file_exist` ENGINE = INNODB;

3. 直接转换失败则尝试重建表

若上述方法无效,可备份数据后重建InnoDB表:

  • 导出数据备份:
SELECT * INTO OUTFILE '/tmp/file_exist_backup.csv' 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM `file_exist`;
  • 删除原表(务必确认备份完成):
DROP TABLE `file_exist`;
  • 新建InnoDB表,复制原表结构并移除MyISAM专属选项:
CREATE TABLE `file_exist` (
  -- 粘贴原表字段定义,示例:
  `id` INT NOT NULL AUTO_INCREMENT,
  `filename` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • 导入备份数据:
LOAD DATA INFILE '/tmp/file_exist_backup.csv'
INTO TABLE `file_exist`
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';

4. 检查MySQL配置与权限

  • 确认innodb_file_per_table是否开启(若原表使用了DATA DIRECTORY):
SHOW VARIABLES LIKE 'innodb_file_per_table';
  • 检查MySQL进程对数据目录是否有读写权限,权限不足也会导致建表失败

内容的提问来源于stack exchange,提问作者theking2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:15:11