恢復過程包括兩個信息源---備份文件和二進制日志,備份文件可使用數據恢復到執行備份時的狀態,而二進制日志可恢復到發生故障時的狀態。下面分別介紹如何利用這兩個文件恢復一個數據庫或恢復單個數據表。
本文由網頁教學網(http://www.webjx.com)整理發布!轉載請注明出處,謝謝!
恢復整個數據庫的步驟:
把需恢復的數據庫的整個目錄的內容拷貝到其它地方,以備用。
使用最近的備份文件重載數據庫。如果使用mysqldump生成的備份,則可使用它們作為mysql的輸入重載;如果是通過拷貝數據庫目錄來備份的,則要關閉數據庫服務器,再把備份重新拷貝到數據目錄,再重啟數據庫服務器。
通過二進制日志重做事務,恢復到出錯點的數據。具體操作是這樣的,用mysqlbinlog把日志轉換成ASCII格式,再把它作為mysql的輸入,並指定--one-database選項,以便mysql只執行你指定的數據庫恢復。如:
% ls -t -r -l binlog.[0-9]* | xargs mysqlbinlog | mysql --one-database db_name
但上面命令只適合所有日志文件名具有相同長度的情況。否則需用下面的Perl代碼來處理:
#!/usr/bin/perl -w # sort_num.pl use strict; my @files = <>; #read all input file @files = sort { my $anum = $1 if $a =~/\.(\d+)$/; #sort them by numeric extension my $bnum = $1 if $b =~/\.(\d+)$/; $anum <=> $bnum; } @files; print @files; #print them exit(0); 如下使用該腳本: % ls -l binlog.[0-9]* | sort_num.pl | xargs mysqlbinlog | mysql --one-database db_name
上面討論的是需所有日志文件的情況,但多數情況下我們只需備份後生成的幾個日志文件,這時,可用以下命令來重做。
% mysqlbinlog binlog.1234 | mysql --one-database db_name % mysqlbinlog binlog.1235 | mysql --one_database db_name ...
如果我們需恢復因執行DROP DATABASE,DROP TABLE或DELETE語句而損壞的數據庫,就需在日志文件中刪除該語句,否則重做後結果還是一樣。所以需把日志轉換成ASCII格式並保存起來,再用編輯器打開該文件,刪除這些語句後再重做。
恢復使用BACKUP TABLE命令備份的數據表可用RESTORE TABLE語句:
備份語句: mysql> BACKUP TABLE table_name1,table_name2 TO '/backup/table_backup';
恢復語句: mysql> RESTORE TABLE table_name1,table_name2 FROM '/backup/table_backup';
恢復有外鍵的數據表,可用SET FOREIGN_KEY_CHECK = 0;語句先關閉鍵字檢查,導入表後再重啟它,賦值為1表示檢查有效。
恢復InnoDB表空間,當服務器重啟時,InnoDB處理程序會執行自動恢復工作,通過選項文件[mysqld]段中的set-variable=innodb_force_recovery=level設置自動恢復的級別,推薦典型的啟動值為4。如果需從備份文件恢復,則和上面介紹的方法一樣。BDB數據表的恢復也一樣,啟動服務器時它會進行自動恢復。