2017-09-27 80 views
3

有時我們的表中的某些索引被破壞,數據庫開始消耗100%的CPU負載,並在一段時間內完全卡住。即使簡單的查詢也無法完成,重新啓動也無濟於事。InnoDB:破壞和修復索引

我發現的是要麼逐個刪除並重新創建索引(這可能需要很長的時間和很多調查),或者只是在可疑表上調用alter table mytable engine=innodb;。這實際上很好,它修復了一切,一切恢復正常。但我不知道背景中究竟發生了什麼,以及它爲什麼會有所幫助。另外 - 它會幫助每月手動進行一次嗎?自動化這是一個好主意嗎?有沒有辦法做一些數據庫健康檢查?

+0

您是否正在運行最新版本的MySQL?你有沒有試過一個完整的轉儲,從零開始恢復你的數據庫?你能在任何其他機器上重現問題嗎?你可能正在處理有問題的軟件或有缺陷的硬件,例如一大堆內存。 – tadman

+0

是的,這大概發生一年,最後一次發生在不同的機器上。我正在Debian上運行最新的Percona。 –

+0

值得嘗試一下MariaDB和MySQL,看看它是否是問題和/或聯繫Percona支持。 – tadman

回答

0

猜...

你的MySQL/Percona的,一箇舊版本的,不具有「持續性統計」或沒有啓用它要麼。

而且您有一個討厭的查詢,有時會導致優化器選擇錯誤的查詢計劃。

快速修復(可能或可能不起作用)是在緩慢查詢中運行表(s)的ANALYZE TABLE

更好的修復方法可能是升級版本。

同時,讓我們看看查詢,其EXPLAINSHOW CREATE TABLE爲涉及的每個表。這可能是一種將其重新制作成不那麼脆弱的方法。

+0

那麼,我們有Percona版本5.7.16-10,這不應該太老。前一段時間,我們也遇到過完全不同的表/查詢。從'分析表'我從來沒有任何東西比'好'。我想知道當執行「alter table mytable engine = innodb;」時會發生什麼。這總是有幫助,我不知道爲什麼。 –

+0

改變..引擎和'OPTIMIZE'一樣。快速分析一些探測重新計算「統計」,然後說「確定」。我認爲統計數據已經不符合查詢條件。 –

+0

好吧,在所有桌子上每月自動運行一次OPTIMIZE會安全嗎? –