最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
怎么修復(fù)破損mysql表 mysql 修復(fù)數(shù)據(jù)表

MySQL損壞數(shù)據(jù)恢復(fù)

mysql CREATE DATABASE sakila;

創(chuàng)新互聯(lián)公司長期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為萬州企業(yè)提供專業(yè)的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作,萬州網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

mysql USE sakila;

mysql CREATE TABLE actor (

? ? actor_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,

? ? first_name VARCHAR(45) NOT NULL,

? ? last_name VARCHAR(45) NOT NULL,

? ? last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

? ? PRIMARY KEY? (actor_id),

? ? KEY idx_actor_last_name (last_name)

? )ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE {庫名}.{表名} DISCARD TABLESPACE;

例:

mysql ALTER TABLE sakila.actor DISCARD TABLESPACE;

cp /backup_directory/actor.ibd path/to/mysql-5.7/data/sakila/

ALTER TABLE {庫名}.{表名} IMPORT TABLESPACE;SHOW WARNINGS;

例:

mysql ALTER TABLE sakila.actor IMPORT TABLESPACE; SHOW WARNINGS;

Query OK, 0 rows affected, 1 warning (0.15 sec)

Warning | 1810 | InnoDB: IO Read error: (2, No such file or directory)

Error opening './sakila/actor.cfg', will attempt to import

without schema verification

mysql SELECT COUNT(*) FROM sakila.actor;

+----------+

| count(*) |

+----------+

|? ? ? 200 |

+----------+

MySQL崩潰-修復(fù)損壞的innodb:innodb_force_recovery

Windows上安裝了XMAPP-controller之后間歇性出現(xiàn)MySQL無法啟動,查看日之后發(fā)現(xiàn)是innodb的報(bào)錯,報(bào)錯信息如下:

度娘上各種答案無法解決,后來直接看官方文檔,直接上解決方案:

踩坑指南 - - 操作配置前需要做這些操作:

1、配置my.cnf 配置innodb_force_recovery = 1 到 6 試到正確為止,重啟MySQL

2、導(dǎo)出數(shù)據(jù)腳本 mysqldump -uroot -p123456 test test.sql 導(dǎo)出SQL腳本?;蛘哂肗avicat將所有數(shù)據(jù)庫/表導(dǎo)入到其他服務(wù)器的數(shù)據(jù)庫中。 注意:這里的數(shù)據(jù)一定要備份成功。然后刪除原數(shù)據(jù)庫中的數(shù)據(jù)。

3、刪除ib_logfile0、ib_logfile1、ibdata1 備份MySQL數(shù)據(jù)目錄下的ib_logfile0、ib_logfile1、ibdata1三個文件,然后將這三個文件刪除

4、配置my.cnf 將my.cnf中innodb_force_recovery 這行配置刪除或者配置為innodb_force_recovery = 0,重啟MySQL服務(wù)

5、將數(shù)據(jù)導(dǎo)入MySQL數(shù)據(jù)庫 mysql -uroot -p123456 test test.sql;

或者用Navicat將備份的數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫中。 如果在導(dǎo)入數(shù)據(jù)過程中發(fā)生tablespace不存在的問題,請刪除data目錄相應(yīng)database下的文件。

面試官:MySQL權(quán)限表損壞導(dǎo)致無法啟動怎么辦?

一、背景

近期,公司RDS云產(chǎn)品的MySQL Server版本進(jìn)行升級,由目前使用的5.7.26版本升級到最新版本5.7.31;升級后測試同學(xué)發(fā)現(xiàn):在MySQL創(chuàng)建用戶后,5.7.31版本重新啟動集群會出現(xiàn)啟動失敗的現(xiàn)象;而5.7.26版本在相同測試場景下是正常啟動的。這到底是為什么呢?

二、問題復(fù)現(xiàn)

2.1 實(shí)驗(yàn)環(huán)境

2.2 操作步驟

按照測試同學(xué)的測試步驟,首先創(chuàng)建一個用戶:

然后關(guān)閉mysqld;這里需要介紹一下,我們集群的關(guān)閉方式是如下方式:

