如何将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
相关产品推荐
相关产品推荐

