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

MySQL 啟動失敗排查實戰日記:從 SELinux 到 InnoDB 表空間的 7 輪博弈

     編輯:MySQL 資料庫相關知識

前言

一次看似簡單的 MySQL 重啟,卻演變成長達數小時的「解謎遊戲」。本文還原 CentOS 5.2 + MySQL 5.0.45 環境下,從配置錯誤、SELinux 策略、InnoDB 表空間不匹配、權限表缺失到 Binlog/Slow Log 文件缺失的完整排查過程,為老版本環境維護提供參考,更展示系統級故障診斷的通用方法論。

環境基線

  • OS: CentOS 5.2 (Final), Kernel 2.6.18
  • MySQL: 5.0.45 (RPM 安裝)
  • SELinux: Enforcing 模式
  • 存儲引擎: InnoDB (主力)
  • 關鍵配置: innodb_buffer_pool_size=2G, innodb_data_home_dir=/var/lib/mysql/ibdata, socket=/tmp/mysql.sock

第 1 輪:默認存儲引擎不可用

錯誤日誌

[ERROR] Default storage engine (InnoDB) is not available
[ERROR] Aborting

原因

配置文件指定 innodb_data_home_dir = /var/lib/mysql/ibdata,但該目錄不存在或權限錯誤,導致 InnoDB 初始化失敗,MySQL 禁用 InnoDB,隨後因默認引擎不可用而退出。

解決

創建目錄並授權:mkdir -p /var/lib/mysql/ibdata && chown -R mysql:mysql /var/lib/mysql/ibdata。或註釋該行使用默認路徑。

第 2 輪:表空間大小不匹配 + Socket 權限

錯誤日誌

InnoDB: Error: auto-extending data file ./ibdata1 is of a different size
InnoDB: 640 pages ... than specified in the .cnf file: initial 32000 pages
[ERROR] Can't start server: Bind on unix socket: Permission denied
[ERROR] Do you already have another mysqld server running on socket: /tmp/mysql.sock?

原因

  1. ibdata1 大小不匹配:配置文件 innodb_data_file_path = ibdata1:500M:autoextend 要求初始 500M,但現有文件只有 640 頁 (~10MB)。InnoDB 拒絕啟動保護數據。
  2. SELinux 封鎖 Socket:/tmp/mysql.sock 文件上下文錯誤 (可能是手動 mv 產生),SELinux 禁止 mysqld 訪問。

解決

  1. 修正配置匹配現狀,或刪除舊 ibdata1 讓其按配置重建 (需配合 ib_logfile 刪除,**數據將丟失**)。
  2. SELinux 臨時放行:setsebool -P mysqld_disable_trans 1 (禁用 mysqld 域轉換)。長期需 restorecon -Rv /var/lib/mysql 修復上下文。

第 3 輪:InnoDB 目錄缺失

錯誤日誌

InnoDB: Operating system error number 2 in a file Operation.
InnoDB: The error means the system cannot find the path specified.
InnoDB: File name /var/lib/mysql/ibdata/ibdata1

解決

清理舊殘留文件,重建目錄結構:

rm -rf /var/lib/mysql/ibdata/*
rm -rf /var/lib/mysql/iblogs/*
mkdir -p /var/lib/mysql/ibdata /var/lib/mysql/iblogs
chown -R mysql:mysql /var/lib/mysql/ibdata /var/lib/mysql/iblogs

第 4 輪:系統權限表缺失

錯誤日誌

[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist

原因

數據目錄為空或系統庫損壞,缺少 mysql.user, mysql.host 等核心表。

解決

/usr/bin/mysql_install_db --user=mysql
# 或 5.7+/8.0: mysqld --initialize-insecure --user=mysql

第 5 輪:Binlog 文件缺失

錯誤日誌

/usr/libexec/mysqld: File './mysql-bin.000008' not found (Errcode: 13)
[ERROR] Failed to open log (file './mysql-bin.000008', errno 13)
[ERROR] Could not open log file

原因

配置啟用 log-bin,但索引文件 mysql-bin.index 記錄的文件 mysql-bin.000008 實際不存在 (可能被手動刪除或遷移遺漏)。Errno 13 實為權限或文件不存在誤導。

解決

  1. 註釋 log-bin 啟動。
  2. 啟動後執行 RESET MASTER; 清理 Binlog 索引。
  3. 重新啟用 log-bin 重啟。

第 6 輪:Slow Query Log 文件缺失

錯誤日誌

/usr/libexec/mysqld: File '/var/lib/mysql/testbox-04-slow.log' not found (Errcode: 13)
[ERROR] Could not use /var/lib/mysql/testbox-04-slow.log for logging

解決

註釋 log_slow_queries 和 long_query_time,或創建文件並授權:touch /var/lib/mysql/testbox-04-slow.log && chown mysql:mysql ...。

第 7 輪:權限表文件權限/上下文最終決戰

錯誤日誌

[ERROR] /usr/libexec/mysqld: Can't find file: './mysql/host.frm' (errno: 13)
[ERROR] Fatal error: Can't open and lock privilege tables

根因

mysql_install_db 默認以 root 身份運行創建的文件屬主為 root,或 SELinux 上下文錯誤,導致 mysqld 進程 (mysql 用戶) 無法讀取 /var/lib/mysql/mysql/ 下文件。

終極解決

# 重新以 mysql 用戶初始化
/usr/bin/mysql_install_db --user=mysql

# 修正 Socket 路徑至 SELinux 允許的標準目錄
# my.cnf:
[mysqld]
socket = /var/lib/mysql/mysql.sock
[client]
socket = /var/lib/mysql/mysql.sock

# 重新啟用 SELinux 保護
setsebool -P mysqld_disable_trans 0
restorecon -Rv /var/lib/mysql

# 啟動成功!
service mysqld start
# Starting MySQL: [  OK  ]

核心經驗總結

  1. 錯誤日誌是唯一真理:tail -f /var/log/mysqld.log 必須全程跟蹤,不要憑猜測。
  2. SELinux 是隱形殺手:CentOS/RHEL 環境下,文件上下文錯誤 (errno 13) 是高發難點。善用 sealert -a /var/log/audit/audit.log 分析,優先修復上下文而非永久關閉。
  3. InnoDB 表空間極其敏感:ibdata1, ib_logfile* 大小、路徑、LSN 必須與配置、內存狀態嚴格匹配。修改參數需遵循官方流程 (見文章 91377)。
  4. 系統庫初始化必須指定用戶:mysql_install_db --user=mysql 避免權限錯亂。
  5. Socket 文件放標準路徑:/var/lib/mysql/mysql.sock 受 SELinux 策略保護,/tmp/ 易衝突、上下文亂。
  6. 舊版本 (5.0/5.1) 維護成本極高:強烈建議規劃升級至 5.7/8.0,獲得原生工具 (Clone, XtraBackup 集成)、更好診斷、安全性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved