故障解析
瀏覽量: 次 發布日期:2023-10-09 22:41:30
故障解析
作者:徐文梁
愛可生 DBA 成員,一個執著于技術的數據庫工程師,主要負責數據庫日常運維工作。擅長 MySQL,Redis 及其他常見數據庫也有涉獵;喜歡垂釣,看書,看風景,結交新朋友。
本文來源:原創投稿
* 愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯系小編并注明來源。
四月份的時候,遇到一次實例異常 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/
本文關鍵字:#MySQL# #inno_space# #InnoDB#
SQLE 是一款面向數據庫使用者和管理者,支持多場景審核,支持標準化上線流程,原生支持 MySQL 審核且數據庫類型可擴展的 SQL 審核工具。目前支持各種數據庫規則 700+。
? Github https://github.com/actiontech/sqle
? 文檔 https://actiontech.github.io/sqle-docs/
? 官網 https://opensource.actionsky.com/sqle/