MySQL磁盤壞塊處理的全流程
MySQL 磁盤壞塊問題的處理總體流程
下面是推薦的分階段處理流程,適用于生產(chǎn)環(huán)境,強(qiáng)調(diào)數(shù)據(jù)保護(hù)、風(fēng)險(xiǎn)評(píng)估、逐步推進(jìn):
第一階段:?jiǎn)栴}確認(rèn)與隔離
1.1 檢查 MySQL 日志確認(rèn)癥狀
查看 mysqld.err
或 MySQL 日志是否存在以下關(guān)鍵詞:
InnoDB: Operating system error number 5
InnoDB: Unable to read page
InnoDB: corruption
Got error -1 from storage engine
IO error 5
/IO error 13
- 實(shí)例崩潰、自動(dòng)重啟堆棧信息(signal 11)
1.2 確認(rèn)是否磁盤 I/O 層問題
使用如下工具:
dmesg | grep -i error dmesg | grep -i sda # 根據(jù)你使用的磁盤設(shè)備
重點(diǎn)關(guān)注如:
Buffer I/O error on device /dev/sda3, logical block 123456 EXT4-fs error (device sda3): ...
第二階段:應(yīng)急保護(hù)與備份
2.1 立即備份其他健康數(shù)據(jù)
- 使用
mysqldump
、xtrabackup
、cp
等方式備份未受影響的庫(kù)/表。 - 防止壞塊擴(kuò)大損害。
2.2 停止寫入請(qǐng)求
可通過 FLUSH TABLES WITH READ LOCK;
鎖定全局讀取;
或直接將 MySQL 實(shí)例切換為只讀:
SET GLOBAL read_only = ON;
第三階段:診斷壞塊位置與影響
3.1 使用 badblocks 工具檢測(cè)磁盤壞塊
badblocks -sv /dev/sda > badblocks.txt
- 可配合
fsck
、e2fsck
使用映射壞塊文件排查表空間損壞。
3.2 確認(rèn)受損數(shù)據(jù)文件位置(特別是 .ibd 文件)
ls -lh /var/lib/mysql/databasename/ file /var/lib/mysql/databasename/table.ibd
可配合 strace -f -p $(pidof mysqld)
跟蹤是否某個(gè) .ibd
文件訪問時(shí)報(bào)錯(cuò)。
第四階段:修復(fù)受影響表或表空間
4.1 若只影響單表,可嘗試以下修復(fù)操作:
方法A:導(dǎo)出可導(dǎo)出的數(shù)據(jù)后刪除表
SELECT * FROM problem_table INTO OUTFILE '/tmp/backup.csv'; TRUNCATE TABLE problem_table; DROP TABLE problem_table;
方法B:將表移出數(shù)據(jù)目錄再嘗試 DROP
systemctl stop mysqld mv /var/lib/mysql/dbname/problem_table.ibd /tmp/ systemctl start mysqld # 然后登錄 MySQL 執(zhí)行: DROP TABLE dbname.problem_table;
注意這樣會(huì)讓 InnoDB 報(bào)告表空間文件不存在,但通??商^ DROP 階段的 crash。
方法C:使用 innodb_force_recovery
修復(fù)
編輯 my.cnf
添加:
[mysqld] innodb_force_recovery=1
數(shù)值從 1 到 6 逐級(jí)遞增(數(shù)值越高風(fēng)險(xiǎn)越大,建議從 1 開始測(cè)試)
然后重啟 MySQL,再嘗試導(dǎo)出或 DROP 表。
第五階段:系統(tǒng)層修復(fù)或替換磁盤
5.1 標(biāo)記/屏蔽壞塊(臨時(shí)措施,不推薦長(zhǎng)期使用)
e2fsck -l badblocks.txt /dev/sda3
5.2 若壞塊不可控,推薦更換磁盤
- 使用
ddrescue
拷貝數(shù)據(jù)至新磁盤; - 全量備份 + 恢復(fù)到新設(shè)備是最終手段。
附:innodb_force_recovery 參數(shù)說明
值 | 含義 | 風(fēng)險(xiǎn)級(jí)別 |
---|---|---|
1 | 跳過 insert buffer 的恢復(fù) | 安全 |
2 | 跳過 redo log 的應(yīng)用 | 中 |
3 | 跳過 undo log 恢復(fù) | 中 |
4 | 不執(zhí)行 purge 操作 | 高 |
5 | 不執(zhí)行 insert buffer 合并 | 高 |
6 | 禁止雙寫緩沖,跳過一切恢復(fù)流程 | 極高 |
總結(jié):MySQL 磁盤壞塊處理建議
步驟 | 行動(dòng) | 目的 |
---|---|---|
1 | 確認(rèn)日志、dmesg、壞塊位置 | 確認(rèn)是否真為磁盤故障 |
2 | 備份健康數(shù)據(jù) | 防止壞塊擴(kuò)散影響 |
3 | 使用 TRUNCATE 或 rename + DROP | 規(guī)避觸發(fā) I/O 錯(cuò)誤 |
4 | 啟用 innodb_force_recovery 修復(fù) | 數(shù)據(jù)導(dǎo)出和表結(jié)構(gòu)清理 |
5 | 標(biāo)記壞塊或更換磁盤 | 根除問題源頭 |
如果你能提供 mysqld.err
或 dmesg
日志中具體的報(bào)錯(cuò)信息,我可以幫你進(jìn)一步診斷。需要我協(xié)助你寫具體的修復(fù)操作腳本也可以。
到此這篇關(guān)于MySQL磁盤壞塊處理的全流程的文章就介紹到這了,更多相關(guān)MySQL磁盤壞塊處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 8中新增的這三大索引 隱藏、降序、函數(shù)
這篇文章主要介紹了MySQL 8.x版本中新增的三大索引 隱藏索引、降索引序、函數(shù)索引,如果文章對(duì)你有點(diǎn)幫助,小伙伴們點(diǎn)贊、收藏、評(píng)論、分享走起呀2021-09-09MySQL分表和分區(qū)的具體實(shí)現(xiàn)方法
這篇文章主要介紹了MySQL分表和分區(qū)的具體實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-06-06MySQL 出現(xiàn)錯(cuò)誤1418 的原因分析及解決方法
這篇文章主要介紹了MySQL 出現(xiàn)錯(cuò)誤1418 的原因分析及解決方法的相關(guān)資料,需要的朋友可以參考下2016-11-11