關(guān)于創(chuàng)建數(shù)據(jù)表報(bào)錯(cuò)一例(ERROR 1005 Can’t create table (errno: 121))

2014年8月30日04:07:45 發(fā)表評(píng)論 5,661 ℃

問題描述

曾遇到創(chuàng)建數(shù)據(jù)表報(bào)錯(cuò)問題,報(bào)錯(cuò)如下:

ERROR 1005 (HY000) at line 18: Can't create table 'db1.t2' (errno: 121)

通過日志查看有一條記錄

InnoDB: Error: table `db1`.`t2` already exists in InnoDB internal

可見要?jiǎng)?chuàng)建的這個(gè)表已經(jīng)存在,導(dǎo)致創(chuàng)建同名數(shù)據(jù)表報(bào)錯(cuò),但是從數(shù)據(jù)庫目錄上查看確實(shí)沒有這個(gè)表文件。

原因分析

事實(shí)上,導(dǎo)致這種情況是由于刪除數(shù)據(jù)表時(shí)直接刪除了源文件,而沒有通過SQL命令來刪除。這種錯(cuò)誤的方法對(duì)MyISAM引擎的數(shù)據(jù)庫有時(shí)候是管用的,但是對(duì)于InnoDB引擎的數(shù)據(jù)庫則是一定不管用的。

因?yàn)閷?duì)于InnoDB引擎的數(shù)據(jù)庫,當(dāng)創(chuàng)建一個(gè)表時(shí),會(huì)在數(shù)據(jù)庫目錄中創(chuàng)建一個(gè).frm格式(如t2.frm)的表結(jié)構(gòu)文件,同時(shí),內(nèi)部地,InnoDB會(huì)為這個(gè)表向自己的數(shù)據(jù)目錄添加一個(gè)條目。當(dāng)把源文件(t2.frm)直接刪除時(shí),InnoDB內(nèi)部數(shù)據(jù)目錄中并沒有刪除對(duì)應(yīng)的條目。

這時(shí),你運(yùn)行show tables,由于該命令是通過表結(jié)構(gòu)文件檢索的,自然查看不到這個(gè)表。

如果嘗試重新導(dǎo)入數(shù)據(jù),由于.sql文件中的語句寫的是"drop table if exists 't2'",最終也會(huì)因查不到表而不去執(zhí)行drop命令。

處理方法

1. 對(duì)于MyISAM引擎的數(shù)據(jù)庫

如果之前刪的表文件是空表文件,則可以直接create創(chuàng)建(這種情況不會(huì)出現(xiàn)上面的報(bào)錯(cuò);如果之前刪的是有數(shù)據(jù)的表文件,則直接創(chuàng)建是不管用的,需要先執(zhí)行"drop table 表名",然后再重新創(chuàng)建該表即可。

2. 對(duì)于InnoDB引擎的數(shù)據(jù)庫

可以先嘗試執(zhí)行"drop table 表名",然后再重新創(chuàng)建該表;如果仍有問題,則需要?jiǎng)?chuàng)建一個(gè)臨時(shí)數(shù)據(jù)庫,在臨時(shí)數(shù)據(jù)庫中創(chuàng)建一個(gè)同名數(shù)據(jù)表,然后將該表文件(只有一個(gè).frm文件)復(fù)制到當(dāng)前的數(shù)據(jù)庫中,賦予mysql權(quán)限,然后再執(zhí)行"drop table 表名",再重新創(chuàng)建該表即可。

【騰訊云】云服務(wù)器、云數(shù)據(jù)庫、COS、CDN、短信等云產(chǎn)品特惠熱賣中

發(fā)表評(píng)論

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: