2009-06-13 224 views
1

有時我得到一個錯誤,如「表被標記爲損壞並被修復」。該數據庫(表)正在使用MyISAM。最近一直在發生。可能是什麼原因?最近我正在執行批量插入MyISAM表損壞

INSERT INTO table (..., ..., ...) VALUES (...), (...), (...) ...

,它只是掛起。或花了很長時間來完成它似乎掛在我身上。第二天,當我檢查表被標記爲腐敗再次。當我嘗試使用mysqlcheck -r它說所有表確定當它達到那個「腐敗」的表,它再次掛在那裏...

所以,我能做些什麼來防止這種情況。可能的原因是什麼。數據庫託管第三方,我該如何調試?

是InnoDB更可靠的使用引擎嗎?我聽說MyISAM速度更快,但也有人說InnoDB速度可以很快,但它需要更多的優化。我可以得出結論,InnoDB是更可靠的東西,但總體來說比較慢,甚至優化?

回答

0

好的,所以問題是公司的db超過了託管公司所允許的存儲空間。所以顯然沒有人告訴公司他們超出了使用...糟糕的主機,我猜。

順便說一句,沒有辦法mysql可以知道這種情況嗎?

3

如果你的表得到腐敗,你可以使用REPAIR TABLE命令進行修復:

REPAIR TABLE table; 

如果你運行myisamchk,而服務器仍在運行(和插入/選擇被擊中表),它可能是腐蝕你的桌子的原因。我遇到的大多數腐敗問題都是在服務器外部執行任務(複製文件等)的同時仍在運行。

InnoDB對於只讀數據庫比較慢,因爲它具有MyISAM遺漏的功能(兼容ACID,行級別鎖定)。但是,如果您正在進行讀取和寫入的混合操作(取決於混合),InnoDB可以提供顯着的性能改進,因爲它不必鎖定整個表來進行寫入操作。你也不會遇到腐敗問題。

+0

現在,當我嘗試執行像select,check table或mysqlcheck -r這樣的查詢時,甚至會顯示create table,它只會掛在那裏。我能做什麼? – iceangel89 2009-06-14 02:22:41

+0

你有修理嗎?它仍在運行(你可以做「顯示進程列表」)。很可能你不能訪問表或它的元數據,直到它完成(它有一個寫鎖定)。修復可能需要一段時間才能完成,因此必須重建索引。 – 2009-06-14 04:37:38

1

與InnoDB一起去。