在使用
mysql
數據庫過程當中,遇到了錯誤
ERROR 1146 (42S02)
:
Table doesn’t exist
,通過了兩天,終於解決了這個問題。引發該錯誤的緣由不一樣,對應的解決方法也不一樣。這裏只針對個人狀況進行一下說明。可能寫的比較亂,但願你慢慢看,下面是我整個從犯錯誤到解決問題的整個過程,有助於你更好的瞭解相關知識。
先說一下發生該錯誤的情形。我是將別人的數據庫目錄下的
data
文件夾直接複製過來的,裏面有三個數據庫
mysql
、
test
和
backupctrl
,主要想要
backupctrl
數據庫,記住不是備份,是拷貝,並且
backupctrl
是使用
innodb
做爲存儲引擎的,這兩方面綜合起來就致使了
1146
這個錯誤。
由於要使用
innodb
作存儲引擎,因此要對
my.ini
文件進行相應的修改。在
my.ini
文件中,你能夠找到關於
innodb
的相關設置,可是被註釋掉了。由於
mysql5.1
版本後,
innodb
不在做爲默認的設置了。首先將
skip-innodb
註釋掉,而後須要設置正確
innodb
的相關參數。
採用
innodb
存儲引擎,關係到
data
文件夾下面的一些文件:
ib_logfile0
、
ib_logfile1
和
ibdata1
,另外還有一個就是數據庫名下面的衆多
.frm
文件。先對這幾個文件做簡要介紹。
ib_logfile0
和
ib_logfile1
是關於數據庫的一些日誌文件;
.frm
文件是數據庫中不少的表的結構描述文件;
ibdata1
文件時數據庫的真實數據存放文件。
在將別人的
data
文件夾整個複製過來後,你到
mysql
目錄下的
bin
文件夾下運行命令:
mysql --console
此時,你會發現不少的錯誤提示,該命令就是對環境進行測試的。若是你不理會這些錯誤,進入數據庫,用
show tables
;命令發現數據庫表存在,可是執行
select
等操做就會出現
1146
:
Table doesn’t exist
這個錯誤了。
其實這是由
ibdata1
文件的錯誤引發的,這個應該在日誌文件
ib_logfile0
和
ib_logfile1
中找到(這個本人沒有驗證),因而把
ibdata1
文件刪除掉,再次執行該命令,發現沒有提示錯誤了,但進入數據庫之後,操做仍就致使
1146
這個錯誤。後來仔細一下,也是,你說你把
ibdata1
文件刪除,至關於把數據庫的真實數據刪除了,這時你就會問爲何數據庫表還存在呢,都能看到(其實我當初就是這麼想的),由於數據庫表結構的描述是在
.frm
的衆多文件中的,因此能經過
show tables
;查看到。
那麼下一個問題就出來了:
ibdata1
文件是從別人那裏拷貝過來的,爲何在那邊能用,到我這邊就不能用了呢?這就是最核心的問題所在,由於
mysql
是採用緩衝方式來說數據寫入到
ibdata1
文件中的,這正是
fflush()
函數存在的理由。所以當別人的
mysql
在運行時,你對
data
文件夾進行拷貝,即對
ibdata1
進行拷貝確定會致使該文件中的數據出錯的(具體錯誤緣由沒有深刻學習)。
網上查找解決辦法時,發現也有很多人有這個問題,而按照中止服務再拷貝的方式仍是不行(我剛開始也不行,不事後來就行了,怪了,不知道爲何)。因此這裏再說一種方法。首先在本身的
mysql
下,創建一個你即將要拷貝的數據庫(數據庫名要同樣,裏面不須要建表),而後將全部的
.frm
文件拷貝到你建的數據庫文件夾下,此時再次進入
mysql
,用
show tables
查看錶是否已經創建起來了。而後中止你本身的
mysql
服務,發如今
data
文件下面已經有
ib_logfile0
、
ib_logfile1
和
ibdata1
三個文件了(免安裝版解壓後是沒有的),以後停掉別人的
mysql
服務,只將
ibdata1
文件拷貝過來進行覆蓋,最後啓動你本身的
mysql
服務就能夠對數據庫進行正常操做了。