首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL InnoDB 常見錯誤排查實戰:PID 文件遺失、Tablespace 衝突、持久統計缺失

     編輯:MySQL 綜合教學

案例背景

  • 阿里雲 ECS,MySQL 5.6
  • 服務頻繁自動停止,service mysql start 報錯:
    Starting MySQL.. ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid).

第一輪:刪除 ib_logfile 嘗試(治標不治本)

  1. 查 datadir:cat /etc/my.cnf | grep datadir → /var/lib/mysql
  2. 目錄下三檔:ibdata1(共享表空間)、**ib_logfile0/1(Redo Log)**
  3. 備份後刪除 ib_logfile*,重啟 → 成功
  4. 十幾分鐘後再掛,同樣錯誤 → 非日誌檔問題

第二輪:查錯誤日誌定位真兇

2013-08-04 13:48:22 760 [ERROR] InnoDB: Attempted to open a previously opened tablespace. 
Previous tablespace em/temp uses space ID: 2 at filepath: .\em\temp.ibd. 
Cannot open tablespace mysql/innodb_index_stats which uses space ID: 2 at filepath: .\mysql\innodb_index_stats.ibd

根因分析:space ID 衝突

  • space ID 2 被兩個表空間同時佔用:em/temp.ibd 與 mysql/innodb_index_stats.ibd
  • 歷史操作曾誤刪 ibdata1(共享表空間核心檔),MySQL 重建新 ibdata1 時,space ID 分配邏輯重置,導致舊 .ibd 檔的 space ID 與新系統表衝突
  • ibdata1 存儲:資料字典、Undo Log、Change Buffer、雙寫緩衝——刪除即意味著所有 InnoDB 表元數據丟失

徹底修復方案

  1. 備份所有 .frm/.ibd 檔(以防萬一)
  2. 刪除損壞資料庫的目錄(rm -rf /var/lib/mysql/em 等)
  3. 重啟 MySQL → 正常啟動
  4. 重建資料庫、匯入備份 SQL

後續:持久統計缺失警告

錯誤日誌出現:

Error: Table "mysql"."innodb_table_stats" not found.
InnoDB: Recalculation of persistent statistics requested for table "mydb"."mytable" 
but the required persistent statistics storage is not present or is corrupted. 
Using transient stats instead.

原因:mysql.innodb_table_stats、innodb_index_stats 系統表遺失(隨 ibdata1 重建而丟)。

修復參考:Percona 部落格修復腳本,核心步驟:

  錯誤現象真實原因核心對策
  
    PID file not updated實為 InnoDB 內部錯誤導致啟動中止必看 log-error 指向的錯誤日誌
    刪 ib_logfile 短暫好轉Redo log 損壞只是表象,實為資料字典衝突別只治標,要查 ERROR 日誌
    space ID 衝突歷史誤刪 ibdata1,重建後 ID 分配重置絕不手動刪 ibdata1,遷移用 mysqldump
    持久統計缺失系統統計表隨 ibdata1 遺失重建系統表 + ANALYZE TABLE
  


運維鐵律

  1. 任何異常,第一時間看錯誤日誌(log-error 路徑)
  2. ibdata1 是 InnoDB 生命線,備份策略必須包含它(xtrabackup / mysqldump + --single-transaction)
  3. 遷移/升級用 mysqldump,禁止直接複製 datadir 檔案
  4. 監控告警:mysqld.log 出現 [ERROR] 即推送

小結

「PID file 未更新」只是表象,真兇藏在 mysqld.log 的 InnoDB: [ERROR] 裡。誤刪 ibdata1 → space ID 衝突 → 系統表遺失 → 持久統計缺失 是典型連環炸。養成「看日誌、不動 ibdata1、用邏輯備份」三習慣,能避開 99% InnoDB 災難。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved