MySQL表數(shù)據(jù)文件損壞導(dǎo)致數(shù)據(jù)庫(kù)無(wú)法啟動(dòng)詳解

一、問(wèn)題日志

2017-08-31?14:18:05?4122?[Note]?InnoDB:?Database?was?not?shutdown?normally!  2017-08-31?14:18:05?4122?[Note]?InnoDB:?Starting?crash?recovery.  2017-08-31?14:18:05?4122?[Note]?InnoDB:?Reading?tablespace?information?from?the?.ibd?files...  2017-08-31?14:18:05?4122?[ERROR]?InnoDB:?Attempted?to?open?a?previously?opened?tablespace.?Previous?tablespace?dev/tb_test?uses?spac  e?ID:?1?at?filepath:?./dev/tb_test.ibd.?Cannot?open?tablespace?mysql/innodb_table_stats?which?uses?space?ID:?1?at?filepath:?./mysql/  innodb_table_stats.ibd  2017-08-31?14:18:05?2ad861898590??InnoDB:?Operating?system?error?number?2?in?a?file?operation.  InnoDB:?The?error?means?the?system?cannot?find?the?path?specified.  InnoDB:?If?you?are?installing?InnoDB,?remember?that?you?must?create  InnoDB:?directories?yourself,?InnoDB?does?not?create?them.  InnoDB:?Error:?could?not?open?single-table?tablespace?file?./mysql/innodb_table_stats.ibd  InnoDB:?We?do?not?continue?the?crash?recovery,?because?the?table?may?becomeInnoDB:?corrupt?if?we?cannot?apply?the?log?records?in?the?InnoDB?log?to?it.  InnoDB:?To?fix?the?problem?and?start?mysqld:  InnoDB:?1)?If?there?is?a?permission?problem?in?the?file?and?mysqld?cannot  InnoDB:?open?the?file,?you?should?modify?the?permissions.  InnoDB:?2)?If?the?table?is?not?needed,?or?you?can?restore?it?from?a?backup,  InnoDB:?then?you?can?remove?the?.ibd?file,?and?InnoDB?will?do?a?normal  InnoDB:?crash?recovery?and?ignore?that?table.  InnoDB:?3)?If?the?file?system?or?the?disk?is?broken,?and?you?cannot?remove  InnoDB:?the?.ibd?file,?you?can?set?innodb_force_recovery?>?0?in?my.cnf  InnoDB:?and?force?InnoDB?to?continue?crash?recovery?here.  150126?14:18:06?mysqld_safe?mysqld?from?pid?file?/home/mysql/mysql_app/dbdata/liuyazhuang136.pid?ended

二、解決方案

1.在my.cnf中添加如下參數(shù)

在[mysqld]組中加入:

innodb_force_recovery=6

innodb_force_recovery參數(shù)解釋:
innodb_force_recovery影響整個(gè)InnoDB存儲(chǔ)引擎的恢復(fù)狀況,默認(rèn)值為0,表示當(dāng)需要恢復(fù)時(shí)執(zhí)行所有的恢復(fù)操作。
當(dāng)不能進(jìn)行有效的恢復(fù)操作時(shí),mysql有可能無(wú)法啟動(dòng),并記錄下錯(cuò)誤日志。
innodb_force_recovery可以設(shè)置為1-6,大的數(shù)字包含前面所有數(shù)字的影響。
當(dāng)設(shè)置參數(shù)值大于0后,可以對(duì)表進(jìn)行select,create,drop操作,但insert,update或者delete這類操作是不允許的。
1(SRV_FORCE_IGNORE_CORRUPT):忽略檢查到的corrupt頁(yè)
2(SRV_FORCE_NO_BACKGROUND):阻止主線程的運(yùn)行,如主線程需要執(zhí)行full purge操作,會(huì)導(dǎo)致crash
?3(SRV_FORCE_NO_TRX_UNDO):不執(zhí)行事務(wù)回滾操作。
4(SRV_FORCE_NO_IBUF_MERGE):不執(zhí)行插入緩沖的合并操作。
5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存儲(chǔ)引擎會(huì)將未提交的事務(wù)視為已提交。
6(SRV_FORCE_NO_LOG_REDO):不執(zhí)行前滾的操作。

2.備份數(shù)據(jù)庫(kù)

$mysqldump?-h?192.168.209.136?-uroot?-p?dev?>?/home/mysql/dev.sql

3.刪除數(shù)據(jù)庫(kù)

$mysql?-h?192.168.209.136?-uroot?-p  mysql>?drop?database?dev;  ERROR?1051?(42S02):?Unknown?table?'dev.tb_test'

物理刪除tb_test對(duì)應(yīng)的frm和ibd文件

mysql>?drop?database?dev;  Query?OK,?0?rows?affected?(0.00?sec)

4.創(chuàng)建數(shù)據(jù)庫(kù)

mysql>?create?database?dev;  Query?OK,?1?row?affected?(0.03?sec)

5.去掉參數(shù)innodb_force_recovery
將之前設(shè)置的參數(shù)去掉后,重新啟動(dòng)數(shù)據(jù)庫(kù)

##innodb_force_recovery=6

6.導(dǎo)入數(shù)據(jù)

[mysql@liuyazhuang136?dev]$?mysql?-h?192.168.209.136?-uroot?-pmysql?dev/mysql/dev.sql  Warning:?Using?a?password?on?the?command?line?interface?can?be?insecure.  ERROR?1050?(42S01)?at?line?25:?Table?'`dev`.`tb_test`'?already?exists

提示表已經(jīng)存在,這是因?yàn)閷nnodb_force_recovery參數(shù)去掉后,數(shù)據(jù)庫(kù)會(huì)進(jìn)行回滾操作,會(huì)生成相應(yīng)的ibd文件,所有需要將該文件刪除掉.
刪除后重新導(dǎo)入

[mysql@liuyazhuang136?dev]$?mysql?-h?192.168.209.136?-uroot?-pmysql?dev/mysql/dev.sql

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊7 分享