2012-11-06 43 views
2

我有一個其中包含InnoDB表的數據庫,其中一個InnoDB表被標記爲損壞(並且我知道數據丟失等)。但是,當我重新啓動MySQL時,它不會崩潰。Innodb表在執行mysqlcheck時已損壞,但mysql服務器現在或重新啓動時不會崩潰

我預計它會崩潰,但事實並非如此。 (我之前讀過,如果innodb表損壞,MySQL服務器將被停止)

它應該不會崩潰嗎?

innodb是我的默認數據庫引擎。

+0

你有什麼具體問題? 「這個可以嗎?」 「如何讓表在mysqlcheck中不會像腐敗一樣返回?」或者是其他東西? –

+0

我希望它崩潰,我的問題是爲什麼MySQL服務器不崩潰,而innodb表被標記爲損壞? – Serenade

回答

2

損壞的表不一定會導致崩潰。你應該修復表,如果可能的話,從備份重新加載表。在腐敗的桌子上操作最好是片狀的,無論如何,它是通過而不是給你正確的結果,因爲你已經發現了。

不要相信系統不「爆炸」的事實 - 數據庫有幾個中間狀態。你現在所在的那個人很可能是「我還沒有爆炸,我正在等待腐敗蔓延並污染其他表格的數據」。如果您知道表格已損壞,請立即行動

關於修復InnoDB表格,請參閱How do I repair an InnoDB table?

要驗證InnoDB表是否損壞,請參閱https://dba.stackexchange.com/questions/6191/how-do-you-identify-innodb-table-corruption

偵查腐敗

要做到這一點,你需要一個驗收測試將檢查一組數據,並給它一個健康清潔法案 - 與否。將表導出到SQL並查看是否有可能,和/或對元組cardinality和/或關係進行檢查,以及...你會得到我的漂移。 在沒有人需要寫入的表上,以便任何修改都等於損壞,磁盤文件的MD5可能會更快。

爲了提高效率(例如在生產系統中),您可以考慮文件快照或數據庫複製甚至高可用性。這些方法將檢測到程序性損壞(例如一個惡意UPDATE),但可能無法檢測到主機上的某些硬件損壞(給出一個錯誤的否定結論:從機上的檢查泛出,和數據仍然損壞主人),或者可能在從服務器中出現故障(由於主服務器上的數據實際上沒有被識別,所以失敗併產生誤報)。

監測系統重要統計數據非常重要(也是有效的),既可以捕捉即將發生的故障的第一個症狀(例如使用SMART)併爲法醫調查提供數據(「每當數據庫出故障時總是在系統負載突然高峯後不久 - 如果我們發現導致那麼?「)。

當然要依靠完整和充足的備份(並且時不時地運行一次測試恢復。在那裏,完成了這一步,把我的屁股交給了我)。

腐敗的原因[不相關的原題]

腐敗源與軟件的設置而異。一般來說,東西必須闖入server memory representation-writer process-OS handle-journaling-IOSS-OS cache-disk-disk cache-internal file layout鏈,並造成嚴重破壞。

不正確的系統關閉可能會在多個層面混亂,導致數據無法在管道的任何階段被寫入。

用最後一個階段(使用自己的管道,其中服務器什麼都不知道)來處理磁盤上的文件。

其他更esotheric可能性存在:

  • 微妙的硬盤本身的固件/硬件故障,
    • 意外,可能無法恢復時,由於盤的磨損或有缺陷的固件,甚至有缺陷固件更新(我似乎記得幾年前,一個日立的聲學管理更新可以針對稍微不同的模型運行。更新後,磁盤「認爲」​​它具有比實際更多的緩存,並寫入不存在的區域的緩存當然直接去了點天堂)。
    • 「有意」且可能可恢復:有時可能使用hdparm將您的硬盤拉得太細。如果每個組件都適合該性能水平並且知道它或至少能夠發出信號(如果它不是),那麼將磁盤設置爲最高性能是非常好的。有時你所得到的所有「警告」都是系統故障。
  • 進程空間或IOSS腐敗:看到這個在Apache安裝在那裏莫名其妙,大概得益於CGI,這是SUID根,access.log文件與應該GIF圖像的流填去用戶瀏覽器。固定和沒有發生,如果它是一個更重要的文件,而不是日誌...?此類問題可能難以診斷,您可能需要檢查所有日誌文件,以查看某些應用程序是否注意到或發生了任何不適。
  • 硬盤部門搬遷:可能會發生,從未見過它,但現代硬盤有「備用」部門,他們將交換有缺陷的部門以保持體育「零缺陷」的表面。除了如果有缺陷的扇區發生不再可讀並且交換爲空的那個,淨效應與該扇區突然被歸零相同。這可以使用SMART報告輕鬆檢查(hddhealthsmartctl)。

當然,還有更多其他的可能性取決於設置。谷歌搜索文件損壞發現一個萬頁;有用的術語添加到查詢文件系統(ext4,NTFS,brtfs,...),硬盤製造商和型號,操作系統,軟件遭遇問題,其他軟件安裝。

+0

我需要知道的是,是否有任何其他機制發現這種腐敗?如果我在生產中有一個數據庫,並且我想監視它以儘早檢測到腐敗,我應該怎麼做?(因爲根據我的經驗,儘管表損壞了,mysql服務器運行正常) 如果我有一個守護進程運行來監視數據庫的健康狀況,它應該生成什麼命令? mysqlcheck鎖定表,所以看起來不像生產模式中最高效的那樣,對嗎? – Serenade

+1

如果在讀取的頁面中發生損壞,服務器將停止。如果它發生在別處,這是一個問題,因爲檢測問題的最快最可靠的方法是通過讀取數據來觸發它。我認爲你的問題在於表格在崩潰後已經恢復,但是丟失了一些數據,並且完整性被打了。如果經常發生,請仔細檢查您的硬件。如果你有一張「不穩定」的表,把它轉儲到一個.SQL文件中,儘可能檢查並刪除並重新導入。但是,如果你手頭有備份,不要猶豫,使用它。 – LSerni

+0

@iserni,如果你不觸摸內部的mysql文件,我也不會有電源關閉,無論如何,腐敗如何發生? – Pacerier

相關問題