久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

共計(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é)果集形式顯示:


Table:指示對(duì)其執(zhí)行操作的表


Op:指出操作(檢查、修復(fù)、分析或優(yōu)化)


Msg_type:指示成功或失敗


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
特征:


在分析過程中,對(duì)于 InnoDB
和 MyISAM,MySQL
使用讀取鎖來鎖定表。


此語句等效于使用 mysqlcheck –analyze。


需要對(duì)表有 SELECT
和 INSERT
權(quán)限。


支持分區(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ì)信息的方式:


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ì)劃。


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
成本。


innodb_stats_transient_sample_pages:此選項(xiàng)用于控制對(duì)沒有 STATS_PERSISTENT
設(shè)置的表的抽樣索引頁數(shù)量。

以下選項(xiàng)用于控制 MySQL
自動(dòng)收集統(tǒng)計(jì)信息的方式。


innodb_stats_auto_recalc:啟用此選項(xiàng)時(shí),如果 STATS_PERSISTENT
表中 10%
的行自前一次重新計(jì)算后有所變化,則 MySQL
將自動(dòng)為該表生成統(tǒng)計(jì)信息。


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è)資訊頻道!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-27發(fā)表,共計(jì)10719字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒有評(píng)論)
主站蜘蛛池模板: 卓尼县| 定西市| 蓬莱市| 福建省| 西乌珠穆沁旗| 三台县| 大理市| 大足县| 绵竹市| 长垣县| 沁源县| 宜宾县| 开封县| 华池县| 武乡县| 静安区| 灌阳县| 定兴县| 深圳市| 印江| 辽宁省| 吴江市| 西昌市| 崇州市| 都江堰市| 泾川县| 宜君县| 中宁县| 石阡县| 宝兴县| 新乡市| 阿荣旗| 轮台县| 禄劝| 保山市| 文成县| 河东区| 阳江市| 吕梁市| 廉江市| 乌鲁木齐县|