溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL如何實(shí)現(xiàn)表維護(hù)

發(fā)布時(shí)間:2021-11-01 09:36:39 來(lái)源:億速云 閱讀:101 作者:小新 欄目:MySQL數(shù)據(jù)庫(kù)

這篇文章主要介紹MySQL如何實(shí)現(xiàn)表維護(hù),文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

表維護(hù)

為什么要做表維護(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è)資訊頻道!

向AI問一下細(xì)節(jié)

免責(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)容。

AI