例如,名稱為“ziliao.ibd”的數據表文件發生損壞,當MySQL數據庫重啟之后,執行“select* from ziliao;”之類的命令,對該數據表進行查詢 時,會 顯 示“MySQL server has gone away”等提示信息,說明訪問連接已經斷開,數據庫實際上崩潰了,自然無法從中讀取數據。執行“vi /etc/my.cnf” 命 令,打開MySQL配置文件,在其 中 的“[mysqld]” 節中 添 加“innodb_force_recovery=1”,表示采用第一種修復模式。輸入“:wq”保存該文件。執行“service mysql restart”命令,重啟MySQL數據庫。
如果直接執行“select* from ziliao;”命令,依然無法順利執行。為了可以嘗試讀取該表中前一些行的記錄。例如執行“select* from ziliao limit 500”命令,來讀取其前500行數據。當讀取成功后,執行“create table repairzl(xxx)engine=myisam;”命令,使用MYISAM引擎創建名為“repairzl”的新表,字段結構應該和“ziliao”表完全相同,其中的“xxx”表示具體的字段。執行“insert into repairzl select *ziliao limit 500;”命令,從“資料”表中讀取前500行數據,將其導入到“repairzl”表 中。 執 行“drop table ziliao;”命令,將“ziliao”表刪除。執行“rename table repairzl to ziliao;” 命令,將“repair”表更名為“ziliao”表。
按照上述方法編輯“my.cnf” 文 件, 將“innodb_force_recovery=1”一 行 刪除。 執 行“service mysql restart”命令,重啟MySQL數據庫。執行“alter table ziliao=innodb;”命令,將數據庫引擎修改為InnoDB。這樣,受損的“ziliao”數據表就修復完成了。注意,對于數據表的修復是無法完整無缺地找回數據的,只能是盡可能地讀取并導出數據。如果,存在備份或者二進制日志的話,那么就可以完整地找回數據。如果在數據表中部等位置出現損壞,就需要手工逐行進行探測,來發現大致的損壞位置。
例如,數據表中存在1000行記錄,在其中的600行處出現問題,可以按照上述方法進行修復,現將前599行讀取出來并導入到新表中。之后再處理之后的記錄行,方法基本相同,所不同的地方在于在導入數據時,可以執行諸如“insert ignore into repairzl select* from ziliao recno>600;”命令,將行號大于600之后的數據導入進來,這里的“recno”字段為行號。雖然修復操作可以找回盡可能多的數據,不過為了數據庫的安全,最好及時對數據庫進行備份。有了備份以及二進制日志文件,就可以很輕松地將數據庫恢復到損壞之前的狀態。