這種方式的內(nèi)部實(shí)現(xiàn)類似于kill -9模式。所以我在線下環(huán)境使用kill -9的方式來復(fù)現(xiàn),操作如下:

然后重啟mysqld,操作如下:

此時問題復(fù)現(xiàn)了,mysqld啟動失敗,我們查看了下error日志,信息如下:

根據(jù)報(bào)錯信息可以看出:MySQL的權(quán)限系統(tǒng)表發(fā)生了損壞,導(dǎo)致了mysqld啟動失??;由于在MySQL 5.7及其之前版本該表是MyISAM引擎,且該引擎不支持事務(wù),所以在mysqld異常崩潰會導(dǎo)致該類型引擎表的損壞;但在mysqld啟動時是有參數(shù)控制MyISAM引擎的恢復(fù)模式,且該參數(shù)在我們產(chǎn)品中也配置到了my.cnf中,如下所示:

2.3 參數(shù)解析

對于該參數(shù)的官方文檔的解釋如下:

設(shè)置MyISAM存儲引擎恢復(fù)模式。選項(xiàng)值是OFF、DEFAULT、BACKUP、FORCE或QUICK的值的任意組合。如果指定多個值,請用逗號分隔。指定不帶參數(shù)的選項(xiàng)與指定DEFAULT相同,指定顯式值" "將禁用恢復(fù)(與OFF值相同)。如果啟用了恢復(fù),則mysqld每次打開MyISAM表時,都會檢查該表是否標(biāo)記為已崩潰或未正確關(guān)閉。(只有在禁用外部鎖定的情況下運(yùn)行,最后一個選項(xiàng)才起作用。)在這種情況下,mysqld在表上運(yùn)行檢查。如果表已損壞,mysqld將嘗試對其進(jìn)行修復(fù)。

服務(wù)器自動修復(fù)表之前,它將有關(guān)修復(fù)的注釋寫到錯誤日志中。如果您希望能夠在無需用戶干預(yù)的情況下從大多數(shù)問題中恢復(fù),則應(yīng)使用選項(xiàng)BACKUP,F(xiàn)ORCE。即使某些行將被刪除,這也會強(qiáng)制修復(fù)表,但是它將舊的數(shù)據(jù)文件保留為備份,以便您以后可以檢查發(fā)生了什么。

全局變量,只讀變量,默認(rèn)為OFF。

三、問題修復(fù)

這類MySQL用戶表損耗的問題解決方式也是有多種,我這里列舉其中一種:

(1)my.cnf中的[mysqld]標(biāo)簽下添加skip_grant_tables,啟動時跳過加載系統(tǒng)字典。

(2)重啟mysqld,然后修復(fù)mysql schema下的所有表。

(3)在[mysqld]標(biāo)簽下注釋或刪除掉skip_grant_tables,然后重啟mysqld。

此時mysqld是可以正常啟動的,無異常。

四、深入排查

在產(chǎn)品化中,以上修復(fù)方式很不優(yōu)雅,只是作為臨時的解決方案;并且也存在一些令人疑惑的點(diǎn):

帶著這些疑問,我們繼續(xù)排查出現(xiàn)該現(xiàn)象的原因;此時Google也沒有找到一些有效的信息,那么只能通過MySQL源代碼來尋找一些答案。

首先需要下載mysql 5.7.31版本的源代碼,并搭建mysql debug環(huán)境;具體步驟可以自動Google搜索一下,本文就不再贅述了。

在源代碼中搜索一下關(guān)鍵詞,用于打斷點(diǎn)的位置,然后進(jìn)行調(diào)試:

定位到相關(guān)代碼,大概是sql/mysqld.cc的4958行,且存在if條件判斷,此時我們開始調(diào)試:

通過以上調(diào)試信息,可以判斷出acl_init函數(shù)返回的值為真;此時我們查看該函數(shù)的代碼 (sql/auth/sql_auth_cache.cc:1365):

根據(jù)該函數(shù)的注釋發(fā)現(xiàn):該函數(shù)是初始化負(fù)責(zé)用戶/數(shù)據(jù)庫級特權(quán)檢查的結(jié)構(gòu),并從mysql schema中的表中為其加載特權(quán)信息;且return值為1代表的是初始化權(quán)限失敗。

此后開始逐步調(diào)試,觀察return相關(guān)信息,當(dāng)調(diào)試到lock_table_names函數(shù)時,我們發(fā)現(xiàn)在Phase 3時return值為true,且根據(jù)代碼注釋發(fā)現(xiàn)true代表是Failure;具體代碼如下(sql/sql_base.cc:5549):

調(diào)試信息如下:

可以看到flags的值為0,而MYSQL_OPEN_SKIP_SCOPED_MDL_LOCK為宏定義值0x1000,與flags的值 做按位與操作,結(jié)果自然也是0,當(dāng)然MYSQL_LOCK_IGNORE_GLOBAL_READ_ONLY也是如此;need_global_read_lock_protection是bool類型值,代表是否需要全局讀鎖的保護(hù),這個值是在table- mdl_request.type不為MDL_SHARED_READ_ONLY發(fā)生改變;check_readonly函數(shù)相關(guān)信息 下面概述。

此時也查看了下MySQL 5.7.26版本代碼作為對比,發(fā)現(xiàn)lock_table_names函數(shù)下的Phase 3后的部分代 碼是在5.7.29版本后新增的。如果是git clone的MySQL代碼可以用git blame命令查詢文件變化的信息:

上述展示的信息中,最左側(cè)的列值為commit id為05824063和0405ebee,有興趣的同學(xué)可以詳細(xì)看下。

此功能解決的問題是 BUG#28438114: SET READ_ONLY=1 SOMETIMES DOESN'T BLOCK CONCURRENT DDL.;當(dāng)然這個代碼的變更功能也在5.7 Release Notes中有所體現(xiàn),如下所示( m/doc/relnotes/mysql/5.7/en/news-5-7-29.html ):

最后我們再查看下check_readonly函數(shù),該函數(shù)是基于read_only和super_read_only狀態(tài)執(zhí)行標(biāo)準(zhǔn)化檢查,是禁止(TRUE)還是允許(FALSE)操作。代碼如下(sql/auth/sql_authorization.cc:489):

此時第一反應(yīng)就是去檢查my.cnf中是否包含read_only相關(guān)參數(shù),檢查之后發(fā)現(xiàn)確實(shí)是使用了該參數(shù), 如下:

此時注釋掉該參數(shù),然后再次啟動mysqld,發(fā)現(xiàn)MyISAM表可以自動修復(fù),且正常啟動;error log信息如下:

由于docker一些限制,我們在mysqld啟動會涉及兩次;所以解決該問題的方式為:第一次mysqld的啟動時先關(guān)閉read_only參數(shù),第二次啟動時開啟read_only參數(shù)。之所以選擇默認(rèn)開啟read_only參數(shù), 是為了避免在mysqld啟動后,選主邏輯未完成時的保護(hù)措施;當(dāng)然選主完成后,會自動對master執(zhí)行 set global read_only=0 操作。

五、總結(jié)

六、附錄

調(diào)試的棧幀信息如下,有興趣的小伙伴可以研究下:

熟悉MySQL體系結(jié)構(gòu)和innodb存儲引擎工作原理;以及MySQL備份恢復(fù)、復(fù)制、數(shù)據(jù)遷移等技術(shù);專注于MySQL、MariaDB開源數(shù)據(jù)庫,喜好開源技術(shù)。

原文鏈接:

如何處理mysql中表損壞問題

5.9.4. 表維護(hù)和崩潰恢復(fù)

后面幾節(jié)討論如何使用myisamchk來檢查或維護(hù)MyISAM表(對應(yīng).MYI和.MYD文件的表)。

你可以使用myisamchk實(shí)用程序來獲得有關(guān)你的數(shù)據(jù)庫表的信息或檢查、修復(fù)、優(yōu)化他們。下列小節(jié)描述如何調(diào)用myisamchk(包括它的選項(xiàng)的描述),如何建立表的維護(hù)計(jì)劃,以及如何使用myisamchk執(zhí)行各種功能。

盡管用myisamchk修復(fù)表很安全,在修復(fù)(或任何可以大量更改表的維護(hù)操作)之前先進(jìn)行備份也是很好的習(xí)慣

影響索引的myisamchk操作會使ULLTEXT索引用full-text參數(shù)重建,不再與MySQL服務(wù)器使用的值兼容。要想避免,請閱讀5.9.5.1節(jié),“用于myisamchk的一般選項(xiàng)”的說明。

在許多情況下,你會發(fā)現(xiàn)使用SQL語句實(shí)現(xiàn)MyISAM表的維護(hù)比執(zhí)行myisamchk操作要容易地多:

· 要想檢查或維護(hù)MyISAM表,使用CHECK TABLE或REPAIR TABLE。

· 要想優(yōu)化MyISAM表,使用OPTIMIZE TABLE。

· 要想分析MyISAM表,使用ANALYZE TABLE。

可以直接這些語句,或使用mysqlcheck客戶端程序,可以提供命令行接口。

這些語句比myisamchk有利的地方是服務(wù)器可以做任何工作。使用myisamchk,你必須確保服務(wù)器在同一時間不使用表。否則,myisamchk和服務(wù)器之間會出現(xiàn)不期望的相互干涉。

5.9.5. myisamchk:MyISAM表維護(hù)實(shí)用工具

5.9.5.1. 用于myisamchk的一般選項(xiàng)

5.9.5.2. 用于myisamchk的檢查選項(xiàng)

5.9.5.3. myisamchk的修復(fù)選項(xiàng)

5.9.5.4. 用于myisamchk的其它選項(xiàng)

5.9.5.5. myisamchk內(nèi)存使用

5.9.5.6. 將myisamchk用于崩潰恢復(fù)

5.9.5.7. 如何檢查MyISAM表的錯誤

5.9.5.8. 如何修復(fù)表

5.9.5.9. 表優(yōu)化

可以使用myisamchk實(shí)用程序來獲得有關(guān)數(shù)據(jù)庫表的信息或檢查、修復(fù)、優(yōu)化他們。myisamchk適用MyISAM表(對應(yīng).MYI和.MYD文件的表)。

調(diào)用myisamchk的方法:

shell myisamchk [options] tbl_name ...

options指定你想讓myisamchk做什么。在后面描述它們。還可以通過調(diào)用myisamchk --help得到選項(xiàng)列表。

tbl_name是你想要檢查或修復(fù)的數(shù)據(jù)庫表。如果你不在數(shù)據(jù)庫目錄的某處運(yùn)行myisamchk,你必須指定數(shù)據(jù)庫目錄的路徑,因?yàn)閙yisamchk不知道你的數(shù)據(jù)庫位于哪兒。實(shí)際上,myisamchk不在乎你正在操作的文件是否位于一個數(shù)據(jù)庫目錄;你可以將對應(yīng)于數(shù)據(jù)庫表的文件拷貝到別處并且在那里執(zhí)行恢復(fù)操作。

如果你愿意,可以用myisamchk命令行命名幾個表。還可以通過命名索引文件(用“ .MYI”后綴)來指定一個表。它允許你通過使用模式“*.MYI”指定在一個目錄所有的表。例如,如果你在數(shù)據(jù)庫目錄,可以這樣在目錄下檢查所有的MyISAM表:

shell myisamchk *.MYI

如果你不在數(shù)據(jù)庫目錄下,可通過指定到目錄的路徑檢查所有在那里的表:

shell myisamchk /path/to/database_dir/*.MYI

你甚至可以通過為MySQL數(shù)據(jù)目錄的路徑指定一個通配符來檢查所有的數(shù)據(jù)庫中的所有表:

shell myisamchk /path/to/datadir/*/*.MYI

推薦的快速檢查所有MyISAM表的方式是:

