使用myisamchk進行表的維護和崩潰恢復

2021-09-20 19:23:35 字數 3666 閱讀 5869

為了檢查/修復myisam表(.myi和.myd),你應該使用myisamchk實用程式。為了檢查/修復isam表(.ism和.isd),你應該使用isamchk實用程式。見9.4 mysql 表型別。

在下文中,我們將討論myisamchk,但是也適用於老的isamchk。

你可以使用myisamchk實用程式來獲得有關你的資料庫桌表的資訊、檢查和修復他們或優化他們。下列小節描述如何呼叫myisamchk(包括它的選項的描述),如何建立乙個表維護的時間表,並且如何使用myisamchk執行其各種功能。

如果你用--skip-locking執行mysqld(它在一些系統上是預設的,如linux),當mysqld正在使用同乙個表時,你不能可靠地使用myisamchk檢查一張表。如果你能肯定在你執行myisamchk時沒有人通過mysqld正在訪問表,在你開始檢查表之前,你僅需做mysqladmin flush-tables。如果你不能保證, 那麼當你檢查表時,你必須停掉mysqld。如果你在mysqld正在更新表時執行myisamchk,你可能得到乙個表已破壞的警告,即使它沒有。

如果你沒使用--skip-locking,你能在任何時間使用myisamchk檢查表。當你這樣時,所有試圖更新表的客戶在繼續前將等到myisamchk就緒。 

如果你使用myisamchk修復或優化表,你必須總是保證mysqld伺服器不在使用表(如果你正在使用--skip-locking,這也適用)。如果你不停掉mysqld,在你執行myisamchk前,你至少應該做乙個mysqladmin flush-tables。

在大多數情況下,你也可使用命令optimize tables優化並修復表,但是這不如myisamchk快或可靠(在真正的致命錯誤的情況下)。在另一方面,optimize table較易使用並且你不必須關心清空表。見7.9optimize table句法。

13.1.1 myisamchk呼叫語法

myisamchk這樣呼叫:

shell> myisamchk [options] tbl_name

options指定你想要myisamchk做什麼。他們在下面描述。(你也可以通過呼叫myisamchk --help得到一張選項表。) 沒有選項,myisamchk簡單地檢查你的表。為了得到更多的資訊或告訴myisamchk執行校正操作,指定在下面和下小節描述的選項擇。

tbl_name是你想要檢查的資料庫表。如果你不在資料庫目錄的某處執行myisamchk,你必須指定到檔案的路徑,因為myisamchk不知道你的資料庫位於哪兒。實際上,myisamchk別在乎你正在操作的檔案是否位於乙個資料庫目錄;你可以拷貝對應於一張資料庫表的檔案到別處並且在那裡執行恢復操作。 

如果你願意,你可以myisamchk命令列命名幾個表。你也能指定乙個名字作為乙個索引檔案(用「 .myi」字尾),它允許你通過使用模式「*.myi」指定在乙個目錄所有的表。例如,如果你在乙個資料庫目錄,你可以這樣在目錄下檢查所有的表:

shell> myisamchk *.myi 

如果你不在資料庫目錄下,你可通過指定到目錄的路徑檢查所有在那裡的表: 

shell> myisamchk /path/to/database_dir/*.myi 

你甚至可以通過為mysql資料目錄的路徑指定乙個萬用字元來檢查所有的資料庫中的所有表:

shell> myisamchk /path/to/datadir/*/*.myi

myisamchk支援下列選項: 

-a, --analyze 

分析鍵值的分布。這通過讓聯結優化器更好地選擇表應該以什麼次序聯結和應該使用哪個鍵來改進聯結效能。 

-#, --debug=debug_options 

輸出除錯記錄檔案。debug_options字串經常是'd:t:o,filename'。 

-d, --description 

列印出關於表的一些資訊。 

-e, --extend-check 

非常徹底地檢查表。這僅在極端情況下是必要的。通常,myisamchk應該找出所有錯誤,即使沒有改選項。 

-f, --force 

覆蓋老的臨時檔案。如果你在檢查表時使用-f (執行myisamchk沒有-r),myisamchk在檢查期間將自動為出現乙個錯誤的錶用-r重啟。 

