mysql-logo.gif (3082 bytes)MySQL中文參考手冊

譯者:晏子 (clyan@sohu.com
GB 碼主頁:http://linuxdb.yeah.net

Big5 轉碼者:statue (statue@bbs.yzu.edu.tw
詞彙轉換:彭武興 (wilson@mailbox.com.tw)
Big5 碼主頁: http://cnpa.yzu.edu.tw/~cfc/docs/mysqldoc_big5/manual_toc.html
Big5 碼分站: http://php.wilson.gs/mysqldoc/big5/manual_toc.html


第一章, 前一章, 下一章, 最後一章目錄.


13 維護MySQL安裝

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

為了檢查/修復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
非常徹底地檢查表。這僅在歲N搊〞p下是必要的。通常,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
根據一個索引排序記錄。這使你的數據更局部化並且可以加快在該鍵上的SELECTORDER 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內存使用

當你運行myisamchk時,內存分配很重要。myisamchk使用不超過你用-O選項指定的內存量。如果你想在很大的文件上使用myisamchk,你首先應該確定你想要它使用多少內存。內定僅使用大約 3M 來修復。通過使用更大的值,你能使myisamchk更快地操作。例如,如果你有多於32M內存,你能使用例如這些選項(除了任何你可能指定的選項):

shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...

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

必須明白,myisamchk使用在TMPDIR裡面的臨時文件。如果TMPDIR指向一個內存文件系統,你可能很容易得到內存溢出的錯誤。如果它發生,設定TMPDIR指向有更多空間的某個目錄並且重啟myisamchk

13.2 建立一個資料庫表維護規範

在一個定期基礎而非等到問題出現才實施資料庫表的檢查是一個好主意。為維護目的,你能使用myisamchk -s檢查桌子。-s選項使myisamchk以沉默模式運行,當錯誤出現時,僅僅列印消息。

在伺服器啟動時檢查表是一個好主意。例如,無論何時機器在更新當中重新啟動了,你通常需要檢查所有可能被影響了的表。(這是一個“期望破壞了的表”) 如果重啟後有一個舊的“.pid”(進程ID),你能為safe_mysqld加入一個測試,運行myisamchk檢查所有在過去24小時修改過的表)。(“.pid”文件在mysqld啟動時由它創建,並它正常終止時刪除。在系統啟動時存在一個“.pid”文件表明mysqld異常地終止了。)

一個更好的測試將是檢查任何表,它的最後修改時間是比“.pid”文件更新。

你也應該定期在正常系統操作期間檢查表。在TcX,我們運行一個cron任務,每周一次檢查我們所有重要的表,在一個“crontab”文件中使用這樣的行:

35 0 * * 0 /path/to/myisamchk -s /path/to/datadir/*/*.MYI 

這列印出損壞的表的資訊,因此我們能檢驗並且在需要時修復他們。

當我們現在幾年(這確實是真的)都沒有任何意外損壞的表時(由於除硬件故障外的其他原因造成損壞的表),每周一次對我們是足夠了。

我們建議現在開始,你對所有最後24小時內被更新了表每晚都執行myisamchk -s,直到你變得像我們那樣信任MySQL

13.3 獲得關於一個表的資訊

為了獲得關於一個表的描述或統計,使用顯示在下面的命令。我們以後更詳細地解釋某些資訊。

myisamchk -d tbl_name
以“描述模式”運行myisamchk,產生你的表的描述。如果你用--skip-locking選項啟動MySQL伺服器,myisamchk可以當它運行時報告被一個更新的表的錯誤。然而,既然在描述模式中myisamchk不改變表,沒有破壞數據的任何風險。
myisamchk -d -v tbl_name
為了產生更多關於myisamchk正在做什麼的資訊,加上-v告訴它以冗長模式運行。
myisamchk -eis tbl_name
僅顯示一個表最重要的資訊。因為必須讀取整個表,它很慢。
myisamchk -eiv tbl_name
這類似-eis,只是告訴你正在做什麼。

myisamchk -d輸出的例子:

MyISAM file:     company.MYI
Record format:       Fixed length
Data records:           1403698  Deleted blocks:         0
Recordlength:               226

table description:
Key Start Len Index   Type
1   2     8   unique  double
2   15    10  multip. text packed stripped
3   219   8   multip. double
4   63    10  multip. text packed stripped
5   167   2   multip. unsigned short
6   177   4   multip. unsigned long
7   155   4   multip. text
8   138   4   multip. unsigned long
9   177   4   multip. unsigned long
    193   1           text

myisamchk -d -v輸出的例子:

MyISAM file:         company
Record format:       Fixed length
File-version:        1
Creation time:       1999-10-30 12:12:51
Recover time:        1999-10-31 19:13:01
Status:              checked
Data records:           1403698  Deleted blocks:              0
Datafile parts:         1403698  Deleted data:                0
Datafilepointer (bytes):      3  Keyfile pointer (bytes):     3
Max datafile length: 3791650815  Max keyfile length: 4294967294
Recordlength:               226

table description:
Key Start Len Index   Type                  Rec/key     Root Blocksize
1   2     8   unique  double                      1 15845376      1024
2   15    10  multip. text packed stripped        2 25062400      1024
3   219   8   multip. double                     73 40907776      1024
4   63    10  multip. text packed stripped        5 48097280      1024
5   167   2   multip. unsigned short           4840 55200768      1024
6   177   4   multip. unsigned long            1346 65145856      1024
7   155   4   multip. text                     4995 75090944      1024
8   138   4   multip. unsigned long              87 85036032      1024
9   177   4   multip. unsigned long             178 96481280      1024
    193   1           text

myisamchk -eis輸出的例子:

Checking MyISAM file: company
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:  98%  Packed:   17%

Records:          1403698    M.recordlength:     226   Packed:             0%
Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
Record blocks:    1403698    Delete blocks:        0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0

User time 1626.51, System time 232.36
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 627, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 639, Involuntary context switches 28966

myisamchk -eiv輸出的例子:

Checking MyISAM file: company
Data records: 1403698   Deleted blocks:       0
- check file-size
- check delete-chain
block_size 1024:
index  1:
index  2:
index  3:
index  4:
index  5:
index  6:
index  7:
index  8:
index  9:
No recordlinks
- check index reference
- check data record references index: 1
Key:  1:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
- check data record references index: 2
Key:  2:  Keyblocks used:  98%  Packed:   50%  Max levels:  4
- check data record references index: 3
Key:  3:  Keyblocks used:  97%  Packed:    0%  Max levels:  4
- check data record references index: 4
Key:  4:  Keyblocks used:  99%  Packed:   60%  Max levels:  3
- check data record references index: 5
Key:  5:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 6
Key:  6:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 7
Key:  7:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 8
Key:  8:  Keyblocks used:  99%  Packed:    0%  Max levels:  3
- check data record references index: 9
Key:  9:  Keyblocks used:  98%  Packed:    0%  Max levels:  4
Total:    Keyblocks used:   9%  Packed:   17%

- check records and index references
[LOTS OF ROW NUMBERS DELETED]

Records:          1403698    M.recordlength:     226   Packed:             0%
Recordspace used:     100%   Empty space:          0%  Blocks/Record:   1.00
Record blocks:    1403698    Delete blocks:        0
Recorddata:     317235748    Deleted data:         0
Lost space:             0    Linkdata:             0

User time 1639.63, System time 251.61
Maximum resident set size 0, Integral resident set size 0
Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0
Blocks in 4 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 10604, Involuntary context switches 122798

這是對於用在上述例子中的表的數據大小和索引文件的大小:

-rw-rw-r--   1 monty    tcx     317235748 Jan 12 17:30 company.MYD
-rw-rw-r--   1 davida   tcx      96482304 Jan 12 18:35 company.MYM

myisamchk產生資訊的類型在下面解釋。“keyfile”是索引文件。“記錄”和“行”是同義詞。

ISAM file
ISAM(索引)文件名。
Isam-version
ISAM格式的版本。當前總是2。
Creation time
數據文件被創建的時間。
Recover time
索引/數據文件上次被重建的時間。
Data records
在表中有多少記錄。
Deleted blocks
有多少刪除的塊仍然保留著空間。你可以最佳化表以使這個空間減到最小。見13.4.3 表最佳化
Datafile: Parts
對動態記錄格式,這指出有多少數據塊。對於一個沒有碎片的最佳化過的表,這與Data records相同。
Deleted data
不能回收的刪除數據有多少字節。你可以最佳化表以使這個空間減到最小。見13.4.3 表最佳化
Datafile pointer
數據文件指針的大小,以字節計。它通常是2、3、4或5個字節。大多數表用2個字節管理,但是目前這還不能從MySQL控制。對固定表,這是一個記錄地址。對動態表,這是一個字節地址。
Keyfile pointer
索引文件指針的大小,以字節計。它通常是1、2或3個字節。大多數表用 2 個字節管理,但是它自動由MySQL計算。它總是一個塊地址。
Max datafile length
表的數據文件(.MYD文件)能夠有多長,以字節計。
Max keyfile length
表的關鍵字文件(.MYI文件)能夠有多長,以字節計。
Recordlength
每個記錄占多少空間,以字節計。
Record format
用於儲存表行的格式。上面的例子使用Fixed length。其他可能的值是CompressedPacked.
table description
在表中所有鍵值的一張表。對每個鍵,給出一些底層的資訊:
Key
該鍵的編號。
Start
該索引部分從記錄的哪裡開始。
Len
該索引部分是多長。對於緊湊的數字,這應該總是列的全長。對字符串,它可以比索引的列的全長短些,因為你能索引字符串列的前綴。
Index
uniquemultip(multiple)。表明一個值是否能在該索引中存在多次。
Type
這索引部分有什麼數據類型。這是一個packedstrippedempty選項的 ISAM 數據類型。
Root
根索引塊的地址。
Blocksize
每個索引塊的大小。內定是1024,但是值可以在編譯時改變。
Rec/key
這是由最佳化器使用的統計值。它告訴對該鍵的每個值有多少條記錄。唯一鍵總是有一個1值。在一個表被裝載後(或改變很大),這可以用myisamchk -a更新。如果這根本沒被更新,給定一個30的內定值。
在上面第一個例子中,第個9鍵是有2個部分的多部鍵。
Keyblocks used
鍵塊使用的百分比是什麼。因為在例子中使用的表只能用myisamchk被重新組織,值非常高(很接近理論上的最大值)。
Packed
MySQL試圖用一個公共後綴壓縮鍵。這只能被用於CHAR/VARCHAR/DECIMAL鍵。對長字符串如姓名,這能顯著地減少使用空間。在上面的第3個例子中,第4個鍵是10個字符長並且在空間上達到60%的縮減。
Max levels
對於該鍵的B樹有多深。有長鍵的大表有較高的值。
Records
表中有多少行。
M.recordlength
平均記錄長度。對於有定長記錄的表,這是準確的記錄長度。
Packed
MySQL從字符串的結尾去掉空格。Packed值表明這樣做達到的節約的百分比。
Recordspace used
數據文件被使用的百分比。
Empty space
數據文件未被使用的百分比。
Blocks/Record
每個記錄的平均塊數 (即,一個碎片記錄由多少個連接組成)。對固定格式表,這總是1。該值應該盡可能保持接近1.0。如果它變得太大,你可用myisamchk重新組織表。見13.4.3 表最佳化
Recordblocks
多少塊(連接)被使用。對固定格式,它與記錄的個數相同。
Deleteblocks
多少塊(連接)被刪除。
Recorddata
在數據文件中使用了多少字節。
Deleted data
在數據文件中多少字節被刪除(未使用)。
Lost space
如果一個記錄被改為更短的長度,就損失了一些空間。這是所有這樣的損失之和,以字節計。
Linkdata
當使用動態表格式,記錄碎片用指針連接(每個4 ∼ 7字節)。 Linkdata被這樣的指針使用的內存量之和。

如果一張表已經用myisampack壓縮了,myisamchk -d列印每個表列的附加資訊。對於它的一個例子及其含義的描述,見12.5 MySQL壓縮只讀表產生器

13.4 使用myisamchk進行崩潰恢復

MySQL用來儲存數據的文件格式以已經被廣泛地測試過,但是總是有外部情況可以導致資料庫表被破壞:

這章描述如何檢查和處理在MySQL資料庫中的數據損壞。如果你的表損壞很多,你應該嘗試找出其原因!見G.1 調試一個MySQL伺服器

在執行崩潰恢復時,理解在一個資料庫中的每一個表tbl_name對應的在資料庫目錄中的3個文件是很重要的:

文件 用途
“tbl_name.frm” 表定義(表格)文件
“tbl_name.MYD” 數據文件
“tbl_name.MYI” 索引文件

這3個文件的每一個文件類型可能遭受不同形式的損壞,但是問題最常發生在數據文件和索引文件。

myisamchk通過一行一行地創建一個“.MYD”(數據 )文件的副本來工作,它通過由刪除老的“.MYD 文件並且重命名新文件到原來的文件名結束修復階段。如果你使用--quickmyisamchk不創建一個臨時“.MYD”文件,只是假定“.MYD”文件是正確的並且僅創建一個新的索引文件,不接觸“.MYD”文件,這是安全的,因為myisamchk自動檢測“.MYD”文件是否損壞並且在這種情況下,放棄修復。你也可以給myisamchk兩個--quick選項。在這種情況下,myisamchk不會在一些錯誤上(像重複鍵)放棄,相反試圖通過修改“.MYD”文件解決它們。通常,只有在你在太少的空閑磁碟空間上實施一個正常修復,使用兩個--quick選項才有用。在這種情況下,你應該至少在運行myisamchk前做一個備份。

13.4.1 怎樣檢查表的錯誤

為了檢查一張表,使用下列命令:

myisamchk tbl_name
這能找出所有錯誤的99.99%。它不能找出的是僅僅涉及數據文件的損壞(這很不常見)。如果你想要檢查一張表,你通常應該沒有選項地運行myisamchk或用-s--silent選項的任何一個。
myisamchk -e tbl_name
它做一個完全徹底的數據檢查(-e意思是“擴展檢查”)。它對每一行做每個鍵的讀檢查以証實他們確實指向正確的行。這在一個有很多鍵的大表上可能花很長時間。myisamchk通常將在它發現第一個錯誤以後停止。如果你想要獲得更多的資訊,你能增加--verbose(-v)選項。這使得myisamchk繼續一直到最多20個錯誤。在一般使用中,一個簡單的myisamchk(沒有除表名以外的參數)就足夠了。
myisamchk -e -i tbl_name
像前面的命令一樣,但是-i選項告訴myisamchk還列印出一些統計資訊。

13.4.2 怎樣修復表

一張損壞的表的症狀通常是查詢意外中斷並且你能看到例如這些錯誤:

在這些情況下,你必須修復表。myisamchk通常能檢測並且修復出錯的大部分東西。

修復程序包含最多4個階段,在下面描述。在你開始前,你應該cd到資料庫目錄和檢查表文件的權限,確保他們可被運行mysqld的Unix用戶讀取(和你,因為你需要存取你正在檢查的文件)。如果它拒絕你修改文件,他們也必須是可被你寫入的。

階段1:檢查你的表

運行myisamchk *.MYI或(myisamchk -e *.MYI,如果你有更多的時間)。使用-s(沉默)選項禁止不必要的資訊。

你必須只修復那些myisamchk報告有一個錯誤的表。對這樣的表,繼續到階段2。

如果在檢查時,你得到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3。

舞台 2 :簡單安全的修復

首先,試試myisamchk -r -q tbl_name(-r -q意味著“快速恢復模式”)。這將試圖不接觸數據文件來修復索引文件。如果數據文件包含它應有的一切和在數據文件指向正確地點的刪除連接,這應該管用並且表可被修復。開始修理下一張表。否則,使用下列程序:

  1. 在繼續前做數據文件的一個備份。
  2. 使用myisamchk -r tbl_name(-r意味著“恢復模式”)。這將從數據文件中刪除不正確的記錄和已被刪除的記錄並重建索引文件。
  3. 如果前面的步驟失敗,使用myisamchk --safe-recover tbl_name。安全恢復模式使用一個老的恢復方法,處理常規恢復模式不行的少數情況(但是更慢)。

如果在修復時,你得到奇怪的錯誤(例如out of memory錯誤),或如果myisamchk崩潰,到階段3。

舞台 3 :困難的修理

如果在索引文件的第一個16K塊被破壞,或包含不正確的資訊,或如果索引文件丟失,你只應該到這個階段 。在這種情況下,創建一個新的索引文件是必要的。按如下這樣做:

  1. 把數據文件移更安全的地方。
  2. 使用表描述文件創建新的(空)數據和索引文件:
    shell> mysql db_name
    mysql> DELETE FROM tbl_name;
    mysql> quit
    
  3. 將老的數據文件拷貝到新創建的數據文件之中。(不要只是將老文件移回新文件之中﹔你要保留一個副本以防某些東西出錯。)

回到階段2。現在myisamchk -r -q應該工作了。(這不應該是一個無限循環)。

階段4:非常困難的修復

只有描述文件也破壞了,你才應該到達這個階段。這應該從未發生過,因為在表被創建以後,描述文件就不再改變了。

  1. 從一個備份恢復描述文件並且回到階段3。你也可以恢復索引文件並且回到階段2。對後者,你應該用myisamchk -r啟動。
  2. 如果你沒有一個備份但是確切地知道表是怎樣被創建的,在另一個資料庫中創建表的一個拷貝。刪除新的數據文件,然後從其他資料庫將描述和索引文件移到破壞的資料庫中。這給了你新的描述和索引文件,但是讓數據文件獨自留下來了。回到階段2並且嘗試重建索引文件。

13.4.3 表最佳化

為了組合成碎片的記錄並且消除由於刪除或更新記錄而浪費的空間, 以恢復模式運行myisamchk

shell> myisamchk -r tbl_name

你可以用SQL的OPTIMIZE TABLE語句使用的相同方式來最佳化一張表,OPTIMIZE TABLE比較容易,但是myisamchk更快。也沒有在一個實用程式和伺服器之間不必要的交互可能性,因為當你使用OPTIMIZE TABLE時,伺服器做所有的工作。

myisamchk也有你可用來改進一個表的性能的很多其他選項:

-S, --sort-index
 
-R index_num, --sort-records=index_num
 
-a, --analyze
 

對於選項完整的描述見13.1.1 myisamchk調用語法

13.5 日誌文件維護

MySQL與日誌文件一起使用時,你有時想要刪除/備份舊的日誌文件並且告訴MySQL在新文件中開始記錄。見9.2 更新日誌

在一個 Linux (Redhat)的安裝上,你可為此使用mysql-log-rotate腳本。如果你從RPM分發安裝MySQL,腳本應該自動被安裝了。

在其他系統上,你必須自己安裝一個短腳本,你可從cron啟動來處理日誌文件。

你可以通過使用mysqladmin flush-logs或SQL命令FLUSH LOGS來強制MySQL開始使用新的日誌文件。如果你正在使用MySQL 3.21,你必須使用mysqladmin refresh

上面的命令做下列事情:

如果你只使用一個更新日誌,你只須清空日誌文件,然後移走舊的更新日誌文件到一個備份中。如果你使用一般的日誌,你可以這樣做:

shell> cd mysql-data-directory
shell> mv mysql.log mysql.old
shell> mysqladmin flush-tables

然後做一個備份並刪除“mysql.old”


第一章, 前一章, 下一章, 最後一章目錄.