您好,登錄后才能下訂單哦!
這篇文章主要介紹MySQL如何實(shí)現(xiàn)表維護(hù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
為什么要做表維護(hù)操作,解決什么問題?
兩種情況下需要做表維護(hù)操作,一是由于服務(wù)器崩潰而導(dǎo)致表?yè)p壞,二是對(duì)表的查詢處理速度較慢的情況;
執(zhí)行表維護(hù)工具主要有MySQL Workbench、MySQL Enterprise Monitor、SQL (DML) 維護(hù)語(yǔ)句、mysqlcheck、myisamchk;下面就逐一介紹這些工具;
1.1. 表維護(hù)SQL語(yǔ)句
用于執(zhí)行表維護(hù)的SQL語(yǔ)句有:ANALYZE TABLE(更新索引統(tǒng)計(jì)信息)、CHECK TABLE(徹底檢查完整性)、CHECKSUM TABLE(徹底檢查完整性)、REPAIR TABLE(修復(fù))、OPTIMIZE TABLE(優(yōu)化),每個(gè)語(yǔ)句均包含一個(gè)或多個(gè)表名稱和可選的關(guān)鍵字。維護(hù)語(yǔ)句和輸出的示例:
mysql> CHECK TABLE world_innodb.City;
+-------------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-------------------+-------+----------+----------+
| world_innodb.City | check | status | OK |
+-------------------+-------+----------+----------+
執(zhí)行所請(qǐng)求的操作之后,服務(wù)器將返回有關(guān)對(duì)客戶機(jī)執(zhí)行操作的結(jié)果的信息。該信息以四列結(jié)果集形式顯示:
l Table:指示對(duì)其執(zhí)行操作的表
l Op:指出操作(檢查、修復(fù)、分析或優(yōu)化)
l Msg_type:指示成功或失敗
l Msg_text:提供其他信息
1.1.1. ANALYZE TABLE 語(yǔ)句
ANALYZE TABLE 語(yǔ)句分析并存儲(chǔ)表的鍵分布統(tǒng)計(jì)信息,用于更好地進(jìn)行查詢執(zhí)行選擇, 處理InnoDB、NDB 和MyISAM 表,支持分區(qū)表;
ANALYZE TABLE 選項(xiàng):NO_WRITE_TO_BINLOG 或LOCAL:禁用二進(jìn)制日志
ANALYZE TABLE 正常結(jié)果的示例:
mysql> ANALYZE LOCAL TABLE Country;
+----------------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------------+--------+----------+----------+
| world_innodb.Country | analyze| status | OK |
+----------------------+--------+----------+----------+
在對(duì)非常量對(duì)象執(zhí)行聯(lián)接操作時(shí),MySQL 使用所存儲(chǔ)的鍵分布統(tǒng)計(jì)信息來(lái)確定優(yōu)化程序聯(lián)接表的順序。此外,鍵分布確定了MySQL 用于查詢中的特定表的索引。
您可以執(zhí)行ANALYZE TABLE 語(yǔ)句來(lái)分析并存儲(chǔ)統(tǒng)計(jì)信息,或者配置InnoDB,以便在大量數(shù)據(jù)發(fā)生更改之后或者在查詢表或索引元數(shù)據(jù)時(shí)自動(dòng)收集統(tǒng)計(jì)信息。
ANALYZE TABLE 特征:
l 在分析過程中,對(duì)于InnoDB 和MyISAM,MySQL 使用讀取鎖來(lái)鎖定表。
l 此語(yǔ)句等效于使用mysqlcheck --analyze。
l 需要對(duì)表有SELECT 和INSERT 權(quán)限。
l 支持分區(qū)表。還可以使用ALTER TABLE...ANALYZE PARTITION 檢查一個(gè)或多個(gè)分區(qū)。
如果自從運(yùn)行上一個(gè)ANALYZE TABLE 語(yǔ)句后表未發(fā)生任何更改,則MySQL 不會(huì)分析該表。默認(rèn)情況下,MySQL 會(huì)將ANALYZE TABLE 語(yǔ)句寫入二進(jìn)制日志并將這些語(yǔ)句復(fù)制到復(fù)制從屬角色中。禁止使用可選的NO_WRITE_TO_BINLOG 關(guān)鍵字或其別名LOCAL 執(zhí)行日志記錄。
可以使用以下選項(xiàng)控制MySQL 收集和存儲(chǔ)鍵分布統(tǒng)計(jì)信息的方式:
l innodb_stats_persistent:此選項(xiàng)為ON 時(shí),MySQL 將對(duì)新創(chuàng)建的表啟用STATS_PERSISTENT 設(shè)置。使用CREATE TABLE 或ALTER TABLE 語(yǔ)句時(shí),還可以對(duì)表設(shè)置STATS_PERSISTENT。默認(rèn)情況下,MySQL 不會(huì)將鍵分布統(tǒng)計(jì)信息持久保留在磁盤上,因此有時(shí)必須生成這些信息(如服務(wù)器重新啟動(dòng)后)。對(duì)于啟用了STATS_PERSISTENT 的表,MySQL 會(huì)將其鍵分布統(tǒng)計(jì)信息存儲(chǔ)在磁盤上,從而不需要頻繁地為這些表生成統(tǒng)計(jì)信息。隨著時(shí)間推移,通過此操作優(yōu)化程序可以創(chuàng)建更一致的查詢計(jì)劃。
l innodb_stats_persistent_sample_pages:MySQL 通過讀取STATS_PERSISTENT 表的索引頁(yè)樣例(而并非整個(gè)表)重新計(jì)算統(tǒng)計(jì)信息。默認(rèn)情況下,將讀取20 頁(yè)樣例。增大此數(shù)字可提高所生成的統(tǒng)計(jì)信息和查詢計(jì)劃的質(zhì)量。降低此數(shù)字可減少用于生成統(tǒng)計(jì)信息的I/O 成本。
l innodb_stats_transient_sample_pages:此選項(xiàng)用于控制對(duì)沒有STATS_PERSISTENT 設(shè)置的表的抽樣索引頁(yè)數(shù)量。
以下選項(xiàng)用于控制MySQL 自動(dòng)收集統(tǒng)計(jì)信息的方式。
l innodb_stats_auto_recalc:?jiǎn)⒂么诉x項(xiàng)時(shí),如果STATS_PERSISTENT 表中10% 的行自前一次重新計(jì)算后有所變化,則MySQL 將自動(dòng)為該表生成統(tǒng)計(jì)信息。
l innodb_stats_on_metadata:?jiǎn)⒂么诉x項(xiàng)可在執(zhí)行元數(shù)據(jù)語(yǔ)句(如SHOW TABLE STATUS)或查詢INFORMATION_SCHEMA.TABLES 時(shí)更新統(tǒng)計(jì)信息。默認(rèn)情況下,此選項(xiàng)處于禁用狀態(tài)。
1.1.2. CHECK TABLE 語(yǔ)句
ANALYZE TABLE 語(yǔ)句檢查表結(jié)構(gòu)的完整性,并檢查內(nèi)容中是否包含錯(cuò)誤,驗(yàn)證視圖定義, 支持分區(qū)表,處理InnoDB、CSV、MyISAM 和ARCHIVE 表
CHECK TABLE 選項(xiàng):
? FOR UPGRADE:檢查表是否適用于當(dāng)前服務(wù)器。
? QUICK:不掃描行來(lái)檢查錯(cuò)誤鏈接。
如果CHECK TABLE 發(fā)現(xiàn)InnoDB 表出現(xiàn)問題,則服務(wù)器將關(guān)閉,以防止錯(cuò)誤擴(kuò)散,同時(shí)MySQL 會(huì)將錯(cuò)誤寫入錯(cuò)誤日志;
CHECK TABLE 特征:
? 對(duì)于MyISAM 表,還將更新鍵統(tǒng)計(jì)信息。
? 還可以檢查視圖是否出現(xiàn)問題,例如視圖定義中引用的表不再存在。
? 支持分區(qū)表。還可以使用ALTER TABLE...CHECK PARTITION 檢查一個(gè)或多個(gè)分區(qū)。
使用FOR UPGRADE 時(shí),服務(wù)器將檢查每個(gè)表以確定表結(jié)構(gòu)是否與當(dāng)前的MySQL 版本兼容。可能會(huì)因?yàn)槟撤N數(shù)據(jù)類型的存儲(chǔ)格式或排序順序發(fā)生變化而出現(xiàn)不兼容的情況。如果出現(xiàn)潛在的不兼容情況,則服務(wù)器將對(duì)表運(yùn)行全面檢查。如果全面檢查成功,則服務(wù)器會(huì)使用當(dāng)前的MySQL 版本號(hào)標(biāo)記表的.frm 文件。對(duì).frm 文件進(jìn)行標(biāo)記可以確保以后對(duì)于與服務(wù)器版本相同的表進(jìn)行檢查的速度會(huì)加快。
建議對(duì)InnoDB、MyISAM 和ARCHIVE 存儲(chǔ)引擎使用FOR UPGRADE。對(duì)InnoDB 和MyISAM 表使用QUICK。MyISAM 支持其他選項(xiàng)。請(qǐng)?jiān)L問
http://dev.mysql.com/doc/refman/5.6/en/check-table.htm
CHECK TABLE 語(yǔ)句
CHECK TABLE 正常結(jié)果的示例:
mysql> CHECK TABLE Country;
+----------------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------------+-------+----------+----------+
| world_innodb.Country | check | status | OK |
+----------------------+-------+----------+----------+
如果CHECK TABLE 的輸出表明某個(gè)表出現(xiàn)問題,請(qǐng)修復(fù)該表。例如,您可以先使用CHECK TABLE 語(yǔ)句檢測(cè)硬件問題(如內(nèi)存故障或磁盤扇區(qū)損壞),然后再修復(fù)表。
Msg_text 輸出列通常為OK。如果輸出不是OK 或Table is already up to date,請(qǐng)對(duì)該表運(yùn)行修復(fù)。如果該表被標(biāo)記為corrupted 或not closed properly,但CHECK TABLE 在表中未發(fā)現(xiàn)任何問題,則會(huì)將該表標(biāo)記為OK。
1.1.3. CHECKSUM TABLE 語(yǔ)句
CHECKSUM TABLE 語(yǔ)句報(bào)告表checksum,用于驗(yàn)證表的內(nèi)容在備份、回滾或其他操作前后是否相同;
CHECKSUM TABLE 語(yǔ)句逐行讀取整個(gè)表以計(jì)算校驗(yàn)和
? 默認(rèn)的EXTENDED 選項(xiàng)提供了此行為。
? QUICK 選項(xiàng)對(duì)MyISAM 表可用。
? 當(dāng)包含MyISAM CHECKSUM=1 設(shè)置時(shí),此為默認(rèn)選項(xiàng)。
CHECKSUM TABLE 語(yǔ)句的示例:
mysql> CHECKSUM TABLE City;
+-------------------+-----------+
| Table | Checksum |
+-------------------+-----------+
| world_innodb.City | 531416258 |
+-------------------+-----------+
CHECKSUM TABLE 特征:
? CHECKSUM TABLE 需要對(duì)表有SELECT 權(quán)限。
? 對(duì)于不存在的表,CHECKSUM TABLE 將返回NULL 并生成警告。
? 如果使用了EXTENDED 選項(xiàng),則將逐行讀取整個(gè)表,并計(jì)算checksum。
? 如果使用了QUICK 選項(xiàng):將報(bào)告實(shí)時(shí)表checksum(如果可用);否則將報(bào)告NULL。此操作非???。通過在創(chuàng)建表時(shí)指定CHECKSUM=1 表選項(xiàng),對(duì)MyISAM 表啟用了實(shí)時(shí)checksum。
? 如果既未指定QUICK,也未指定EXTENDED,則MySQL 將假定為EXTENDED(CHECKSUM=1 的MyISAM 表除外)。
checksum 值取決于表中的行格式。如果行格式發(fā)生了變化,則checksum 也會(huì)更改。例如,VARCHAR 的存儲(chǔ)格式在MySQL 4.1 之后的版本中有所變化,因此,在將4.1 表升級(jí)到更高版本后,如果表中包含VARCHAR 字段,則checksum 值將發(fā)生變化。
注:如果兩個(gè)表的checksums 不同,則很可能這兩個(gè)表存在某方面的差異。不過,因?yàn)镃HECKSUM TABLE 使用的散列函數(shù)無(wú)法保證不沖突,所以存在兩個(gè)不同的表生成相同checksum 的微弱可能性。
1.1.4. OPTIMIZE TABLE 語(yǔ)句
OPTIMIZE TABLE 語(yǔ)句通過對(duì)表進(jìn)行碎片整理來(lái)清理表,即通過重新構(gòu)建表并釋放未使用的空間對(duì)表進(jìn)行碎片整理;OPTIMIZE TABLE 語(yǔ)句在優(yōu)化過程中鎖定表,并更新索引統(tǒng)計(jì)信息,最適用于完全填充的永久表,支持處理InnoDB、MyISAM 和ARCHIVE 表,支持分區(qū)表
OPTIMIZE TABLE 選項(xiàng):NO_WRITE_TO_BINLOG 或LOCAL:禁用二進(jìn)制日志。
OPTIMIZE TABLE 特征:
? 碎片整理涉及回收通過刪除和更新產(chǎn)生的未使用空間,以及合并被分隔開的記錄和以非連續(xù)方式存儲(chǔ)的記錄。
? 需要對(duì)表有SELECT 和INSERT 權(quán)限
? 支持分區(qū)表。還可以使用ALTER TABLE...OPTIMIZE PARTITION 檢查一個(gè)或多個(gè)分區(qū)。
例如,修改大量行之后,可以使用OPTIMIZE TABLE 語(yǔ)句在InnoDB 中重構(gòu)一個(gè)FULLTEXT 索引。
對(duì)于InnoDB 表,OPTIMIZE TABLE 將映射到ALTER TABLE,后者將重構(gòu)表以更新索引統(tǒng)計(jì)信息并釋放群集索引中未使用的空間。InnoDB 不會(huì)像其他存儲(chǔ)引擎一樣受碎片影響,因此不需要經(jīng)常使用OPTIMIZE TABLE。
對(duì)使用ARCHIVE 存儲(chǔ)引擎的表使用OPTIMIZE TABLE 可以壓縮該表。由SHOW TABLE STATUS 所報(bào)告的ARCHIVE 表中的行數(shù)始終比較準(zhǔn)確。優(yōu)化操作過程中可能會(huì)出現(xiàn)一個(gè).ARN 文件。
OPTIMIZE TABLE 語(yǔ)句
以下OPTIMIZE TABLE 語(yǔ)句將優(yōu)化mysql 數(shù)據(jù)庫(kù)中兩個(gè)完全填充的表:
mysql> OPTIMIZE TABLE mysql.help_relation, mysql.help_topic;
+---------------------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------------------+----------+----------+----------+
| mysql.help_relation | optimize | status | OK |
| mysql.help_topic | optimize | status | OK |
+---------------------+----------+----------+----------+
2 rows in set (0.00 sec)
對(duì)于MyISAM 表,在刪除表中大量?jī)?nèi)容或者對(duì)包含可變長(zhǎng)度行的表(包含VARCHAR、VARBINARY、BLOB 或TEXT 列的表)進(jìn)行多項(xiàng)更改之后,請(qǐng)使用OPTIMIZE TABLE語(yǔ)句。已刪除的行將保留在鏈接的列表中,而后續(xù)的INSERT 操作將重用之前行的位置。
OPTIMIZE TABLE 對(duì)完全填充的表使用時(shí)效果最佳并且不會(huì)發(fā)生很大更改。如果數(shù)據(jù)更改較多并經(jīng)常需要優(yōu)化,則優(yōu)化的優(yōu)勢(shì)將會(huì)大大降低。
1.1.5. REPAIR TABLE 語(yǔ)句
REPAIR TABLE語(yǔ)句修復(fù)可能已損壞的MyISAM 或ARCHIVE 表,不支持InnoDB,但是支持分區(qū)表;
REPAIR TABLE 選項(xiàng):
? QUICK:僅修復(fù)索引樹,嘗試僅修復(fù)索引文件,而不修復(fù)數(shù)據(jù)文件。此類型的修復(fù)與myisamchk --recover --quick 所執(zhí)行的修復(fù)相似。
? EXTENDED:逐行創(chuàng)建索引(而不是一次性創(chuàng)建有序索引),MySQL 將逐行創(chuàng)建索引,而不是一次性創(chuàng)建有序索引。此類型的修復(fù)與myisamchk --safe-recover 所執(zhí)行的修復(fù)相似。
? USE_FRM:使用.FRM 文件重新創(chuàng)建.MYI 文件,但是不能用于分區(qū)表。
? NO_WRITE_TO_BINLOG 或LOCAL:禁用二進(jìn)制日志。
REPAIR TABLE 特征:
? QUICK 選項(xiàng):嘗試僅修復(fù)索引文件,而不修復(fù)數(shù)據(jù)文件。此類型的修復(fù)與myisamchk --recover --quick 所執(zhí)行的修復(fù)相似。
? EXTENDED 選項(xiàng):MySQL 將逐行創(chuàng)建索引,而不是一次性創(chuàng)建有序索引。此類型的修復(fù)與myisamchk --safe-recover 所執(zhí)行的修復(fù)相似。
? USE_FRM 選項(xiàng)不能用于分區(qū)表。
? 需要對(duì)表有SELECT 和INSERT 權(quán)限
? 支持分區(qū)表。還可以使用ALTER TABLE...REPAIR PARTITION 檢查一個(gè)或多個(gè)分區(qū)。
在執(zhí)行表修復(fù)操作之前,最好對(duì)表進(jìn)行備份;在某些情況下,該操作可能導(dǎo)致數(shù)據(jù)丟失。可能的原因包括(但不僅限于)文件系統(tǒng)錯(cuò)誤。
如果服務(wù)器在REPAIR TABLE 操作過程中崩潰,則為避免進(jìn)一步的損壞,重啟之后應(yīng)立即執(zhí)行另一REPAIR TABLE,然后再執(zhí)行其他任何操作。
如果您經(jīng)常需要使用REPAIR TABLE 從損壞的表進(jìn)行恢復(fù),請(qǐng)嘗試找出根本原因,以防止相應(yīng)損壞并避免使用REPAIR TABLE。
REPAIR TABLE 語(yǔ)句
REPAIR TABLE 語(yǔ)句的示例:
mysql> REPAIR TABLE mysql.help_relation;
+---------------------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------------------+--------+----------+----------+
| mysql.help_relation | repair | status | OK |
+---------------------+--------+----------+----------+
1 row in set (0.00 sec)
1.2. mysqlcheck 客戶機(jī)程序
mysqlcheck是用于檢查、修復(fù)、分析和優(yōu)化表的命令行客戶機(jī);它比發(fā)出SQL 語(yǔ)句更加方便,可以處理InnoDB、MyISAM 和ARCHIVE 表,并且支持三種檢查級(jí)別:特定表、特定數(shù)據(jù)庫(kù)、所有數(shù)據(jù)庫(kù)
部分mysqlcheck 維護(hù)選項(xiàng):
? --analyze:執(zhí)行ANALYZE TABLE。
? --check:執(zhí)行CHECK TABLE(默認(rèn))。
? --optimize:執(zhí)行OPTIMIZE TABLE。
? --repair:執(zhí)行REPAIR TABLE。
在某些情況下,mysqlcheck 比直接發(fā)出SQL 語(yǔ)句更加方便。例如,如果提供數(shù)據(jù)庫(kù)名稱作為其參數(shù),則mysqlcheck 將確定該數(shù)據(jù)庫(kù)所包含的表,并發(fā)出語(yǔ)句處理所有這些表。您不需要提供明確的表名稱作為參數(shù)。此外,由于mysqlcheck 是命令行程序,因此可以在執(zhí)行計(jì)劃維護(hù)的操作系統(tǒng)作業(yè)中輕松使用該程序。
mysqlcheck 客戶機(jī)程序,Oracle 建議首先在不使用任何選項(xiàng)的情況下運(yùn)行mysqlcheck,如果需要修復(fù)再重新運(yùn)行。
部分mysqlcheck 修改選項(xiàng):
? --repair --quick:嘗試快速修復(fù)。
? --repair:正常修復(fù)(如果快速修復(fù)失?。?。
? --repair --force:強(qiáng)制修復(fù)。
mysqlcheck 示例:
shell> mysqlcheck --login-path=admin world_innodb
shell> mysqlcheck -uroot -p mysql user --repair
shell> mysqlcheck -uroot -p --all-databases #將檢查所有數(shù)據(jù)庫(kù)中的所有表
shell> mysqlcheck --login-path=admin --analyze --all-databases
默認(rèn)情況下,mysqlcheck 將其第一個(gè)非選項(xiàng)參數(shù)解釋為數(shù)據(jù)庫(kù)名稱,并檢查該數(shù)據(jù)庫(kù)中的所有表。如果數(shù)據(jù)庫(kù)名稱后面有其他任何參數(shù),則會(huì)將這些參數(shù)視為表名稱,從而只檢查這些表。
1.3. myisamchk 實(shí)用程序
myisamchk 是用于檢查MyISAM 表的非客戶機(jī)實(shí)用程序,與mysqlcheck 類似,其差異是myisamchk可以啟用或禁用索引,直接(而不是通過服務(wù)器)訪問表文件,這可以避免并發(fā)表訪問。
部分myisamchk 選項(xiàng):
? --recover:修復(fù)表。
? --safe-recover:修復(fù)--recover 無(wú)法修復(fù)的表。
myisamchk 示例:
shell> myisamchk /var/lib/mysql/mysql/help_topic
shell> myisamchk help_category.MYI
shell> myisamchk --recover help_keyword
從理論上來(lái)看,myisamchk 與mysqlcheck 具有相似的用途。但是,myisamchk 不與MySQL 服務(wù)器通信,而是直接訪問表文件。
如何在使用myisamchk 執(zhí)行表維護(hù)的同時(shí)避免并發(fā)表訪問?
A. 確保服務(wù)器不會(huì)訪問正在進(jìn)行處理的表。一種實(shí)現(xiàn)方法是鎖定表或停止服務(wù)器。
B. 在命令提示符中,將位置更改為表所在的數(shù)據(jù)庫(kù)目錄。這是服務(wù)器數(shù)據(jù)目錄的子目錄,該目錄的名稱與要檢查的表所在的數(shù)據(jù)庫(kù)名稱相同。(更改位置是為了更加便于引用表文件??梢蕴^此步驟,但myisamchk 必須包含表所在的目錄。)
C. 調(diào)用myisamchk,使用選項(xiàng)指示要執(zhí)行的操作,后跟參數(shù)以指定myisamchk 應(yīng)對(duì)其執(zhí)行操作的表。這些參數(shù)可以是表名稱,也可以是表的索引文件的文件名。索引文件名與表名稱相同,包含.MYI 后綴。因此,可以通過table_name 或table_name.MYI 引用表。
D. 重新啟動(dòng)服務(wù)器。
注:請(qǐng)首先嘗試--recover,因?yàn)?-safe-recover 比較慢。
mysqlcheck 和myisamchk 的用于控制所執(zhí)行的維護(hù)類型的選項(xiàng):
mysqlcheck 和myisamchk 均使用多個(gè)選項(xiàng)來(lái)控制所執(zhí)行的表維護(hù)操作的類型。上表匯總了一些最常用的選項(xiàng),其中大多數(shù)選項(xiàng)同時(shí)適用于兩個(gè)程序。如果不是同時(shí)適用于兩個(gè)程序,會(huì)記錄在相關(guān)的選項(xiàng)說明中。
? --analyze:分析表中鍵值的分布。通過加快基于索引的查找,這可以提高查詢的性能。
? --auto-repair:如果檢查操作發(fā)現(xiàn)了問題,則自動(dòng)修復(fù)出現(xiàn)問題的表。
? --check 或-c:檢查表中是否存在問題。如果未指定其他任何操作,則為默認(rèn)操作。
? --check-only-changed 或-C:跳過表檢查(自上一次檢查后已更改的表或未正常關(guān)閉的表除外)。如果服務(wù)器在表打開時(shí)崩潰,則會(huì)出現(xiàn)后一種情況。
? --fast 或-F:跳過表檢查(未正常關(guān)閉的表除外)。
? --extended、--extend-check 或-e:運(yùn)行擴(kuò)展表檢查。對(duì)于mysqlcheck,將此選項(xiàng)與修復(fù)選項(xiàng)結(jié)合使用時(shí),將執(zhí)行比單獨(dú)使用修復(fù)選項(xiàng)時(shí)更徹底的修復(fù)。即,--repair --extended 執(zhí)行的修復(fù)操作比--repair 執(zhí)行的操作更徹底。
? --medium-check 或-m:運(yùn)行中等表檢查。
? --quick 或-q:對(duì)于mysqlcheck,不包含修復(fù)選項(xiàng)的--quick 會(huì)導(dǎo)致只檢查索引文件,而不檢查數(shù)據(jù)文件。對(duì)于這兩個(gè)程序,將--quick 與修復(fù)選項(xiàng)結(jié)合使用都會(huì)導(dǎo)致程序只修復(fù)索引文件,而不修復(fù)數(shù)據(jù)文件。
? --repair、--recover 或-r:運(yùn)行表修復(fù)操作。
1.4. InnoDB 表維護(hù)
出現(xiàn)故障之后,InnoDB 將自動(dòng)恢復(fù)。使用CHECK TABLE 或客戶機(jī)程序可找出不一致、不兼容和其他問題。也可通過使用mysqldump 對(duì)表進(jìn)行轉(zhuǎn)儲(chǔ)來(lái)恢復(fù)該表:
shell> mysqldump <db_name> <table_name> > <dump_file>
然后,刪除該表并從轉(zhuǎn)儲(chǔ)文件重新創(chuàng)建。
shell> mysql <db_name> < <dump_file>
要在崩潰后修復(fù)表,請(qǐng)使用--innodb_force_recovery 選項(xiàng)重新啟動(dòng)服務(wù)器或者從備份中恢復(fù)表。使用ALTER TABLE 進(jìn)行優(yōu)化時(shí),將重構(gòu)表并釋放群集索引中未使用的空間。
如果表檢查表明存在問題,請(qǐng)通過使用mysqldump 轉(zhuǎn)儲(chǔ)該表、刪除該表并從轉(zhuǎn)儲(chǔ)文件重新創(chuàng)建該表來(lái)將其恢復(fù)到一致狀態(tài)。
如果MySQL 服務(wù)器或其運(yùn)行主機(jī)崩潰,則某些InnoDB 表可能處于不一致狀態(tài)。在InnoDB 的啟動(dòng)序列中,會(huì)執(zhí)行自動(dòng)恢復(fù)。服務(wù)器很少因?yàn)樽詣?dòng)恢復(fù)故障而無(wú)法啟動(dòng)。如果出現(xiàn)此情況,請(qǐng)使用以下過程:
A. 重新啟動(dòng)服務(wù)器,將--innodb_force_recovery 選項(xiàng)的值設(shè)置為1 到6 之間的值。這些值表示增加警告級(jí)別以避免崩潰,以及針對(duì)已恢復(fù)的表中可能存在的不一致狀況增加容錯(cuò)級(jí)別。最好從值4 開始,該值可以阻止插入緩沖區(qū)合并操作。
B. 當(dāng)在--innodb_force_recovery 設(shè)置為非零值的情況下啟動(dòng)服務(wù)器時(shí),InnoDB將阻止INSERT、UPDATE 或DELETE 操作。因此,您應(yīng)轉(zhuǎn)儲(chǔ)InnoDB 表,然后在該選項(xiàng)生效時(shí)將這些表刪除。再在不使用--innodb_force_recovery 選項(xiàng)的情況下重新啟動(dòng)服務(wù)器。服務(wù)器啟動(dòng)之后,將從轉(zhuǎn)儲(chǔ)文件恢復(fù)InnoDB 表。
C. 如果前述步驟失敗,則從前一個(gè)備份恢復(fù)表。
訪問http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html 了解有關(guān)對(duì)損壞的數(shù)據(jù)庫(kù)啟動(dòng)InnoDB 的更多信息。
1.5. MyISAM 表維護(hù)
MyISAM 表維護(hù)對(duì)于動(dòng)態(tài)格式表和靜態(tài)格式表,默認(rèn)的CHECK TABLE 檢查類型均為MEDIUM。如果將靜態(tài)格式表類型設(shè)置為CHANGED 或FAST,則默認(rèn)選項(xiàng)為QUICK。對(duì)于CHANGED 和FAST,將跳過行掃描,因?yàn)檫@些行很少損壞。如果表被標(biāo)記為“已損壞”或“未正常關(guān)閉”,則CHECK TABLE 將更改表。如果未在表中發(fā)現(xiàn)任何問題,則會(huì)將表的狀態(tài)標(biāo)記為“最新”。如果表已損壞,則問題最有可能存在于索引而不是數(shù)據(jù)中。
shell> myisamchk --medium-check <table_name>
設(shè)置服務(wù)器以運(yùn)行檢查并自動(dòng)修復(fù)表。使用--myisam-recover 選項(xiàng)啟用自動(dòng)修復(fù)。服務(wù)器將在啟動(dòng)之后第一次訪問每個(gè)MyISAM 表時(shí)進(jìn)行檢查,以確保這些表前一次正確關(guān)閉。
--myisam-recover 選項(xiàng)值可以包含以逗號(hào)分隔的值列表,由以下一個(gè)或多個(gè)值組成:
? DEFAULT:默認(rèn)檢查。
? BACKUP:指示服務(wù)器對(duì)必須進(jìn)行更改的所有表進(jìn)行備份。
? FORCE:執(zhí)行表恢復(fù),即使可能導(dǎo)致多行數(shù)據(jù)丟失也是如此。
? QUICK:執(zhí)行快速恢復(fù)?;謴?fù)將跳過一些不包含因刪除或更新而產(chǎn)生的行間隔(也稱為“洞”)的表。
強(qiáng)制從config 文件恢復(fù)MyISAM 表情況。例如,要指示服務(wù)器對(duì)發(fā)現(xiàn)問題的MyISAM 表執(zhí)行強(qiáng)制恢復(fù),但同時(shí)要備份其更改的所有表,請(qǐng)向選項(xiàng)文件中添加以下內(nèi)容:
[mysqld]
myisam-recover=FORCE,BACKUP
1.6. MEMORY 表維護(hù)
使用DELETE...WHERE 語(yǔ)句刪除多個(gè)行時(shí),MEMORY 表不會(huì)釋放內(nèi)存。要釋放內(nèi)存,必須執(zhí)行空值A(chǔ)LTER TABLE 操作。
1.7. ARCHIVE 表維護(hù)
ARCHIVE表在插入表行時(shí)將對(duì)其進(jìn)行壓縮,檢索時(shí),將根據(jù)需要對(duì)行進(jìn)行解壓縮。一些SELECT 語(yǔ)句可能會(huì)減弱壓縮功能。使用OPTIMIZE TABLE 或REPAIR TABLE 可以實(shí)現(xiàn)更好的壓縮,但只在未對(duì)表進(jìn)行訪問(讀或?qū)懀r(shí),OPTIMIZE TABLE有效。
以上是“MySQL如何實(shí)現(xiàn)表維護(hù)”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。