MySQL資料庫InnoDB壞頁處理修復

龍山游龍發表於2021-08-11

一、InnoDB壞頁出現情況

由於物理磁碟、記憶體故障、突然斷電、強制關機、強制殺死MySQL程式等可能會造成資料壞頁現象,資料庫例項會不斷重啟。

錯誤日誌內報如下錯誤:

InnoDB: Database page corruption on disk or a failed

InnoDB: file read of page

現根據以上現象,對該問題進行處理分析。本方案針對InnoDB引擎進行壞頁修復。進行災難恢復大機率會造成造成一部分資料的丟失。

二、InnoDB壞頁修復步驟

本文件只介紹使用innodb_force_recovery引數進行資料庫強制開啟的方式。

2.1 對資料目錄進行冷備

關閉資料庫例項,對資料目錄進行冷備。

shell> tar –cvf data.tar data

2.2 檢視錯誤日誌內容

查詢錯誤日誌路徑

SQL> show variables like 'log_error';
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| log_error     | ./test.err |
+---------------+------------+

注:該路徑即為datadir目錄下

shell> tail -3000f /var/lib/mysql/data/test.err

判斷此時資料庫是否已經無法正常執行

2.3 修改相關引數啟動服務

shell> vi /etc/my.cnf
innodb_force_recovery=1

注:

innodb_force_recovery = 2~6,依次啟動伺服器直至可以訪問有問題的表。

innodb_force_recovery引數解析

innodb_force_recovery可以設定為1-6,大的數字包含前面所有數字的影響。 當設定引數值大於0後,可以對錶進行select,create,drop操作,但insert,update或者delete這類操作是不允許的。

1 (SRV_FORCE_IGNORE_CORRUPT):忽略檢查到的corrupt頁

2 (SRV_FORCE_NO_BACKGROUND):阻止主執行緒的執行,如主執行緒需要執行full purge操作,會導致crash

3 (SRV_FORCE_NO_TRX_UNDO):不執行事務回滾操作。

4 (SRV_FORCE_NO_IBUF_MERGE):不執行插入緩衝的合併操作。

5 (SRV_FORCE_NO_UNDO_LOG_SCAN):不檢視重做日誌,InnoDB儲存引擎會將未提交的事務視為已提交。

6 (SRV_FORCE_NO_LOG_REDO):不執行前滾的操作。

2.4 進行全庫匯出

shell> mysqldump -uroot -pmysql --master-data=2  -E -R --all-databases > full.sql

2.5 新環境同版本初始化環境

shell> /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/var/lib/mysql --user=mysql

注:basedir/datadir根據實際情況修改

2.6 新環境匯入資料

shell> mysql -uroot -p < full.sql


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30310891/viewspace-2786428/,如需轉載,請註明出處,否則將追究法律責任。

相關文章