共計(jì) 10719 個(gè)字符,預(yù)計(jì)需要花費(fèi) 27 分鐘才能閱讀完成。
這篇文章主要介紹 MySQL 如何實(shí)現(xiàn)表維護(hù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
表維護(hù)
為什么要做表維護(hù)操作,解決什么問題?
兩種情況下需要做表維護(hù)操作,一是由于服務(wù)器崩潰而導(dǎo)致表損壞,二是對(duì)表的查詢處理速度較慢的情況;
執(zhí)行表維護(hù)工具主要有 MySQL Workbench、MySQL Enterprise Monitor、SQL (DML)
維護(hù)語句、mysqlcheck、myisamchk;下面就逐一介紹這些工具;
1.1.
表維護(hù) SQL 語句
用于執(zhí)行表維護(hù)的 SQL 語句有:ANALYZE TABLE(更新索引統(tǒng)計(jì)信息)、CHECK TABLE(徹底檢查完整性)、CHECKSUM TABLE(徹底檢查完整性)、REPAIR TABLE(修復(fù))、OPTIMIZE TABLE(優(yōu)化),每個(gè)語句均包含一個(gè)或多個(gè)表名稱和可選的關(guān)鍵字。維護(hù)語句和輸出的示例:
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
語句
ANALYZE TABLE
語句分析并存儲(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ì)信息來確定優(yōu)化程序聯(lián)接表的順序。此外,鍵分布確定了 MySQL
用于查詢中的特定表的索引。
您可以執(zhí)行 ANALYZE TABLE
語句來分析并存儲(chǔ)統(tǒng)計(jì)信息,或者配置 InnoDB,以便在大量數(shù)據(jù)發(fā)生更改之后或者在查詢表或索引元數(shù)據(jù)時(shí)自動(dòng)收集統(tǒng)計(jì)信息。
ANALYZE TABLE
特征:
l
在分析過程中,對(duì)于 InnoDB
和 MyISAM,MySQL
使用讀取鎖來鎖定表。
l
此語句等效于使用 mysqlcheck –analyze。
l
需要對(duì)表有 SELECT
和 INSERT
權(quán)限。
l
支持分區(qū)表。還可以使用 ALTER TABLE…ANALYZE PARTITION
檢查一個(gè)或多個(gè)分區(qū)。
如果自從運(yùn)行上一個(gè) ANALYZE TABLE
語句后表未發(fā)生任何更改,則 MySQL
不會(huì)分析該表。默認(rèn)情況下,MySQL
會(huì)將 ANALYZE TABLE
語句寫入二進(jìn)制日志并將這些語句復(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
語句時(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
表的索引頁樣例(而并非整個(gè)表)重新計(jì)算統(tǒng)計(jì)信息。默認(rèn)情況下,將讀取 20
頁樣例。增大此數(shù)字可提高所生成的統(tǒng)計(jì)信息和查詢計(jì)劃的質(zhì)量。降低此數(shù)字可減少用于生成統(tǒng)計(jì)信息的 I /O
成本。
l
innodb_stats_transient_sample_pages:此選項(xiàng)用于控制對(duì)沒有 STATS_PERSISTENT
設(shè)置的表的抽樣索引頁數(shù)量。
以下選項(xiàng)用于控制 MySQL
自動(dòng)收集統(tǒng)計(jì)信息的方式。
l
innodb_stats_auto_recalc:啟用此選項(xiàng)時(shí),如果 STATS_PERSISTENT
表中 10%
的行自前一次重新計(jì)算后有所變化,則 MySQL
將自動(dòng)為該表生成統(tǒng)計(jì)信息。
l
innodb_stats_on_metadata:啟用此選項(xiàng)可在執(zhí)行元數(shù)據(jù)語句(如 SHOW TABLE STATUS)或查詢 INFORMATION_SCHEMA.TABLES
時(shí)更新統(tǒng)計(jì)信息。默認(rèn)情況下,此選項(xiàng)處于禁用狀態(tài)。
1.1.2.
CHECK TABLE
語句
ANALYZE TABLE
語句檢查表結(jié)構(gòu)的完整性,并檢查內(nèi)容中是否包含錯(cuò)誤,驗(yàn)證視圖定義,
支持分區(qū)表,處理 InnoDB、CSV、MyISAM
和 ARCHIVE
表
CHECK TABLE
選項(xiàng):
?
FOR UPGRADE:檢查表是否適用于當(dāng)前服務(wù)器。
?
QUICK:不掃描行來檢查錯(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
語句
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
語句檢測硬件問題(如內(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
語句
CHECKSUM TABLE
語句報(bào)告表 checksum,用于驗(yàn)證表的內(nèi)容在備份、回滾或其他操作前后是否相同;
CHECKSUM TABLE
語句逐行讀取整個(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
語句的示例:
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)?CHECKSUM TABLE
使用的散列函數(shù)無法保證不沖突,所以存在兩個(gè)不同的表生成相同 checksum
的微弱可能性。
1.1.4.
OPTIMIZE TABLE
語句
OPTIMIZE TABLE
語句通過對(duì)表進(jìn)行碎片整理來清理表,即通過重新構(gòu)建表并釋放未使用的空間對(duì)表進(jìn)行碎片整理;OPTIMIZE TABLE
語句在優(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
語句在 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
語句
以下 OPTIMIZE TABLE
語句將優(yōu)化 mysql
數(shù)據(jù)庫中兩個(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
表,在刪除表中大量內(nèi)容或者對(duì)包含可變長度行的表(包含 VARCHAR、VARBINARY、BLOB
或 TEXT
列的表)進(jìn)行多項(xiàng)更改之后,請(qǐng)使用 OPTIMIZE TABLE 語句。已刪除的行將保留在鏈接的列表中,而后續(xù)的 INSERT
操作將重用之前行的位置。
OPTIMIZE TABLE
對(duì)完全填充的表使用時(shí)效果最佳并且不會(huì)發(fā)生很大更改。如果數(shù)據(jù)更改較多并經(jīng)常需要優(yōu)化,則優(yōu)化的優(yōu)勢將會(huì)大大降低。
1.1.5.
REPAIR TABLE
語句
REPAIR TABLE 語句修復(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
語句
REPAIR TABLE
語句的示例:
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
語句更加方便,可以處理 InnoDB、MyISAM
和 ARCHIVE
表,并且支持三種檢查級(jí)別:特定表、特定數(shù)據(jù)庫、所有數(shù)據(jù)庫
部分 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
語句更加方便。例如,如果提供數(shù)據(jù)庫名稱作為其參數(shù),則 mysqlcheck
將確定該數(shù)據(jù)庫所包含的表,并發(fā)出語句處理所有這些表。您不需要提供明確的表名稱作為參數(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ù)庫中的所有表
shell mysqlcheck –login-path=admin –analyze –all-databases
默認(rèn)情況下,mysqlcheck
將其第一個(gè)非選項(xiàng)參數(shù)解釋為數(shù)據(jù)庫名稱,并檢查該數(shù)據(jù)庫中的所有表。如果數(shù)據(jù)庫名稱后面有其他任何參數(shù),則會(huì)將這些參數(shù)視為表名稱,從而只檢查這些表。
1.3.
myisamchk
實(shí)用程序
myisamchk
是用于檢查 MyISAM
表的非客戶機(jī)實(shí)用程序,與 mysqlcheck
類似,其差異是 myisamchk 可以啟用或禁用索引,直接(而不是通過服務(wù)器)訪問表文件,這可以避免并發(fā)表訪問。
部分 myisamchk
選項(xiàng):
?
–recover:修復(fù)表。
?
–safe-recover:修復(fù) –recover
無法修復(fù)的表。
myisamchk
示例:
shell myisamchk /var/lib/mysql/mysql/help_topic
shell myisamchk help_category.MYI
shell myisamchk –recover help_keyword
從理論上來看,myisamchk
與 mysqlcheck
具有相似的用途。但是,myisamchk
不與 MySQL
服務(wù)器通信,而是直接訪問表文件。
如何在使用 myisamchk
執(zhí)行表維護(hù)的同時(shí)避免并發(fā)表訪問?
A.
確保服務(wù)器不會(huì)訪問正在進(jìn)行處理的表。一種實(shí)現(xiàn)方法是鎖定表或停止服務(wù)器。
B.
在命令提示符中,將位置更改為表所在的數(shù)據(jù)庫目錄。這是服務(wù)器數(shù)據(jù)目錄的子目錄,該目錄的名稱與要檢查的表所在的數(shù)據(jù)庫名稱相同。(更改位置是為了更加便于引用表文件。可以跳過此步驟,但 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)來控制所執(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ǔ)來恢復(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)建該表來將其恢復(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ù)故障而無法啟動(dòng)。如果出現(xiàn)此情況,請(qǐng)使用以下過程:
A.
重新啟動(dòng)服務(wù)器,將 –innodb_force_recovery
選項(xiàng)的值設(shè)置為 1
之間的值。這些值表示增加警告級(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ù)庫啟動(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
語句刪除多個(gè)行時(shí),MEMORY
表不會(huì)釋放內(nèi)存。要釋放內(nèi)存,必須執(zhí)行空值 ALTER TABLE
操作。
1.7.
ARCHIVE
表維護(hù)
ARCHIVE 表在插入表行時(shí)將對(duì)其進(jìn)行壓縮,檢索時(shí),將根據(jù)需要對(duì)行進(jìn)行解壓縮。一些 SELECT
語句可能會(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)注丸趣 TV 行業(yè)資訊頻道!