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