天天看點

MySQL資料庫中部分資料損壞快速恢複過

前幾天因為SQL/Index.html">MySQL資料庫部分資料損壞原因,我嘗試了下恢複資料,之後整理以下文檔,供各位參考,以備各位同僚以後如有類似問題,可以少走些彎路,盡快解決問題。

環境:Windows2003

資料庫:SQL/Index.html">MySQL

損壞資料檔案名:function_products

将資料庫内容實體檔案直接導入到mysql/data下,每隻表各3個檔案,依次分别為:.frm .myd .myi。首先我第一想到的是去網上搜尋,尋找類似的工具,試圖通過工具來恢複已損壞的檔案,于是我在google上查找,找到一款名為mysqlrecovery的工具,安裝後我用其進行恢複,隻可惜效果太不理想,幾十MB大的資料檔案,恢複之後它提示我竟然隻有幾十KB。我又想到了SQL/Index.html">MySQL下應有自己本身的修複程式等,于是想通過其來進行恢複,心想應不會太差勁吧,在網上查找了資料,提示:由于臨時斷電,使用kill -9中止SQL/Index.html">MySQL服務程序,或者是SQL/Index.html">MySQL正在高速運轉時進行強制備份操作時等,所有的這些都可能會毀壞SQL/Index.html">MySQL的資料檔案。如果在被幹擾時,服務正在改變檔案,檔案可能會留下錯誤的或不一緻的狀态。因為這樣的毀壞有時是不容易被發現的,當你發現這個錯誤時可能是很久以後的事了。

于是,當你發現這個問題時,也許所有的備份都有同樣的錯誤。我想我現在碰到的問題可能是這個問題,因為備份的資料也是有部分損壞的資料,是以導緻不能完全運作, 意識到myisamchk程式對用來檢查和修改的SQL/Index.html">MySQL資料檔案的通路應該是唯一的。如果SQL/Index.html">MySQL服務正在使用某一檔案,并對myisamchk正在檢查的檔案進行修改,myisamchk會誤以為發生了錯誤,并會試圖進行修複--這将導緻SQL/Index.html">MySQL服務的崩潰!這樣,要避免這種情況的發生,通常我們需要在工作時關閉SQL/Index.html">MySQL服務。作為選擇,你也可以暫時關閉服務以制作一個檔案的拷貝,然後在這個拷貝上工作。當你做完了以後,重新關閉服務并使用新的檔案取代原來的檔案(也許你還需要使用期間的變更日志)。

SQL/Index.html">MySQL資料目錄不是太難了解的。每一個資料庫對應一個子目錄,每個子目錄中包含了對應于這個資料庫中的資料表的檔案。每一個資料表對應三個檔案,它們和表名相同,但是具有不同的擴充名。tblname.frm檔案是表的定義,它儲存了表中包含的資料列的内容和類型。tblname.myd檔案包含了表中的資料。tblname.myi檔案包含了表的索引(例如,它可能包含lookup表以幫助提高對表的主鍵列的查詢)。 要檢查一個表的錯誤,隻需要運作myisamchk(在SQL/Index.html">MySQL的bin目錄下)并提供檔案的位置和表名,或者是表的索引檔案名:

% myisamchk /usr/local/mysql/var/dbname/tblname

% myisamchk /usr/local/mysql/var/dbname/tblname.myi

上面的兩個指令都可以執行對指定表的檢查。要檢查資料庫中所有的表,可以使用通配符:

% myisamchk /usr/local/mysql/var/dbname*.myi

如果不帶任何選項,myisamchk将對表檔案執行普通的檢查。如果你對一個表有懷疑,但是普通的檢查不能發現任何錯誤,你可以執行更徹底的檢查(但是也更慢!),這需要使用--extend-check選項:

% myisamchk --extend-check /path/to/tblname

對錯誤的檢查是沒有破壞性的,這意味着你不必擔心執行對你的資料檔案的檢查會使已經存在的問題變得更糟。另一方面,修複選項,雖然通常也是安全的,但是它對你的資料檔案的更改是無法撤消的。因為這個原因,我們強烈推薦你試圖修複一個被破壞的表檔案時首先做個備份,并確定在制作這個備份之前你的SQL/Index.html">MySQL服務是關閉的。

我在Win2003下通過指令提示符,輸入:

注:此為記錄我當時操作的全部過程d:/documents and settings/administrator>c:c:/>cd SQL/Index.html">MySQLc:/mysql>cd datac:/mysql/data>cd hw_enterpricec:/mysql/data/hw_enterprice>myisamchk function_products.frm'myisamchk' 不是内部或外部指令,也不是可運作的程式或批處理檔案。c:/mysql/data/hw_enterprice>cd/c:/>cd mysqlc:/mysql>cd bin注:檢視myisamchk的幫助資訊c:/mysql/bin>myisamchkmyisamchk ver 2.6 for win95/win98 at i32by monty, for your professional usethis 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 errorsusage: 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=optionchange the value of a variable. please note thatthis option is deprecated; you can set variablesdirectly with '--variable-name=value'.-t, --tmpdir=path   path for temporary files-s, --silent     only print errors. one can use two -s to makemyisamchk 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 inextreme cases as myisamchk should normally be able tofind out if the table is ok even without this switch-f, --fast       check only tables that haven't been closed properly-c, --check-only-changedcheck 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% ofall 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 checkedrepair 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 datafile when it's full)-e, --extend-check try to recover every possible row from the data filenormally 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 abit mask of which keys to use. this can be used toget faster inserts!-r, --recover     can fix almost anything except unique keys that aren'tunique.-n, --sort-recover forces recovering with sorting even if the temporaryfile would be very big.-p, --parallel-recoveruses the same technique as '-r' and '-n', but createsall 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 canhandle a couple of cases where '-r' reports that itcan't fix the data file.--character-sets-dir=...directory where character sets are--set-character-set=namechange 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 tomodify 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 inSQL/Index.html">MySQL faster. you can check the calculated distributionby 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 valueif no value is given, then sets the next auto_incrementvalue to the highest used value for the auto key + 1.-s, --sort-index   sort index blocks. this speeds up 'read-next' inapplications-r, --sort-records=#sort records according to an index. this makes yourdata much more localized and may speed up thingsc:/mysql/bin>myisamchk c:/mysql/data/hw_enterprice/function_products.frmmyisamchk: error: 'c:/mysql/data/hw_enterprice/function_products.frm' is not a myisam-tablec:/mysql/bin>myisamchk c:/mysql/data/hw_enterprice/function_products.myichecking myisam file: c:/mysql/data/hw_enterprice/function_products.myidata records:   85207   deleted blocks:     39myisamchk: warning: table is marked as crashedmyisamchk: warning: 1 clients is using or hasn't closed the table properly- check file-size- check key delete-chain- check record delete-chainmyisamchk: 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 linksmyisamchk: error: wrong bytesec: 0-195-171 at linkstart: 841908myisam-table 'c:/SQL/Index.html">MySQL/data/hw_enterprice/function_products.myi' is corruptedfix it using switch "-r" or "-o"

[1] [2] 下一頁