數據庫損壞原因多樣(斷電、磁盤故障、誤操作),恢復策略需分級:修復 > 還原備份+重放 Binlog > 最後手段。本文系統梳理 MyISAM/InnoDB 表級與庫級恢復全流程。
myisamchk -r tbl_name 或 SQL REPAIR TABLE tbl_name。innodb_force_recovery=1..6 分級搶救、或 CHECK TABLE 檢測。恢復點 = 最近一次全量備份 + 其後所有 Binlog 事務
前提:**必須開啟 Binlog (log-bin)**,且備份時記錄 Binlog 位點 (--master-data=2)。
mysql -u root -p db_name < full_backup.sqlhead -30 full_backup.sql | grep 'CHANGE MASTER'mysql -u root -p --one-database db_name < binlog.xxxmysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p --one-database db_namesed/awk 或 mysqldump -t db tbl 重導)。mysqlbinlog --database=db --table=tbl 過濾**。SELECT * INTO OUTFILE 導出 → 導入生產庫。--master-data=2 備份:按第二梯隊恢復到誤操作前位點 (mysqlbinlog --stop-position=XXX)。mysqlbinlog --start-datetime="..." --stop-datetime="..." binlog.* | mysql -u root -pDROP:innodb_force_recovery=1 啟動 → 可能在數據字典中殘留表定義 → 用 CREATE TABLE ... ENGINE=InnoDB 重建結構 → ALTER TABLE ... DISCARD/IMPORT TABLESPACE 掛載 .ibd (高風險,需專家介入)。| 層級 | 措施 | RPO/RTO 目標 |
|---|---|---|
| 架構 | 主從/集群 (MGR/Galera)、異地只讀實例 | RPO=0, RTO=秒級 |
| 備份 | 每日全量 + Binlog 增量、異地存儲、定期演練 | RPO=小時級, RTO=小時級 |
| 權限 | 最小權限、生產只讀賬號、DDL 需審批流程 | 防誤操作源頭 |
| 監控 | 磁盤空間、複製延遲、錯誤日誌、suspect_pages | 早發現、早介入 |
REPAIR TABLE/崩潰恢復),成本最低。