shell myisamchk --silent --fast /path/to/datadir/*/*.MYI

如果你想要檢查所有MyISAM表并修復(fù)任何破壞的表,可以使用下面的命令:

shell myisamchk --silent --force --fast --update-state \

-O key_buffer=64M -O sort_buffer=64M \

-O read_buffer=1M -O write_buffer=1M \

/path/to/datadir/*/*.MYI

該命令假定你有大于64MB的自由內(nèi)存。關(guān)于用myisamchk分配內(nèi)存的詳細(xì)信息,參見5.9.5.5節(jié),“myisamchk內(nèi)存使用”。

當(dāng)你運(yùn)行myisamchk時,必須確保其它程序不使用表。否則,當(dāng)你運(yùn)行myisamchk時,會顯示下面的錯誤消息:

warning: clients are using or haven't closed the table properly

這說明你正嘗試檢查正被另一個還沒有關(guān)閉文件或已經(jīng)終止而沒有正確地關(guān)閉文件的程序(例如mysqld服務(wù)器)更新的表。

如果mysqld正在運(yùn)行,你必須通過FLUSH TABLES強(qiáng)制清空仍然在內(nèi)存中的任何表修改。當(dāng)你運(yùn)行myisamchk時,必須確保其它程序不使用表。避免該問題的最容易的方法是使用CHECK TABLE而不用myisamchk來檢查表。

5.9.5.1. 用于myisamchk的一般選項(xiàng)

本節(jié)描述的選項(xiàng)可以用于用myisamchk執(zhí)行的任何類型的表維護(hù)操作。本節(jié)后面的章節(jié)中描述的選項(xiàng)只適合具體操作,例如檢查或修復(fù)表。

· --help,-?

顯示幫助消息并退出。

· --debug=debug_options, -# debug_options

輸出調(diào)試記錄文件。debug_options字符串經(jīng)常是'd:t:o,filename'。

· --silent,-s

沉默模式。僅當(dāng)發(fā)生錯誤時寫輸出。你能使用-s兩次(-ss)使myisamchk沉默。

· --verbose,-v

冗長模式。打印更多的信息。這能與-d和-e一起使用。為了更冗長,使用-v多次(-vv, -vvv)!

· --version, -V

顯示版本信息并退出。

· --wait, -w

如果表被鎖定,不是提示錯誤終止,而是在繼續(xù)前等待到表被解鎖。請注意如果用--skip-external-locking選項(xiàng)運(yùn)行mysqld,只能用另一個myisamchk命令鎖定表。

還可以通過--var_name=value選項(xiàng)設(shè)置下面的變量:

變量

默認(rèn)值

decode_bits

9

ft_max_word_len

取決于版本

ft_min_word_len

4

ft_stopword_file

內(nèi)建列表

key_buffer_size

523264

myisam_block_size

1024

read_buffer_size

262136

sort_buffer_size

2097144

sort_key_blocks

16

stats_method

nulls_unequal

write_buffer_size

262136

可以用myisamchk --help檢查myisamchk變量及其 默認(rèn)值:

當(dāng)用排序鍵值修復(fù)鍵值時使用sort_buffer_size,使用--recover時這是很普通的情況。

當(dāng)用--extend-check檢查表或通過一行一行地將鍵值插入表中(如同普通插入)來修改鍵值時使用Key_buffer_size。在以下情況通過鍵值緩沖區(qū)進(jìn)行修復(fù):

· 使用--safe-recover。

· 當(dāng)直接創(chuàng)建鍵值文件時,需要對鍵值排序的臨時文件有兩倍大。通常是當(dāng)CHAR、VARCHAR、或TEXT列的鍵值較大的情況,因?yàn)榕判虿僮髟谔幚磉^程中需要保存全部鍵值。如果你有大量臨時空間,可以通過排序強(qiáng)制使用myisamchk來修復(fù),可以使用--sort-recover選項(xiàng)。

通過鍵值緩沖區(qū)的修復(fù)占用的硬盤空間比使用排序么少,但是要慢。

如果想要快速修復(fù),將key_buffer_size和sort_buffer_size變量設(shè)置到大約可用內(nèi)存的25%??梢詫蓚€變量設(shè)置為較大的值,因?yàn)橐粋€時間只使用一個變量。

