在MySQL數據庫中,數據表數以百計,數據庫管理員不可能有這麼多的時間和精力去依次檢查表的有效性,所以他們急需要一種工具,能夠對相關的數據表進行體檢,以判斷表是否存在一些問題。這就好像我們每年都需要體檢一樣,發現小問題,即時進行修復,以免到時候病入膏肓。在這裡為大家推薦的工具是Myisamchk,使用這個工具來對數據表進行不定期的檢查。在使用這個工具時,筆者要強調一下相關的注意事項以及使用技巧。
一、大表要增加內存的容量
Myisamchk工具的使用效率主要跟表的大小有關。如果數據表比較大,則其運行的速度就會比較慢。在這種情況下,數據庫管理員可能需奧調整內存的配置。
通常情況下,-O參數決定Myisamchk工具運行時所能夠使用的內存大小。當運行Myisamchk時內存分配給其使用的空間不能夠超過這個參數所指定的大小。如果數據庫管理員需要對每一個大表使用Myisamchk工具時,往往需要首先確定這個數據表的大小,並依此判斷所需要占用內存的大小。默認情況下,恢復時可以采用的內存大小只有3M。對於大表來說,這點內存是不夠的。此時數據庫管理員可以調整內存的大小,讓Myisamchk工具運行的更快一點。
如果有需要的話,可以使用-O參數將內存調整為合適的大小。如-O sort=8M等等。一般情況下,這個值設置為16M即可。不需要太大,否則的話,會影響其它作業的運行。總之,在運行Myisamchk工具之前,數據庫管理員先需要評估一下數據庫中各個數據表的大小。如果有比較大的數據表,可以先將其過濾出來(如通過通配符等形式)。然後再調整內存的大小,並單獨對這些大表進行檢查。這是提高Myisamchk運行效率的一個不錯的辦法。
二、利用Myisamchk工具恢復數據時需要大量的硬盤空間
在使用Myisamchk檢查數據表時,如果發現某些表存在問題,還可以使用Myisamchk這個工具對其進行恢復。不過在恢復時,需要先確保有足夠的硬盤空間。否則的話,就可能導致數據表恢復失敗。
通常情況下,所需要使用的硬盤空間是數據表的一倍大小。即如果需要對2G的數據表進行恢復,那麼所需要的剩余空間至少應該還有2G。即需要將數據文件大小擴大為原來的一倍。如果硬盤空間不足,該怎麼辦呢?此時數據庫管理員可以考慮使用—quick選項。使用這個選項之後,進行修復時就不需要這麼多的空間。不過需要注意,此時數據庫系統只是創建了索引文件。
在某些情況下,在修復時需要重新創建索引文件。此時代替舊索引文件的新索引文件也需要占用一定的磁盤空間。雖然說在修復工作一開始的時候,數據庫系統就會對就索引文件進行刪減。但是為了安全起見,筆者還是建議為其保留足夠的硬盤空間。並且在文件系統上所需要的這個存儲空間的大小與原數據文件是相同的。
另外在使用Myisamchk這個工具時,數據庫管理員可能會使用—Recover選項。如果數據庫管理員采用這個選項的話,那麼就可以修復幾乎所有一切的問題。不過注意這裡有一個關鍵字幾乎。這也就是說,大部分數據表問題都可以通過這個選項來解決。但是也有一些例外。如當遇到唯一的鍵不唯一等問題時,即時采用這個選項也是沒有辦法。一般情況下,數據庫管理員在恢復工作時可以先試用這個選項。當系統報告這個選項不可用時,再嘗試使用另外的恢復方式。不過需要注意的是,使用這個選項時需要用到排序緩沖區空間。大致大小一般為數據的2倍。
綜上所述,在利用Myisamchk這個工具對表進行恢復操作時,需要保證其有足夠的磁盤空間。筆者的建議時,至少要有兩倍以上的數據文件大小的磁盤空間。
三、逐步修復收損壞的數據表
如果不幸你的數據表受到損壞時,該怎麼進行修復呢?筆者認為,應該采用逐步修復的方式。不過在執行修復操作是,有兩個必要的步驟需要做。一是停止運行數據庫服務器,二是對相關的數據文件進行備份。雖然說Myisamchk工具是一個相對安全的數據檢查工具,但是在對數據進行恢復之前對數據文件進行必要的備份,仍然是一個必要的安全措施。在對對數據進行恢復時,通常可以按照下面的順序來操作。
一是檢查數據表,以判斷到底哪些數據表出現了問題,以及出現問題的大小。為了安全與效率的考慮,在修復時一般只修復那些出現問題的數據表。在檢查數據表時,可以使用-update-state選項來告訴Myisamchk工具哪些數據表是檢查過的,並且對有問題的表格會進行標識。 然後再修復時,可以指定Myisamchk工具只修復那些報告有錯誤的表格。
二是進行簡單安全的修復。在剛開始修復數據時,最好采用“快速恢復模式”。在這個模式下,數據庫系統並不接觸數據文件來修復索引文件。如果數據文件包含它應有的一切內容和指向數據文件內正確的刪除連接,此時使用快速恢復模式就可以修復損壞的數據表,如果即使采用簡單安全的修復,最好在修復開始之前對數據表做好備份工作。然後使用Myisamchk –r 表名字 來恢復指定的數據表。運行這個命令之後,系統將從數據文件中刪除不正確的紀錄和已經被刪除的記錄,並會重新創建索引文件。如果采用這個模式還不能夠修復數據文件時,則采用下面一個恢復模式。
三是索引文件破壞情況下的恢復模式。如果數據庫表格的索引文件的第一個16K塊被破壞掉,或者說包含不正確的信息,又或者整個索引文件丟失,在這種情況下,就需要創建一個新的索引文件。此時就需要用到下面談到的恢復模式。此時數據庫管理員需要先將數據文件轉移到安全地方,然後使用表描述文件來創建新的數據文件和索引文件。然後再將老的數據文件復制到新創建的數據文件之中。然後再使用命令Myisamchk –r-q來恢復數據表。如果只是索引文件出現了問題,那麼使用這個命令就可以恢復數據。
四是最極端的情況,即表描述文件也受到了損壞。此時就不能夠采用上面這個恢復模式。因為已經無法使用表描述文件來創建新的數據文件和索引文件。此時筆者建議,要采用數據庫恢復的方式,來恢復全部的數據文件。在MySQL數據庫中,可以根據需要設置完全備份或者增量備份。如果表描述文件也損壞時,那麼采用數據庫恢復的方式,無疑是最安全的方法。
當然Myisamchk工具的功能不只上面這些。其下面有很多有趣的內容。如可以根據需要,修復某個指定的數據表。也可以使用通配符批量的檢查文件。甚至可以對獨立的數據文件進行檢查等等。不過需要注意的是,無論是采用哪種方式,都需要先對數據庫進行必要的備份。雖然說Myisamchk這個工具相對來說是比較安全的。但是養成在任何檢查與修復之前先對原有的數據進行備份,仍然是一個不錯的數據庫管理習慣。
不過需要注意的是,Myisamchk工具並不是萬能的。對於一些極端性的損壞,如表格描述文件損壞,這個工具就沒有用武之地了。為此數據庫管理員還是需要最好數據庫日常的備份工作。數據庫管理員一定要做好這方面的工作,來確保數據庫的萬無一失。