現象:Windows 服務啟動失敗,系統事件日誌記錄「服務 mysql 意外停止」,MySQL 錯誤日誌顯示:
Plugin 'FEDERATED' is disabled
InnoDB: .\ibdata1 can't be opened in read-write mode
... 1067 進程意外終止
經驗證,核心原因有二:**臨時目錄權限缺失** 與 **舊 Redo Log 文件與新配置不匹配**。
MySQL 啟動需創建臨時表文件、排序文件。若 tmpdir 指向的目錄不存在或服務用戶無權限,啟動即失敗。
[mysqld]
tmpdir = "D:/MySQL/data/tmp" # 確保目錄存在且 MYSQL 服務用戶有寫入權限
# 或使用系統臨時目錄 (需權限)
tmpdir = "C:/Windows/Temp"
mkdir D:\MySQL\data\tmp
icacls D:\MySQL\data\tmp /grant "NT SERVICE\MySQL56":(OI)(CI)F
修改 my.ini 中 innodb_log_file_size 後,舊 Redo Log 文件尺寸與配置不一致,InnoDB 拒絕啟動。
net stop MySQL56net start MySQL56 → InnoDB 自動按新尺寸創建 Redo Logdel D:\MySQL\data\ib_logfile0
del D:\MySQL\data\ib_logfile1
net start MySQL56
@echo off
REM fix_mysql_1067.bat
set DATADIR=D:\MySQL\data
set TMPDIR=D:\MySQL\data\tmp
echo [1] 停止服務...
net stop MySQL56 2>nul
timeout /t 3 /nobreak >nul
echo [2] 確保 tmpdir 存在並授權...
if not exist "%TMPDIR%" mkdir "%TMPDIR%"
icacls "%TMPDIR%" /grant "NT SERVICE\MySQL56":(OI)(CI)F /q
echo [3] 刪除舊 Redo Log...
if exist "%DATADIR%\ib_logfile0" del "%DATADIR%\ib_logfile0"
if exist "%DATADIR%\ib_logfile1" del "%DATADIR%\ib_logfile1"
echo [4] 啟動服務...
net start MySQL56
echo [5] 驗證...
mysql -u root -p -e "SHOW VARIABLES LIKE 'tmpdir'; SHOW VARIABLES LIKE 'innodb_log_file_size';"
pause
| 文件 | 作用 | 可否刪除 | 後果 |
|---|---|---|---|
| ib_logfile0 / ib_logfile1 | Redo Log (循環寫入) | 可刪 (服務停止時) | 重啟自動按配置重建,無數據損失 |
| ibdata1 | 系統表空間 (數據字典、Undo Log、雙寫緩衝、Change Buffer) | 絕不可刪 | 所有表結構、數據、事務信息永久丟失 |
| *.ibd | 獨立表空間 (file_per_table=ON) | 絕不可刪 | 對應表數據永久丟失 |
| *.frm / .sdi | 表結構定義 (5.7+ .sdi 序列化字典信息) | 絕不可刪 | 表結構丟失,數據不可讀 |
| auto.cnf | Server UUID | 可刪 (重啟自動生成新 UUID) | 主從複製可能中斷需重做 |
MySQL 1067 + FEDERATED disabled + ibdata1 can't be opened 組合拳,本質是 **啟動環境就緒檢查失敗**。雙重修復:**配置並授權 tmpdir + 刪除舊 Redo Log 讓 InnoDB 重建**。切記:**只刪 ib_logfile*,動 ibdata1 者死全家**。