--help 

顯示一條幫助訊息並且退出。 

-i, --information 

列印有關被檢查的表的資訊統計。 

-k #, --keys-used=# 

與-r一起使用。告訴isam表處理器僅更新頭#個索引。較高編號的索引被撤銷。這能用來使插入變得更快!撤銷的索引能通過使用myisamchk -r被重新啟用。 

-l, --no-symlinks 

在修復時,不跟隨符號連線。通常myisamchk修復乙個符號連線所指的表。 

-q, --quick 

與-r一起使用使得乙個修復更快。通常,原來的資料檔案沒被接觸;你能指定第二個-q強制使用原來的資料檔案。 

-r, --recover 

恢復模式。可以修復幾乎所有一切,除非唯一的鍵不是唯一。 

-o, --safe-recover 

恢復模式。使用乙個老的恢復方法;這比-r慢些,但是能處理一-r不能處理的情況。 

-o var=option, --set-variable var=option 

設定乙個變數的值。可能的變數列在下面。 

-s, --silent 

沉默模式。當錯誤發生時,僅寫輸出。你能使用-s兩次(-ss)非常沉默地做myisamchk。 

-s, --sort-index 

以從高到低的順序排序索引樹塊。這將優化搜尋並且將使按鍵值的表掃瞄更快。 

-r index_num, --sort-records=index_num 

根據乙個索引排序記錄。這使你的資料更區域性化並且可以加快在該鍵上的select和order by的範圍搜尋。(第一次做排序可能很慢!) 為了找出一張表的索引編號,使用show index,它以myisamchk看見他們的相同順序顯示一張表的索引。索引從1開始編號。 

-u, --unpack 

解開乙個用myisampack壓縮的表。 

-v, --verbose 

冗長模式。列印更多的資訊。這能與-d和-e一起使用。為了更冗長,使用-v多次(-vv, -vvv)! 

-v, --version 

列印myisamchk版本並退出。 

-w, --wait 

如果表被鎖定,等待。 

對--set-variable(-o)選項,可能的變數是:

key_buffer_size 當前值: 16776192

read_buffer_size 當前值: 262136

write_buffer_size 當前值: 262136

sort_buffer_size 當前值: 2097144

sort_key_blocks 當前值: 16

decode_bits 當前值: 9

13.1.2 myisamchk記憶體使用

shell> myisamchk -o sort=16m -o key=16m -o read=1m -o write=1m ...

使用-o sort=16m應該可能對大多數情形就足夠了。

必須明白,myisamchk使用在tmpdir裡面的臨時檔案。如果tmpdir指向乙個記憶體檔案系統,你可能很容易得到記憶體溢位的錯誤。如果它發生,設定tmpdir指向有更多空間的某個目錄並且重啟myisamchk。

用Myisamchk讓MySQL資料表更健康

2011 03 15 09 15 水太深 itpub 字型大小 t t 為了讓mysql資料庫中的資料表 更健康 就需要對其進行定期體檢。在這裡筆者推薦使用myisamchk工具來對資料表進行不定期的檢查。同時筆者給出了一些相關的注意事項以及使用技巧。在mysql資料庫中,資料表數以百計,資料庫管理...

使用遞迴進行鍊錶合併

leetcode上有合併鍊錶的題,大概是說將k個公升序鍊錶合成1個公升序鍊錶。附上原題 將兩個有序鍊錶合併為乙個新的有序鍊錶並返回。新煉表是通過拼接給定的兩個鍊錶的所有節點組成的。示例 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 definition for singly linke...

使用臨時表進行效能優化

這兩個月都在搞一儲存過程,快要被它搞出精神病了。主要是它執行的時間比較長,每次執行幾十分鐘是常有的事,幾個小時也不少見。甚至乎這幾天,執行了兩天一夜都還不知道何時會圓滿結束。等待本來就是乙個痛苦的過程,而這個過程要幾天幾夜,那我不瘋誰人瘋。這肯定是有問題的。執行時間超過1小時的都應該有問題。後來,改...