MySQL資料庫下.frm.MYD.MYI損壞恢復操作
將資料庫內容物理檔案直接匯入到MySQLdata下,每隻表各3個檔案,依次分別為:.frm .MYD .MYI,data下的資料夾名就是資料庫名
首先我第一想到的是去網上搜尋,尋找類似的工具,試圖通過工具來恢復已損壞的檔案,於是我在GOOGLE上查詢,找到一款名為MySQLRecovery 的工具,安裝後我用其進行恢復,只可惜效果太不理想,幾十M大的資料檔案,恢復之後它提示我竟然只有幾十K,令我吐血…
MySQL資料目錄不是太難理解的。每一個資料庫對應一個子目錄,每個子目錄中包含了對應於這個資料庫中的資料表的檔案。每一個資料表對應三個檔案,它們 和表名相同,但是具有不同的副檔名。tblName.frm檔案是表的定義,它儲存了表中包含的資料列的內容和型別。tblName.MYD檔案包含了表 中的資料。tblName.MYI檔案包含了表的索引(例如,它可能包含lookup表以幫助提高對錶的主鍵列的查詢)。要檢查一個表的錯誤,只需要執行 myisamchk(在MySQL的bin目錄下)並提供檔案的位置和表名,或者是表的索引檔名:pma.co
% myisamchk /usr/local/mysql/var/dbName/tblName % myisamchk /usr/local/mysql/var/dbName/tblName.MYI |
上面的兩個命令都可以執行對指定表的檢查。要檢查資料庫中所有的表,可以使用萬用字元:
% myisamchk /usr/local/mysql/var/dbName/*.MYI |
要檢查所有資料庫中的所有表,可以使用兩個萬用字元:
% myisamchk /usr/local/mysql/var/*/*.MYI |
如果不帶任何選項,myisamchk將對錶檔案執行普通的檢查。如果你對一個表有懷疑,但是普通的檢查不能發現任何錯誤,你可以執行更徹底的檢查(但是也更慢!),這需要使用–extend-check選項:
% myisamchk --extend-check /path/to/tblName |
對錯誤的檢查是沒有破壞性的,這意味著你不必擔心執行對你的資料檔案的檢查會使已經存在的問題 變得更糟。另一方面,修復選項,雖然通常也是安全的,但是它對你的資料檔案的更改是無法撤消的。因為這個原因,我們強烈推薦你試圖修復一個被破壞的表檔案 時首先做個備份,並確保在製作這個備份之前你的MySQL服務是關閉的。
我在win2003下通過命令提示符,輸入:
注:此為記錄我當時操作的全部過程
D:Documents and SettingsAdministrator>c: C:>cd mysql C:mysql>cd data C:mysqldata>cd hw_enterprice C:mysqldatahw_enterprice>myisamchk function_products.frm `myisamchk` 不是內部或外部命令,也不是可執行的程式 或批處理檔案。 C:mysqldatahw_enterprice>cd C:>cd mysql C:mysql>cd bin 注:檢視myisamchk的幫助資訊 C:mysqlin>myisamchk myisamchk Ver 2.6 for Win95/Win98 at i32 By Monty, for your professional use This software comes with NO WARRANTY: see the PUBLIC for details. Description, check and repair of ISAM tables. Used without options all tables on the command will be checked for errors Usage: myisamchk [OPTIONS] tables[.MYI] Global options: -#, --debug=... Output debug log. Often this is `d:t:o,filename` -?, --help Display this help and exit. -O, --set-variable var=option Change the value of a variable. Please note that this option is deprecated; you can set variables directly with `--variable-name=value`. -t, --tmpdir=path Path for temporary files -s, --silent Only print errors. One can use two -s to make myisamchk very silent -v, --verbose Print more information. This can be used with --description and --check. Use many -v for more verbosity! -V, --version Print version and exit. -w, --wait Wait if table is locked. Check options (check is the default action for myisamchk): -c, --check Check table for errors -e, --extend-check Check the table VERY throughly. Only use this in extreme cases as myisamchk should normally be able to find out if the table is ok even without this switch -F, --fast Check only tables that haven`t been closed properly -C, --check-only-changed Check only tables that have changed since last check -f, --force Restart with `-r` if there are any errors in the table. States will be updated as with `--update-state` -i, --information Print statistics information about table that is checked -m, --medium-check Faster than extend-check, but only finds 99.99% of all errors. Should be good enough for most cases -U --update-state Mark tables as crashed if you find any errors -T, --read-only Don`t mark table as checked Repair options (When using `-r` or `-o`) -B, --backup Make a backup of the .MYD file as `filename-time.BAK` --correct-checksum Correct checksum information for table. -D, --data-file-length=# Max length of data file (when recreating data file when it`s full) -e, --extend-check Try to recover every possible row from the data file Normally this will also find a lot of garbage rows; Don`t use this option if you are not totally desperate. -f, --force Overwrite old temporary files. -k, --keys-used=# Tell MyISAM to update only some specific keys. # is a bit mask of which keys to use. This can be used to get faster inserts! -r, --recover Can fix almost anything except unique keys that aren`t unique. -n, --sort-recover Forces recovering with sorting even if the temporary file would be very big. -p, --parallel-recover Uses the same technique as `-r` and `-n`, but creates all the keys in parallel, in different threads. THIS IS ALPHA CODE. USE AT YOUR OWN RISK! -o, --safe-recover Uses old recovery method; Slower than `-r` but can handle a couple of cases where `-r` reports that it can`t fix the data file. --character-sets-dir=... Directory where character sets are --set-character-set=name Change the character set used by the index -q, --quick Faster repair by not modifying the data file. One can give a second `-q` to force myisamchk to modify the original datafile in case of duplicate keys -u, --unpack Unpack file packed with myisampack. Other actions: -a, --analyze Analyze distribution of keys. Will make some joins in MySQL faster. You can check the calculated distribution by using `--description --verbose table_name`. -d, --description Prints some information about table. -A, --set-auto-increment[=value] Force auto_increment to start at this or higher value If no value is given, then sets the next auto_increment value to the highest used value for the auto key + 1. -S, --sort-index Sort index blocks. This speeds up `read-next` in applications -R, --sort-records=# Sort records according to an index. This makes your data much more localized and may speed up things C:mysqlin>myisamchk c:mysqldatahw_enterpricefunction_products.frm myisamchk: error: `c:mysqldatahw_enterpricefunction_products.frm` is not a M yISAM-table C:mysqlin>myisamchk c:mysqldatahw_enterpricefunction_products.myi Checking MyISAM file: c:mysqldatahw_enterpricefunction_products.myi Data records: 85207 Deleted blocks: 39 myisamchk: warning: Table is marked as crashed myisamchk: warning: 1 clients is using or hasn`t closed the table properly - check file-size - check key delete-chain - check record delete-chain myisamchk: error: record delete-link-chain corrupted - check index reference - check data record references index: 1 - check data record references index: 2 - check data record references index: 3 - check record links myisamchk: error: Wrong bytesec: 0-195-171 at linkstart: 841908 MyISAM-table `c:mysqldatahw_enterpricefunction_products.myi` is corrupted Fix it using switch "-r" or "-o" |
繼續進行操作:
C:mysqlin>myisamchk --recover --quick c:mysqldatahw_enterpricefunction_p roducts.myi - check key delete-chain - check record delete-chain myisamchk: error: record delete-link-chain corrupted myisamchk: error: Quick-recover aborted; Run recovery without switch `q` Updating MyISAM file: c:mysqldatahw_enterpricefunction_products.myi MyISAM-table `c:mysqldatahw_enterpricefunction_products.myi` is not fixed be cause of errors Try fixing it by using the --safe-recover (-o) or the --force (-f) option |
系統提示我使用–safe-recover (-o) or the –force (-f) option進行修復操作,於是
C:mysqlin>myisamchk --safe-recover c:mysqldatahw_enterpricefunction_prod ucts.myi - recovering (with keycache) MyISAM-table `c:mysqldatahw_enterpricefunction_ products.myi` Data records: 85207 Wrong bytesec: 0-195-171 at 841908; Skipped Data records: 85215 |
將修復後的物理檔案複製到mysqldata下之後,通過phpMyAdmin進行訪問,OK正常!
本次資料修復操作成功,資料已被正常恢復,總計85215條記錄,其中恢復資料共計85207條。
總結本次經驗及查詢資料,如下:
當你試圖修復一個被破壞的表的問題時,有三種修復型別。如果你得到一個錯誤資訊指出一個臨時檔案不能建立,刪除資訊所指出的檔案並再試一次–這通常是上一次修復操作遺留下來的。
這三種修復方法如下所示:
% myisamchk --recover --quick /path/to/tblName % myisamchk --recover /path/to/tblName % myisamchk --safe-recover /path/to/tblName |
第一種是最快的,用來修復最普通的問題;而最後一種是最慢的,用來修復一些其它方法所不能修復的問題。
檢查和修復MySQL資料檔案
如果上面的方法無法修復一個被損壞的表,在你放棄之前,你還可以試試下面這兩個技巧:
如果你懷疑表的索引檔案(*.MYI)發生了不可修復的錯誤,甚至是丟失了這個檔案,你可以使 用資料檔案(*.MYD)和資料格式檔案(*.frm)重新生成它。首先製作一個資料檔案(tblName.MYD)的拷貝。重啟你的MySQL服務並連 接到這個服務上,使用下面的命令刪除表的內容:
mysql> DELETE FROM tblName; |
在刪除表的內容的同時,會建立一個新的索引檔案。退出登入並重新關閉服務,然後用你剛才儲存的 資料檔案(tblName.MYD)覆蓋新的(空)資料檔案。最後,使用myisamchk執行標準的修復(上面的第二種方法),根據表的資料的內容和表 的格式檔案重新生成索引資料。
如果你的表的格式檔案(tblName.frm)丟失了或者是發生了不可修復的錯誤,但是你清 楚如何使用相應的CREATE TABLE語句來重新生成這張表,你可以重新生成一個新的.frm檔案並和你的資料檔案和索引檔案(如果索引檔案有問題,使用上面的方法重建一個新的)一 起使用。首先製作一個資料和索引檔案的拷貝,然後刪除原來的檔案(刪除資料目錄下有關這個表的所有記錄)。
啟動MySQL服務並使用當初的CREATE TABLE檔案建立一個新的表。新的.frm檔案應該可以正常工作了,但是最好你還是執行一下標準的修復(上面的第二種方法)。
如果有類似問題,建議自己先分析問題根源,查詢資料,自己動手解決,不但可以多學更多知識技巧,更重要的是,自己也在解決問題的同時得到了快樂.
相關文章
- 資料庫資料恢復—NTFS分割槽損壞如何恢復SqlServer資料庫資料資料庫資料恢復SQLServer
- 【資料庫資料恢復】MongoDB資料庫檔案損壞的資料恢復案例資料庫資料恢復MongoDB
- Oracle資料庫UNDO損壞後的恢復Oracle資料庫
- master資料庫損壞之後的恢復AST資料庫
- 使用RMAN恢復完全損壞的資料庫資料庫
- catalog損壞情況下的資料庫恢復例項資料庫
- 資料庫資料恢復-SQL SERVER資料庫MDF (NDF)或LDF損壞如何恢復資料?資料庫資料恢復SQLServer
- 【北亞資料恢復】誤操作分割槽損壞導致SqlServer資料庫資料丟失的資料恢復資料恢復SQLServer資料庫
- u盤檔案損壞怎麼恢復資料 u盤恢復損壞資料的有效方法
- MySQL資料庫表損壞後的修復方法MySql資料庫
- 資料底層損壞的恢復方法—拼碎片恢復資料
- 執行在容器中Postgres資料庫資料損壞後如何恢復?資料庫
- [ORACLE] 系統故障資料庫恢復--資料檔案無損壞Oracle資料庫
- Oracle資料庫不同損壞級別的恢復詳解Oracle資料庫
- index損壞恢復Index
- 資料恢復記錄:硬碟分割槽損壞修復SqlServer資料庫過程資料恢復硬碟SQLServer資料庫
- u盤檔案損壞怎麼恢復資料 u盤損壞無法讀取怎麼恢復資料
- 寶塔資料庫恢復 mysql資料庫丟失恢復 mysql資料庫刪除庫恢復 寶塔mysql資料庫恢復資料庫MySql
- 資料檔案丟失損壞的恢復--
- 隨身碟顆粒損壞資料恢復資料恢復
- Oracle資料庫恢復:歸檔日誌損壞案例一則Oracle資料庫
- 【伺服器資料恢復】IBM儲存伺服器硬碟壞道離線、oracle資料庫損壞的資料恢復伺服器資料恢復IBM硬碟Oracle資料庫
- 【資料庫資料恢復】linux系統下MYSQL資料庫資料恢復案例資料庫資料恢復LinuxMySql
- 資料庫在沒有備份的情況下的資料檔案損壞的恢復資料庫
- SQLite資料庫損壞及其修復探究SQLite資料庫
- 資料庫檔案壞塊損壞導致開啟時報錯的恢復方法資料庫
- 轉載:Oracle資料塊損壞恢復總結Oracle
- 某個資料檔案損壞完全恢復(三)
- 作業系統和informix資料庫全部損壞恢復測試作業系統ORM資料庫
- MySQL資料庫INNODB表損壞修復處理過程分享MySql資料庫
- Oracle 11g 資料庫恢復-場景5:部分檔案損壞恢復,開庫狀態,低可用恢復方式Oracle資料庫
- Oracle 11g 資料庫恢復-場景4:部分檔案損壞恢復,開庫狀態, 高可用恢復方式Oracle資料庫
- Oralce 11g資料庫恢復-場景3:部分檔案損壞恢復,關庫狀態,高可用恢復方式資料庫
- 【資料庫資料恢復】SQL SERVER資料庫MDF (NDF)或LDF損壞問題如何解決?資料庫資料恢復SQLServer
- 伺服器Oracle資料庫損壞修復伺服器Oracle資料庫
- 資料恢復工具Recoverit使用教程:如何修復損壞的影片資料恢復
- 【資料庫資料恢復】EXT3檔案系統下MYSQL資料庫恢復案例資料庫資料恢復MySql
- 成功恢復某公司伺服器故障導致的資料庫損壞伺服器資料庫