2013-10-23 64 views
0

我正在研究一個腳本,它將是一個cronjob,它將查看數據庫中的表並修復任何需要它的表。他們是MySQL數據庫中的myisam表。我的問題是,是否有任何理由在命令行上使用myisamchk語法與REPAIR TABLE查詢語法?修復MySQL myisam表使用`修復表'vs myisamchk

在一個MyISAM文檔頁面, http://dev.mysql.com/doc/refman/5.0/en/myisamchk.html, 他們提供了這樣的一種方式來修復需要

myisamchk --silent --force --fast --update-state \ 
      --key_buffer_size=64M --sort_buffer_size=64M \ 
      --read_buffer_size=1M --write_buffer_size=1M \ 
      /path/to/datadir/*/*.MYI 

就會有不同的結果比使用

REPAIR TABLE tablename

所有表

在我所有的桌子上?我會用php編程方式做到這一點,並用類似的信息(僞)

$tables=query("SELECT table from information_schema.tables where table_schema='myDBName'"); 
foreach($tables as $table) 
{ 
    $result=query("REPAIR TABLE ".$table); 
} 

儘管做下去的一種方式或其他的實用性任何意見結束,但將實際最終的結果會有所不同?謝謝。

如果需要,我可以提供工作(非僞)php代碼,但我不認爲這是必要的。我使用僞代碼的原因是,在工作中我們使用我們自己的包裝器來訪問數據庫。

回答

2

您不必經常修復表格以至於需要自動化。你可能根本不應該使用MyISAM。但是,如果你堅持,答案大多是從您鏈接到頁面:

注意

最好是執行表修復操作之前,使表的備份;在某些情況下,操作可能會導致數據丟失。可能的原因包括但不限於文件系統錯誤。

......這當然也可能是問題的原因......這聽起來像是另一個反對自動化這個過程的投票。

重要

必須確保,當你運行myisamchk的任何其他程序使用的表。這樣做的最有效方法是在運行myisamchk時關閉MySQL服務器,或者鎖定myisamchk正在使用的所有表。

因此,雖然修復表的兩種方式來自一個共同的代碼基,但似乎應該使用REPAIR TABLE,除非服務器處於脫機狀態。請注意,這個命令也有選項。

http://dev.mysql.com/doc/refman/5.6/en/repair-table.html


更新:我幾乎不想添加這個,因爲它完全是傳聞,但我一直懷疑修復MyISAM表可能並不總是發現,可能是錯用一切可能的事情表,導致你認爲它已被修復,因爲它可以再次使用。對我來說,使用全面延長修復的任何事情似乎都是冒險,而且我會傾向於實際強制整個桌子的完全重建,就像這樣,如果您有問題表:

ALTER TABLE t1 ENGINE=InnoDB; 
ALTER TABLE t1 ENGINE=MyISAM; 

這將完全刪除前表的所有痕跡,讓你一個閃亮的新的。請確保您首先將innodb_file_per_table設置爲1,否則您將爲ibdata1系統名稱空間分配磁盤空間,這不容易回收。

+0

那麼你是說唯一的區別是我應該只在服務器離線時使用myisamchk? – chiliNUT

+1

這是主要的區別,儘管myisamchk有更多的選擇。你也可以找到源代碼。或者,您可以將表格文件複製到其他地方,修復它,然後使用myisamchk將修復後的版本複製回來,無論何時使用'FLUSH TABLES WITH讀鎖定「。 –

+0

謝謝。除了其他原因,我想用sql語法來做,所以我可以在連接到我的數據庫服務器而不是服務器本身的另一臺服務器上運行代碼。我用檢查表記錄狀態,然後根據需要修復。 – chiliNUT