一、InnoDB壞頁出現(xiàn)情況
由于物理磁盤、內(nèi)存故障、突然斷電、強制關機、強制殺死MySQL進程等可能會造成數(shù)據(jù)壞頁現(xiàn)象,數(shù)據(jù)庫實例會不斷重啟。
錯誤日志內(nèi)報如下錯誤:
InnoDB: Database page corruption on disk or a failed
InnoDB: file read of page
現(xiàn)根據(jù)以上現(xiàn)象,對該問題進行處理分析。本方案針對InnoDB引擎進行壞頁修復。進行災難恢復大概率會造成造成一部分數(shù)據(jù)的丟失。
二、InnoDB壞頁修復步驟
本文檔只介紹使用innodb_force_recovery參數(shù)進行數(shù)據(jù)庫強制打開的方式。
2.1 對數(shù)據(jù)目錄進行冷備
關閉數(shù)據(jù)庫實例,對數(shù)據(jù)目錄進行冷備。
shell> tar –cvf data.tar data
2.2 查看錯誤日志內(nèi)容
查詢錯誤日志路徑
SQL> show variables like 'log_error';
+---------------+------------+
| Variable_name | Value |
+---------------+------------+
| log_error | ./test.err |
+---------------+------------+
注:該路徑即為datadir目錄下
shell> tail -3000f /var/lib/mysql/data/test.err
判斷此時數(shù)據(jù)庫是否已經(jīng)無法正常運行
2.3 修改相關參數(shù)啟動服務
shell> vi /etc/my.cnf
innodb_force_recovery=1
注:
innodb_force_recovery = 2~6,依次啟動服務器直至可以訪問有問題的表。
innodb_force_recovery參數(shù)解析
innodb_force_recovery可以設置為1-6,大的數(shù)字包含前面所有數(shù)字的影響。 當設置參數(shù)值大于0后,可以對表進行select,create,drop操作,但insert,update或者delete這類操作是不允許的。
1 (SRV_FORCE_IGNORE_CORRUPT):忽略檢查到的corrupt頁
2 (SRV_FORCE_NO_BACKGROUND):阻止主線程的運行,如主線程需要執(zhí)行full purge操作,會導致crash
3 (SRV_FORCE_NO_TRX_UNDO):不執(zhí)行事務回滾操作。
4 (SRV_FORCE_NO_IBUF_MERGE):不執(zhí)行插入緩沖的合并操作。
5 (SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存儲引擎會將未提交的事務視為已提交。
6 (SRV_FORCE_NO_LOG_REDO):不執(zhí)行前滾的操作。
2.4 進行全庫導出
1
shell> mysqldump -uroot -pmysql --master-data=2 -E -R --all-databases > full.sql
2.5 新環(huán)境同版本初始化環(huán)境
1
shell> /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/var/lib/mysql --user=mysql
注:basedir/datadir根據(jù)實際情況修改
2.6 新環(huán)境導入數(shù)據(jù)
1
shell> mysql -uroot -p < full.sql