一次看似簡單的 MySQL 重啟,卻演變成長達數小時的「解謎遊戲」。本文還原 CentOS 5.2 + MySQL 5.0.45 環境下,從配置錯誤、SELinux 策略、InnoDB 表空間不匹配、權限表缺失到 Binlog/Slow Log 文件缺失的完整排查過程,為老版本環境維護提供參考,更展示系統級故障診斷的通用方法論。
innodb_buffer_pool_size=2G, innodb_data_home_dir=/var/lib/mysql/ibdata, socket=/tmp/mysql.sock[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。或註釋該行使用默認路徑。
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?
innodb_data_file_path = ibdata1:500M:autoextend 要求初始 500M,但現有文件只有 640 頁 (~10MB)。InnoDB 拒絕啟動保護數據。/tmp/mysql.sock 文件上下文錯誤 (可能是手動 mv 產生),SELinux 禁止 mysqld 訪問。ibdata1 讓其按配置重建 (需配合 ib_logfile 刪除,**數據將丟失**)。setsebool -P mysqld_disable_trans 1 (禁用 mysqld 域轉換)。長期需 restorecon -Rv /var/lib/mysql 修復上下文。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
[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
/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 實為權限或文件不存在誤導。
log-bin 啟動。RESET MASTER; 清理 Binlog 索引。log-bin 重啟。/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 ...。
[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 ]
tail -f /var/log/mysqld.log 必須全程跟蹤,不要憑猜測。sealert -a /var/log/audit/audit.log 分析,優先修復上下文而非永久關閉。ibdata1, ib_logfile* 大小、路徑、LSN 必須與配置、內存狀態嚴格匹配。修改參數需遵循官方流程 (見文章 91377)。mysql_install_db --user=mysql 避免權限錯亂。/var/lib/mysql/mysql.sock 受 SELinux 策略保護,/tmp/ 易衝突、上下文亂。