Windows 環境下 MySQL 服務啟動報錯 「錯誤 1067:進程意外終止」 是最常見的部署故障。原因通常集中在配置檔路徑錯誤、資料目錄權限、基礎目錄設定、端口衝突、殘留進程五大類。本文提供標準化排查流程、最小可用配置範本、常見錯誤對照表與一鍵修復腳本,助您 10 分鐘內定位解決。
type C:\ProgramData\MySQL\MySQL Server 8.0\Data\.err
或配置檔指定的 log-error 路徑。搜尋 [ERROR]、InnoDB:、Can't、Failed 關鍵字。
mysqld --help --verbose 2>&1 | findstr /C:"Default options"
確認實際讀取的 my.ini 路徑 (通常為 C:\Windows\my.ini、C:\ProgramData\MySQL\MySQL Server 8.0\my.ini、安裝目錄 my.ini)。
basedir = MySQL 安裝根目錄 (含 bin、share)datadir = 資料檔目錄 (含 .ibd、.frm、ibdata1、redo log)netstat -ano | findstr :3306
若被佔用,taskkill /PID /F 或修改 port 參數。
taskkill /IM mysqld.exe /F
del /data/mysql/data/*.pid /data/mysql/data/*.lock 2>nul
cd /d "C:\Program Files\MySQL\MySQL Server 8.0\bin"
mysqld --console --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini"
控制台直接輸出啟動日誌,錯誤一目瞭然。
[mysqld]
# === 必須正確設定的三大路徑 ===
basedir=C:/Program Files/MySQL/MySQL Server 8.0
datadir=C:/ProgramData/MySQL/MySQL Server 8.0/Data
# tmpdir=C:/Windows/Temp # 可選
# === 基礎網路 ===
port=3306
bind-address=0.0.0.0
skip_name_resolve=ON
# === InnoDB 基礎 ===
innodb_buffer_pool_size=512M
innodb_log_file_size=128M
innodb_file_per_table=ON
# === 字符集 ===
character_set_server=utf8mb4
collation_server=utf8mb4_unicode_ci
# === 日誌 ===
log-error=C:/ProgramData/MySQL/MySQL Server 8.0/Logs/error.log
slow_query_log=1
slow_query_log_file=C:/ProgramData/MySQL/MySQL Server 8.0/Logs/slow.log
long_query_time=2
# === 其他 ===
max_connections=200
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
default_authentication_plugin=mysql_native_password
關鍵點:
- 路徑**全程正斜線 /** (Windows 也支援),避免轉義地獄。
basedir指向安裝目錄 (含 bin、share),datadir指向資料目錄,**兩者不同**。- 目錄必須存在且 MySQL 服務帳戶 (LocalSystem 或指定用戶) 有讀寫權限。
- 日誌目錄
Logs需手動建立。
| 錯誤日誌關鍵字 | 根因 | 解決方案 |
|---|---|---|
Can't create test file ... lower-test | datadir 路徑錯誤、權限不足、目錄不存在 | 修正 datadir、建立目錄、icacls 授權 |
Unknown variable 'basedir=...' | 配置檔編碼問題 (BOM/全形字符)、參數名拼寫錯 | 用 Notepad++ 轉 UTF-8 無 BOM、檢查拼寫 |
InnoDB: Operating system error number 13 | 資料目錄/檔案權限不足 | 右鍵目錄 → 安全 → SYSTEM/Administrators/Users 完全控制 |
InnoDB: Cannot open datafile .\ibdata1 | ibdata1 遺失、路徑錯、被佔用 | 確認 datadir 正確、刪除舊 ibdata1 (全新初始化)、殺掉佔用進程 |
InnoDB: Log file .\ib_logfile0 is of different size | innodb_log_file_size 變更但舊檔未刪 | 停止服務 → 刪除 datadir 下 ib_logfile* → 重啟 (會自動重建) |
Address already in use / Can't start server: Bind on TCP/IP port | 3306 端口被佔用 | netstat -ano 找 PID → taskkill /F /PID 或改 port |
Plugin 'caching_sha2_password' cannot be loaded | 預設認證插件載入失敗 (通常伴隨升級) | my.cnf 加 default_authentication_plugin=mysql_native_password 並重置密碼 |
Failed to set up SSL / SSL error | SSL 憑證遺失/權限/路徑錯 | 執行 mysql_ssl_rsa_setup 或暫時 skip_ssl=ON |
InnoDB: Database was not shutdown normally! | 上次非正常關機 (強制關機/崩潰) | 正常啟動即可,InnoDB 會自動 Crash Recovery (Redo Log 重放) |
InnoDB: Corruption of log file | Redo Log 損壞 | 啟用 innodb_force_recovery=1..6 導出資料重建 (見下節) |
當 InnoDB 元數據損壞導致無法啟動,可嘗試強制恢復模式導出資料:
# 1. 編輯 my.ini,在 [mysqld] 區段加入
innodb_force_recovery = 1 # 從 1 開始嘗試,最大 6
# 2. 啟動服務 (若成功)
net start MySQL80
# 3. 導出所有資料
mysqldump -uroot -p --all-databases --single-transaction > rescue.sql
# 4. 停止服務、移除 force_recovery、重建資料目錄
net stop MySQL80
# 移除 my.ini 中 force_recovery 行
# 刪除 datadir 所有檔案 (備份優先)
# 重新初始化
mysqld --initialize-insecure --user=mysql --basedir=... --datadir=...
# 5. 正常啟動、還原資料
net start MySQL80
mysql -uroot -p < rescue.sql
force_recovery 級別說明:原則:從 1 開始,能啟動即導出,**不可在生產業務中長期運行 force_recovery > 0**。
- 1 (SRV_FORCE_IGNORE_CORRUPT):忽略損壞頁面,繼續運行。
- 2 (SRV_FORCE_NO_BACKGROUND):停止背景執行緒 (Purge、Merge)。
- 3 (SRV_FORCE_NO_TRX_UNDO):不執行 Undo Log 回滾 (唯讀模式)。
- 4 (SRV_FORCE_NO_IBUF_MERGE):不合併 Insert Buffer。
- 5 (SRV_FORCE_NO_UNDO_LOG_SCAN):不掃描 Undo Log (啟動更快但可能不一致)。
- 6 (SRV_FORCE_NO_LOG_REDO):不重放 Redo Log (極度危險,最後手段)。
# MySQL_Startup_Diagnosis.ps1
$MySQLBase = "C:\Program Files\MySQL\MySQL Server 8.0"
$DataDir = "C:\ProgramData\MySQL\MySQL Server 8.0\Data"
$ConfigFile = "C:\ProgramData\MySQL\MySQL Server 8.0\my.ini"
$LogDir = "C:\ProgramData\MySQL\MySQL Server 8.0\Logs"
Write-Host "=== MySQL 1067 診斷開始 ===" -ForegroundColor Cyan
# 1. 檢查配置檔存在
if (-not (Test-Path $ConfigFile)) {
Write-Host "❌ 配置檔不存在: $ConfigFile" -ForegroundColor Red
} else {
Write-Host "✅ 配置檔存在" -ForegroundColor Green
# 檢查關鍵參數
$Content = Get-Content $ConfigFile -Raw
if ($Content -match 'basedir\s*=') { Write-Host "✅ basedir 已設定" -ForegroundColor Green }
else { Write-Host "⚠️ 缺少 basedir" -ForegroundColor Yellow }
if ($Content -match 'datadir\s*=') { Write-Host "✅ datadir 已設定" -ForegroundColor Green }
else { Write-Host "⚠️ 缺少 datadir" -ForegroundColor Yellow }
}
# 2. 檢查資料目錄權限
$Acl = Get-Acl $DataDir
$Access = $Acl.Access | Where-Object { $_.IdentityReference -match 'SYSTEM|Administrators' -and $_.FileSystemRights -match 'FullControl' }
if ($Access) { Write-Host "✅ 資料目錄權限正常" -ForegroundColor Green }
else { Write-Host "❌ 資料目錄權限不足,請手動授權" -ForegroundColor Red }
# 3. 檢查端口佔用
$Port = 3306
$NetStat = netstat -ano | Select-String ":$Port "
if ($NetStat) {
Write-Host "⚠️ 端口 $Port 被佔用:" -ForegroundColor Yellow
$NetStat | ForEach-Object { Write-Host " $_" }
} else {
Write-Host "✅ 端口 $Port 空閒" -ForegroundColor Green
}
# 4. 殘留進程檢查
$Procs = Get-Process -Name mysqld -ErrorAction SilentlyContinue
if ($Procs) {
Write-Host "⚠️ 發現殘留 mysqld 進程:" -ForegroundColor Yellow
$Procs | ForEach-Object { Write-Host " PID $($_.Id) - $($_.Path)" }
} else {
Write-Host "✅ 無殘留進程" -ForegroundColor Green
}
# 5. 嘗試前景啟動 (5 秒超時)
Write-Host "`n=== 嘗試前景啟動診斷 (5秒) ===" -ForegroundColor Cyan
$Proc = Start-Process -FilePath "$MySQLBase\bin\mysqld.exe" -ArgumentList "--console", "--defaults-file=$ConfigFile" -PassThru -WindowStyle Hidden
Start-Sleep 5
if (-not $Proc.HasExited) {
Write-Host "✅ 前景啟動成功 (進程未退出),配置無誤" -ForegroundColor Green
Stop-Process -Id $Proc.Id -Force
} else {
Write-Host "❌ 前景啟動失敗 (進程已退出),請檢查上方錯誤輸出" -ForegroundColor Red
}
Write-Host "`n=== 診斷完成 ===" -ForegroundColor Cyan
net stop MySQL80del /q /s C:\ProgramData\MySQL\MySQL Server 8.0\Data\*--initialize-insecure):
cd /d "C:\Program Files\MySQL\MySQL Server 8.0\bin"
mysqld --initialize-insecure --user=mysql --basedir="C:\Program Files\MySQL\MySQL Server 8.0" --datadir="C:\ProgramData\MySQL\MySQL Server 8.0\Data" --console
mysqld --install MySQL80 --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini"
net start MySQL80mysql -uroot --skip-password
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongPass123!';
MySQL 1067 錯誤 90% 由配置檔路徑錯誤、資料目錄權限、端口衝突、殘留進程引起。遵循「看日誌 → 驗配置 → 查權限 → 清殘留 → 前景啟動」五步法,配合最小可用配置範本與 PowerShell 診斷腳本,可將排查時間壓縮至 10 分鐘內。記住:**Windows 路徑用正斜線、basedir/datadir 分離、日誌目錄預建、服務帳戶授權**四大鐵律。