常見錯誤:Table 'xxx' is marked as crashed and should be repaired、Incorrect key file for table、查詢卡死、行數不一致。
REPAIR TABLE `your_table_name`;
-- 或指定存儲引擎優化
REPAIR TABLE `your_table_name` USE_FRM;
status: OK 表示成功
.ibd/.frm/.MYD/.MYI 等文件)
systemctl stop mysqld
# 或
service mysqld stop
# 打包 (保留權限、屬性)
tar -czvf table_backup.tar.gz /var/lib/mysql/db_name/table_name.*
# 傳輸至目標服務器
scp table_backup.tar.gz user@target:/tmp/
# 目標服務器同樣停止 MySQL 後解壓覆蓋
tar -xzvf table_backup.tar.gz -C /var/lib/mysql/db_name/
chown -R mysql:mysql /var/lib/mysql/db_name/table_name.*
systemctl start mysqld
mysql -e "CHECK TABLE db_name.table_name;"
血淚教訓: 邊跑邊打包會導致 .ibd 文件內部一致性破壞 (InnoDB 表空間未刷新、Redo Log 截斷),啟動後報 Tablespace ID mismatch、Corrupted page。
黃金流程:
STOP SLAVE (如是從庫) → FLUSH TABLES WITH READ LOCK → systemctl stop mysqldtar -czvf --selinux (保留 SELinux 標籤)scp/rsync 校驗 MD5systemctl stop mysqld → 解壓覆蓋 → chown mysql:mysql → restorecon -Rv (SELinux)systemctl start mysqld → CHECK TABLE → START SLAVE| 根因 | 徵兆 | 預防措施 |
|---|---|---|
| 磁碟故障/壞道 | IO 錯誤、dmesg 報錯 | RAID 1/10、SMART 監控、定期備份驗證 |
| 強制殺進程/斷電 | 啟動時 Crash Recovery 耗時長 | UPS、innodb_flush_log_at_trx_commit=1、sync_binlog=1 |
| 磁碟空間 100% | 寫入報錯、表損壞 | 磁碟告警 80%、expire_logs_days、定期歸檔 |
| MySQL Bug/版本缺陷 | 特定版本、特定操作觸發 | 關注官方發布、及時升級補丁版本 |
| 記憶體不足 OOM Killer | 進程被殺、錯誤日誌 Out of memory | 配置 Swap、限制 innodb_buffer_pool_size、監控 RSS |
表損壞修復的核心鐵律:**修復前必備份、離線操作必停服務、跨機遷移必壓縮校驗**。phpMyAdmin 修復適用於輕度 MyISAM 損壞;InnoDB 嚴重損壞需依賴 innodb_force_recovery=1~6 分級嘗試導出數據,或從備份/從庫恢復。建立「每日全備+增量 Binlog、定期恢復演練、磁碟/記憶體/網路全鏈路監控」才是根治之道。