1. 程式人生 > >Mysql數據庫的使用總結之ERROR 1146 (42S02)

Mysql數據庫的使用總結之ERROR 1146 (42S02)

命令 是否 存儲 不用 有一個 替換 服務 tables mysql

轉自:http://jazka.blog.51cto.com/809003/330418/ 在使用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服務停止(這個就不用說了吧,我的前兩篇博文中有,你可以參考),然後在拷貝data文件夾,替換到你的相應目錄下。這樣,你再按照我的博文http://jazka.blog.51cto.com/809003/329423中介紹的方法對數據庫進行操作就可以了。 網上查找解決辦法時,發現也有不少人有這個問題,而按照停止服務再拷貝的方式還是不行(我剛開始也不行,不過後來就好了,怪了,不知道為什麽)。所以這裏再說一種方法。首先在自己的mysql下,建立一個你即將要拷貝的數據庫(數據庫名要一樣,裏面不需要建表),然後將所有的.frm文件拷貝到你建的數據庫文件夾下,此時再次進入mysql,用show tables查看表是否已經建立起來了。然後停止你自己的mysql服務,發現在data文件下面已經有ib_logfile0、ib_logfile1和ibdata1三個文件了(免安裝版解壓後是沒有的),之後停掉別人的mysql服務,只將ibdata1文件拷貝過來進行覆蓋,最後啟動你自己的mysql服務就可以對數據庫進行正常操作了。

Mysql數據庫的使用總結之ERROR 1146 (42S02)