Mysql

MySQL表反复崩潰

  • April 20, 2013

我有 xen 虛擬機(在 PV 模式下穩定的 Debian),我有 Joomla。一天中有好幾次我在我的網站首頁看到這條消息。

jtablesession::Store Failed
DB function failed with error number 144
Table './database@002enet/hfd_session' is marked as crashed and last (automatic?) repair failed SQL=INSERT INTO `hfd_session` 
( `session_id`,`time`,`username`,`gid`,`guest`,`client_id` ) VALUES ( 'iae9qhmfhst464v4d0a6ho6nt3','1330628728','','0','1','0' )

我找不到它崩潰的原因。

mysql.log 和 mysql.err 日誌一目了然。mysql慢日誌裡只有一些記錄,但是好像和這張表沒有關聯。只有這張桌子在崩潰。

我嘗試刪除此表並再次創建它,重新啟動系統並使用 fsck 檢查磁碟(沒有錯誤)。但是我還是遇到了這個崩潰,而且每次看到都需要手動修復。

有沒有辦法解決這個問題?

$ dpkg -l | grep mysql
ii  libdbd-mysql-perl                       4.016-1                         Perl5 database interface to the MySQL database
ii  libmysqlclient16                        5.1.49-3                        MySQL database client library
ii  mysql-client-5.1                        5.1.49-3                        MySQL database client binaries
ii  mysql-common                            5.1.49-3                        MySQL database common files, e.g. /etc/mysql/my.cnf
ii  mysql-server                            5.1.49-3                        MySQL database server (metapackage depending on the latest version)
ii  mysql-server-5.1                        5.1.49-3                        MySQL database server binaries and system database setup
ii  mysql-server-core-5.1                   5.1.49-3                        MySQL database server binaries
ii  php5-mysql                              5.3.3-7+squeeze3                MySQL module for php5

我們處理崩潰的mysql表相當多,所以很少有關於嘗試的建議。

首先,嘗試刪除表,重新啟動 mysql,然後重新添加表。這將讓它完全重新創建表並修復任何潛在的結構錯誤。或者,修復表後跟 flush_tables 可以工作,但我們發現它沒有那麼高的成功率。

如果這不起作用,請嘗試將表移動到完全在記憶體中的表。從 InnoDB 或 MyISM 切換到 MEMORY,看看它是否仍然崩潰。請注意,此表不會在重新啟動後維護結果,但由於它是一個會話表,因此不會影響您。這樣做的原因是,當系統/數據庫檢查點發生時,較慢的磁碟會像損壞表一樣進行大型查詢。我還沒有看到這方面的完全相關性,但在每種情況下,更快的伺服器不會在接近我們慢速伺服器的次數的任何地方出錯。鑑於這是一個虛擬機,磁碟速度慢有時可能是一個問題。

最後一件事是啟用完整的 mysql 查詢日誌。這影響性能,所以要小心。這裡的想法是跟踪哪個查詢最後成功,哪個查詢失敗。如果你捕捉到足夠多的失敗,你就會看到一個模式。如果您可以可靠地重現崩潰,那麼您就遇到了 MySQL 錯誤。希望你沒有達到這一點:)

引用自:https://unix.stackexchange.com/questions/33166