myisam_block_size是用于索引塊的內(nèi)存大小。

stats_method影響當(dāng)給定--analyze選項(xiàng)時,如何為索引統(tǒng)計(jì)搜集處理NULL值。它如同myisam_stats_method系統(tǒng)變量。詳細(xì)信息參見5.3.3節(jié),“服務(wù)器系統(tǒng)變量”和7.4.7節(jié),“MyISAM索引統(tǒng)計(jì)集合”的myisam_stats_method的描述。

ft_min_word_len和ft_max_word_len表示FULLTEXT索引的最小和最大字長。ft_stopword_file為停止字文件的文件名。需要在以下環(huán)境中對其進(jìn)行設(shè)置。

如果你使用myisamchk來修改表索引(例如修復(fù)或分析),使用最小和最大字長和停止字文件的 默認(rèn)全文參數(shù)值(除非你另外指定)重建FULLTEXT索引。這樣會導(dǎo)致查詢失敗。

出現(xiàn)這些問題是因?yàn)橹挥蟹?wù)器知道這些參數(shù)。它們沒有保存在MyISAM索引文件中。如果你修改了服務(wù)器中的最小或最大字長或停止字文件,要避免該問題,為用于mysqld的myisamchk指定相同的ft_min_word_len,ft_max_word_len和ft_stopword_file值。例如,如果你將最小字長設(shè)置為3,可以這樣使用myisamchk來修復(fù)表:

shell myisamchk --recover --ft_min_word_len=3 tbl_name.MYI

要想確保myisamchk和服務(wù)器使用相同的全文

怎樣修復(fù)mysql表

也許很多人遇到過類似Can’t open file: ‘[Table]mytable.MYI’ 這樣的錯誤信息,卻不知道怎么解決他,下面我們做個介紹,

多數(shù)情況下,數(shù)據(jù)庫被破壞只是指索引文件受到了破壞,真正的數(shù)據(jù)被破壞掉的情況非常少。大多數(shù)形式的數(shù)據(jù)庫破壞的的修復(fù)相當(dāng)簡單。

和前面的校驗(yàn)一樣,修復(fù)的方式也有三種。

下面講的方法只對MyISAM格式的表有效。其他類型的損壞需要從備份中恢復(fù)。

1,REPAIR TABLE SQL statement(mysql服務(wù)必須處于運(yùn)行狀態(tài))。

2,命令mysqlcheck(mysql服務(wù)可以處于運(yùn)行狀態(tài))。

3,命令myisamchk(必須停掉mysql服務(wù),或者所操作的表處于不活動狀態(tài))。

在修復(fù)表的時候,最好先作一下備份。所以你需要兩倍于原始表大小的硬盤空間。請確保在進(jìn)行修復(fù)前你的硬盤空間還沒有用完。

1用”repair table”方式修復(fù)

語法:repair table 表名 [選項(xiàng)]

選項(xiàng)如下:

QUICK 用在數(shù)據(jù)表還沒被修改的情況下,速度最快

EXTENDED 試圖去恢復(fù)每個數(shù)據(jù)行,會產(chǎn)生一些垃圾數(shù)據(jù)行,萬般無奈的情況下用

USE_FRM 用在.MYI文件丟失或者頭部受到破壞的情況下。利用.frm的定義來重建索引

多數(shù)情況下,簡單得用”repair table tablename”不加選項(xiàng)就可以搞定問題。但是當(dāng).MYI文件丟失或者頭部受到破壞時,這樣的方式不管用,例如:

mysql REPAIR TABLE mytable;

+————————-+——–+———-+———————————————+

| Table | Op | Msg_type | Msg_text |

+————————-+——–+———-+———————————————+

| sports_results.mytable | repair | error | Can’t find file: ‘mytable.MYI’ (errno: 2) |

+————————-+——–+———-+———————————————+

修復(fù)失敗的原因時索引文件丟失或者其頭部遭到了破壞,為了利用相關(guān)定義文件來修復(fù),需要用USE_FRM選項(xiàng)。例如:

mysql REPAIR TABLE mytable USE_FRM;

