首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 1067 錯誤導致服務無法啟動:InnoDB 損壞後刪除 ibdata1/ib_logfile 重建實戰

     編輯:MySQL 資料庫相關知識

MySQL 1067 錯誤急救:InnoDB 系統表空間損壞強制重建

斷電/殺進程導致 InnoDB 系統表空間 (ibdata1) 或重做日誌 (ib_logfile0/1) 損壞,服務啟動報 1067 進程意外終止。若無可用備份,唯一出路:刪除損壞檔案、讓 MySQL 重新初始化系統表空間、再導入邏輯備份。

錯誤現象

net start mysql
# 系統發生 1067 錯誤
# 錯誤日誌顯示:
# InnoDB: Database was not shut down normally!
# InnoDB: Starting crash recovery...
# InnoDB: Error: space header page consists of zero bytes
# InnoDB: Corruption of log file...

強制重建步驟 (資料將遺失,謹慎操作)

  1. 停止服務:net stop mysql / systemctl stop mysqld。
  2. 備份原資料目錄 (以防萬一):
    mv /var/lib/mysql /var/lib/mysql_bak_$(date +%F)
  3. 刪除 InnoDB 核心檔案 (在原 datadir 下):
    rm -f ibdata1 ib_logfile0 ib_logfile1
    注意:此操作會清空所有 InnoDB 表資料 (含系統表 mysql.*),MyISAM 表不受影響。
  4. 啟動服務:MySQL 會自動建立新的 ibdata1、ib_logfile*、系統表。
    systemctl start mysqld
  5. 導入邏輯備份:
    mysql -uroot -p < full_backup.sql
    若無備份,資料永久遺失。
  6. 驗證:SHOW DATABASES; SHOW TABLES; SELECT COUNT(*) FROM key_tables;

關鍵檔案說明

檔案作用刪除後果
ibdata1系統表空間:資料字典、Undo Log、雙寫緩衝、插入緩衝、部分用戶表資料 (未啟用 file_per_table)所有 InnoDB 表結構與資料遺失
ib_logfile0/1Redo Log (重做日誌),環狀寫入,崩潰恢復核心啟動時重建,無資料遺失 (若 ibdata1 完整)
*.ibd獨立表空間 (file_per_table=ON 時)不刪除,保留用戶表資料

避免資料遺失的預防體系

  • 邏輯備份:每日 mysqldump --single-transaction --master-data=2 --routines --triggers --events --all-databases。
  • 物理備份:Percona XtraBackup 熱備份,支援增量、壓縮、加密、流式傳輸。
  • Binlog 保留:expire_logs_days=7,配合 sync_binlog=1 確保不丟事務。
  • 主從複制:從庫作熱備、離線備份、延遲從庫 (防誤刪)。
  • 雙寫緩衝:innodb_doublewrite=ON (預設),防止半寫頁。
  • 監控告警:磁碟空間、InnoDB 錯誤日誌關鍵字、服務存活狀態。

替代嘗試 (若 ibdata1 僅輕微損壞)

  1. 啟用 innodb_force_recovery = 1..6 (漸進式),嘗試 mysqldump 導出資料。
  2. 級別 1 (SRV_FORCE_IGNORE_CORRUPT) 僅跳過壞頁;級別 6 (SRV_FORCE_NO_LOG_REDO) 不重做日誌,風險最高。
  3. 導出成功後,按上述流程重建再導入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved