MySQL數據頁損壞問題的場景
瀏覽量: 次 發布日期:2023-09-08 13:47:26
MySQL數據頁損壞問題的場景
數據庫的數據文件損壞,算是比較頭疼的一個問題了,技術社群的這篇文章《故障解析 | 生產環境遇到 MySQL 數據頁損壞問題如何解決?》給我們介紹了MySQL數據庫中數據page損壞的場景,值得借鑒學習。
四月份的時候,遇到一次實例異常 crash 的問題。當時數據庫自動重啟,未對生產造成影響,未做處理,但是還是記錄了下錯誤信息,錯誤日志中有如下信息,
因為當時自動恢復了,并未重視這個問題,然后六月份的時候實例又 crash 了。查看報錯信息,報錯信息如下,
兩次的報錯信息很相似,出現一次是偶然,兩次就值得重視了。雖然之前很幸運未對生產造成影響,但是如果后面哪一天異常了導致實例無法啟動,那不就是妥妥的一個生產故障嘛,作為 DBA 要有憂患意識,必須要提前準備好應對之策,針對此類問題,該如何排查以及解決?通過查閱資料和向前輩請教,也算有所收獲,想著如果有其他同學遇到類似問題也可作為參考,于是有了此文。
一般來說,數據頁損壞,錯誤日志中都會顯示具體的 page number,其他情況暫不考慮。在此前提下,根據實例狀態可以將數據頁損壞分為以下兩種場景:實例能正常啟動實例無法正常啟動
場景不同,處理方法也略有不同,下面分別展開詳細分析。
此時借助通過錯誤日志中的信息,可以通過查詢元數據表獲取數據頁所屬信息。考慮生產環境信息安全,在測試環境建立測試表進行展示。
測試環境表結構如下,
根據錯誤信息中提示的 page number 信息來查看數據頁信息,查詢方式如下,
注意:查詢 INNODB_BUFFER_PAGE 系統表[1] 會對性能有影響,因此不建議隨意在生產環境執行。
另外,如果錯誤日志中有提示 和 相關信息,則也可以通過如下方式(涉及 INNODB_SYS_INDEXES[2] 和 INNODB_SYS_TABLES[3] 系統表 )進行查詢,
根據上面的查詢結果,確定損壞的頁是屬于主鍵還是輔助索引,如果屬于主鍵索引,因為在 MySQL 中索引即數據,則可能會導致數據丟失,如果是輔助索引,刪除索引重建即可。
此時可以通過兩種方式嘗試拉起實例。
使用 innodb_force_recovery[4] 參數進行強制拉起 MySQL 實例。
正常情況下 值應該設置為 0。當緊急情況下實例無法正常啟動時可以嘗試將其設置為 >0 的值,強制拉起實例然后將數據邏輯備份導出進行恢復。 值最高支持設置到 6,但是值為 4 或更大可能會永久損壞數據文件。因此當強制 InnoDB 恢復時,應始終以 開頭,并僅在必要時遞增該值。
使用 inno_space[5] 工具進行數據文件進行修復。
inno_space 是一個可以直接訪問 InnoDB 內部文件的命令行工具,可以通過該工具查看 MySQL 數據文件的具體結構,修復 。更多參考[6]
如果 InnoDB 表文件中的 page 損壞,導致實例無法啟動,可以嘗試通過該工具進行修復,如果損壞的只是 ,inno_space 可以將 跳過,從而保證實例能夠啟動,并且將絕大部分的數據找回。示例,
經過前面分析,了解數據頁損壞場景的處理方式。哪怕極端場景下,也可以做到從容不慌,盡可能少丟數據甚至能夠不丟數據。但是如果是生產環境,尤其是金融行業,是無法容忍丟失一條數據的,比較有可能這一條數據就涉及幾個小目標,因此,重要的事情說三遍,一定要備份!一定要備份!一定要備份![1]
innodb_buffer_page: https://dev.mysql.com/doc/refman/5.7/en/information-schema-innodb-buffer-page-table.html[2]
阜陽數據恢復innodb_sys_indexes: https://dev.mysql.com/doc/refman/5.7/en/information-schema-innodb-sys-indexes-table.html[3]
innodb_sys_table: https://dev.mysql.com/doc/refman/5.7/en/information-schema-innodb-sys-tables-table.html[4]
innodb_force_recovery: https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html[5]
inno_space: https://github.com/baotiao/inno_space[6]
inno_space 工具介紹: http://mysql.taobao.org/monthly/2021/11/02/
如果您認為這篇文章有些幫助,還請不吝點下文章末尾的"點贊"和"在看",或者直接轉發pyq,
近期更新的文章:《MySQL導入導出數據表容量的一個問題場景》《查詢字段的數量對查詢效率的影響》
《定位磁盤性能問題的武器》《MySQL客戶端連接提示1045錯誤的幾種可能場景》《ChatGPT斗智斗勇過程》近期的熱文:《推薦一篇Oracle RAC Cache Fusion的經典論文》《"紅警"游戲開源代碼帶給我們的震撼》文章分類和索引:《公眾號1200篇文章分類和索引》
宿州數據恢復