共計 3796 個字符,預計需要花費 10 分鐘才能閱讀完成。
行業資訊
數據庫
MySQL 數據庫
使用 myisamchk 和 mysqlcheck 工具如何修復損壞的 MySQL 數據庫文件
自動寫代碼機器人,免費開通
這篇文章將為大家詳細講解有關使用 myisamchk 和 mysqlcheck 工具如何修復損壞的 MySQL 數據庫文件,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
由于服務器的數據庫硬盤空間滿了,由于大量寫入數據失敗導致了出現“Duplicate entry for key username”的錯誤。
如果,出現這樣的 mysql 數據庫錯誤很可能是 mysql 數據庫索引出了問題。那么,什么是 mysql 數據庫索引?
分析:索引如果是 primary unique 這兩兩種,那么數據表的數據對應的這個字段就必須保證其每條記錄的唯一性。否則就會產生這個錯誤。
一般發生在對數據庫寫操作的時候,例如 Discuz!4.1 論壇程序要求所有會員的用戶名 username 必須唯一,即 username 的索引是 unique,這時如果強行往 cdb_members 表里插入一個已有的 username 的記錄就會發上這個錯誤,或者將一條記錄的 username 更新為已有的一個 username。
比如某網友的 dedecms 網站出問題了,訪問一看,果然全屏報錯,檢查 mysql 日志,錯誤信息為:
Table .dedecmsv4dede_archives is marked as crashed and should be repaired
提示說 cms 的文章表 dede_archives 被標記有問題,需要修復。
于是趕快恢復歷史數據,上網查找原因。最終將問題解決。
解決方法如下:
找到 mysql 的安裝目錄的 bin/myisamchk 工具,在命令行中輸入:
myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI
然后 myisamchk 工具會幫助你恢復數據表的索引。重新啟動 mysql,問題解決。
那么,修復 mysql 數據庫一般可以 myisamchk 工具或者 mysqlcheck 工具用這二種方法:
1、myisamchk 工具
使用 myisamchk 必須暫時停止 MySQL 服務器。例如,我們要檢修 discuz 數據庫。執行以下操作:
# service mysql stop (停止 MySQL);
# myisamchk -r / 數據庫文件的絕對路徑 /*MYI
# service mysql start
myisamchk 會自動檢查并修復數據表中的索引錯誤。
2、mysqlcheck 工具
使用 mysqlcheck 無需停止 MySQL,可以進行熱修復。操作步驟如下:
# mysqlcheck -r discuz.*
# service mysql stop (停止 MySQL);
# myisamchk -r / 數據庫文件的絕對路徑 /*MYI
# service mysql start
myisamchk 會自動檢查并修復數據表中的索引錯誤。
注意:無論是 myisamchk 還是 mysqlcheck,一般情況下不要使用 -f 強制修復,-f 參數會在遇到一般修復無法成功的時候刪除部分出錯數據以嘗試修復。所以,不到萬不得已不要使用 -f。
下面是其它網友的補充
檢查修復所有數據庫:
# mysqlcheck -A -o -r -p
Enter password:
db1 OK
db2 OK
db3 OK
db4 OK
……
……
……
修復指定的數據庫用
# mysqlcheck -o -r Database_NAME -p
即可
命令詳解:
mysqlcheck 客戶端可以檢查和修復 MyISAM 表。它還可以優化和分析表。
mysqlcheck 的功能類似 myisamchk,但其工作不同。主要差別是當 mysqld 服務器在運行時必須使用 mysqlcheck,而 myisamchk 應用于服務器沒有運行時。使用 mysqlcheck 的好處是不需要停止服務器來檢查或修復表。
Mysqlcheck 為用戶提供了一種方便的使用 SQL 語句 CHECK TABLE、REPAIR TABLE、ANALYZE TABLE 和 OPTIMIZE TABLE 的方式。它確定在要執行的操作中使用使用哪個語句,然后將語句發送到要執行的服務器上。
有 3 種方式來調用 mysqlcheck:
shell mysqlcheck[options] db_name [tables]
shell mysqlcheck[options] —database DB1 [DB2 DB3…]
shell mysqlcheck[options] –all–database
如果沒有指定任何表或使用 —database 或 –all–database 選項,則檢查整個數據庫。
同其它客戶端比較,mysqlcheck 有一個特殊特性。重新命名二進制可以更改檢查表的默認行為(–check)。如果你想要一個工具默認可以修復表的工具,只需要將 mysqlcheck 重新復制為 mysqlrepair,或者使用一個符號鏈接 mysqlrepair 鏈接 mysqlcheck。如果調用 mysqlrepair,可按照命令修復表。
下面的名可用來更改 mysqlcheck 的默認行為:
mysqlrepair
默認選項為 –repair
mysqlanalyze
默認選項為 –analyze
mysqloptimize
默認選項為 –optimize
mysqlcheck 支持下面的選項:
· —help,-?
顯示幫助消息并退出。
· –all–database,-A
檢查所有數據庫中的所有表。與使用 —database 選項相同,在命令行中命名所有數據庫。
· –all-in-1,-1
不是為每個表發出一個語句,而是為命名數據庫中待處理的所有表的每個數據庫執行一個語句。
· –analyze,-a
分析表。
· –auto-repair
如果某個被檢查的表破壞了,自動修復它。檢查完所有表后自動進行所有需要的修復。
· –character-sets-dir=path
字符集的安裝目錄。參見 5.10.1 節,“數據和排序用字符集”。
· –check,-c
檢查表的錯誤。
· –check-only-changed,-C
只檢查上次檢查以來已經更改的或沒有正確關閉的表。
· –compress
壓縮在客戶端和服務器之間發送的所有信息(如果二者均支持壓縮)。
· —database,-B
處理數據庫中命名的所有表。使用該選項,所有字名參量被看作數據庫名,而不是表名。
· —debug[=debug_options],-# [debug_options]
寫調試日志。debug_options 字符串通常為 d:t:o,file_name。
· –default-character-set=charset
使用 charsetas 默認字符集。參見 5.10.1 節,“數據和排序用字符集”。
· –extended,-e
如果你正使用該選項來檢查表,可以確保它們 100% 地一致,但需要很長的時間。
如果你正使用該選項來修復表,則運行擴展修復,不但執行的時間很長,而且還會產生大量的垃圾行!
· –fast,-F
只檢查沒有正確關閉的表。
· –force,-f
即使出現 SQL 錯誤也繼續。
· –host=host_name,-h host_name
連接給定主機上的 MySQL 服務器。
· –medium-check,-m
執行比 –extended 操作更快的檢查。只能發現 99.99% 的錯誤,在大多數情況下這已經足夠了。
· –optimize,-o
優化表。
· –password[=password],-p
此處含有隱藏內容,需要正確輸入密碼后可見!
當連接服務器時使用的密碼。如果使用短選項形式 (-p),選項和 密碼之間不能有空格。如果在命令行中 –password 或 - p 選項后面沒有 密碼值,則提示輸入一個密碼。
· –port=port_num,-P port_num
用于連接的 TCP/IP 端口號。
· –protocol={TCP | SOCKET | PIPE | MEMORY}
使用的連接協議。
· –quick,-q
如果你正使用該選項在檢查表,它防止掃描行以檢查錯誤鏈接的檢查。這是最快的檢查方法。
如果你正使用該選項在修復表,它嘗試只修復索引樹。這是最快的修復方法。
· –repair,-r
執行可以修復大部分問題的修復,只是唯一值不唯一時不能修復。
· –silent,-s
沉默模式。只打印錯誤消息。
· –socket=path,-S path
用于連接的套接字文件。
· –tables
覆蓋 —database 或 - B 選項。選項后面的所有參量被視為表名。
· –user=user_name,-u user_name
當連接服務器時使用的 MySQL 用戶名。
· –verbose,-v
冗長模式。打印關于各階段程序操作的信息。
· –version,-V
顯示版本信息并退出。
關于“使用 myisamchk 和 mysqlcheck 工具如何修復損壞的 MySQL 數據庫文件”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
向 AI 問一下細節