+————————-+——–+———-+————————————+

| Table | Op | Msg_type | Msg_text |

+————————-+——–+———-+————————————+

| sports_results.mytable | repair | warning | Number of rows changed from 0 to 2 |

| sports_results.mytable | repair | status | OK |

+————————-+——–+———-+————————————+

我們可以看到Msg_test表項(xiàng)的輸出信息”ok”,表名已經(jīng)成功修復(fù)受損表。

2用mysql內(nèi)建命令mysqlcheck來修復(fù)

當(dāng)mysql服務(wù)在運(yùn)行時,也可以用mysql內(nèi)建命令mysqlcheck來修復(fù)。

語法:mysqlcheck -r 數(shù)據(jù)庫名 表名 -uuser -ppass

%mysqlcheck -r sports_results mytable -uuser -ppass

sports_results.mytable OK

利用mysqlcheck可以一次性修復(fù)多個表。只要在數(shù)據(jù)庫名后列出相應(yīng)表名即可(用空格隔開)?;蛘邤?shù)據(jù)庫名后不加表名,將會修復(fù)數(shù)據(jù)庫中的所有表,例如:

%mysqlcheck -r sports_results mytable events -uuser -ppass

sports_results.mytable OK

sports_results.events OK

%mysqlcheck -r sports_results -uuser -ppass

sports_results.mytable OK

sports_results.events OK

3用myisamchk修復(fù)

用這種方式時,mysql服務(wù)必須停掉,或者所操作的表處于不活動狀態(tài)(選項(xiàng)skip-external-locking沒被使用)。記著一定要在相關(guān).MYI文件的路徑下或者自己定義其路徑。

語法:myisamchk [選項(xiàng)] [表名]

下面是其選項(xiàng)和描述

–backup, -B 在進(jìn)行修復(fù)前作相關(guān)表得備份

–correct-checksum 糾正校驗(yàn)和

–data-file-length=#, -D # 重建表時,指定數(shù)據(jù)文件得最大長度

–extend-check, -e 試圖去恢復(fù)每個數(shù)據(jù)行,會產(chǎn)生一些垃圾數(shù)據(jù)行,萬般無奈的情況下用

–force, -f 當(dāng)遇到文件名相同的.TMD文件時,將其覆蓋掉。

keys-used=#, -k # 指定所用的keys可加快處理速度,每個二進(jìn)制位代表一個key.第一個key為0

–recover, -r 最常用的選項(xiàng),大多數(shù)破壞都可以通過它來修復(fù)。如果你的內(nèi)存足夠大,可以增大參數(shù)sort_buffer_size的值來加快恢復(fù)的速度。但是遇到唯一鍵由于破壞而不唯一 的表時,這種方式不管用。

–safe-recover -o 最徹底的修復(fù)方式,但是比-r方式慢,一般在-r修復(fù)失敗后才使用。這種方式讀出 所有的行,并以行為基礎(chǔ)來重建索引。它的硬盤空間需求比-r方式稍微小一點(diǎn),因 為它沒創(chuàng)建分類緩存。你可以增加key_buffer_size的值來加快修復(fù)的速度。

–sort-recover, -n mysql用它類分類索引,盡管結(jié)果是臨時文件會非常大

–character-sets-dir=… 包含字符集設(shè)置的目錄

–set-character-set=name 為索引定義一個新的字符集

–tmpdir=path, -t 如果你不想用環(huán)境變量TMPDIR的值的話,可以自定義臨時文件的存放位置

–quick, -q 最快的修復(fù)方式,當(dāng)數(shù)據(jù)文件沒有被修改時用,當(dāng)存在多鍵時,第二個-q將會修改 數(shù)據(jù)文件

–unpack, -u 解開被myisampack打包的文件

myisamchk應(yīng)用的一個例子

% myisamchk -r mytable

- recovering (with keycache) MyISAM-table ‘mytable.MYI’


新聞名稱:怎么修復(fù)破損mysql表 mysql 修復(fù)數(shù)據(jù)表
鏈接URL:http://fisionsoft.com.cn/article/hpcogi.html