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

    在使用 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 服務就能夠對數據庫進行正常操做了。
相關文章
相關標籤/搜索