在 Windows XP SP2 環境下安裝 MySQL 5.0 時,執行「Apply security setting」步驟拋出 ERROR Nr.1045: Access denied for user 'root'@'localhost'。防火牆已關閉,telnet localhost 3306 連通正常,但無法完成初始化密碼設置。
net stop MySQL
mysqld-nt --skip-grant-tables
mysqladmin -uroot flush-privileges password "newpass"
mysqladmin -u root -p shutdown
net start MySQL
失敗原因:在 Step 5 執行 mysqladmin -uroot flush-privileges password "newpass" 時仍報 1045 錯誤。推測是 Windows 下 mysqld-nt --skip-grant-tables 進程未正確啟動,或權限表緩存未生效。
net stop MySQLD:\MySQL\MySQL Server 5.0\my.ini,在 [mysqld] 區段添加 skip-grant-tablesnet start MySQL,此時無需密碼即可登錄mysql -uroot
UPDATE mysql.user SET Password=PASSWORD('newpass') WHERE User='root';
FLUSH PRIVILEGES;
EXIT;
my.ini 中的 skip-grant-tablesnet restart MySQL,使用新密碼登錄成功| 維度 | 命令行 --skip-grant-tables | 配置文件 skip-grant-tables |
|---|---|---|
| 進程啟動方式 | 前台手動啟動,易受終端關閉、環境變量影響 | 作為系統服務啟動,環境完整、穩定 |
| 配置讀取順序 | 命令行參數優先級最高,但可能被服務管理器覆蓋 | 服務啟動時完整讀取 my.ini,參數生效確定 |
| 權限表加載時機 | 手動啟動時可能因路徑、用戶上下文差異導致權限表未正確加載 | 服務啟動流程標準化,權限表加載邏輯完整 |
| 適用場景 | 臨時調試、無配置文件權限時 | 生產環境、標準化運維、Windows 服務模式首選 |
本質原因:Windows 下 MySQL 作為服務運行時,服務控制管理器 (SCM) 會以 LocalSystem 賬戶啟動進程,環境變量、工作目錄、配置文件搜索路徑與當前用戶 CMD 環境截然不同。手動執行 mysqld-nt --skip-grant-tables 實際啟動的是獨立進程,而非註冊的服務實例,導致:
datadir) 解析錯誤,讀取不到正確的 mysql.user 表my.ini 後重啟服務,最穩健、可審計mysqld-nt --defaults-file="D:\MySQL\MySQL Server 5.0\my.ini" --skip-grant-tables --consoleskip-grant-tables 並重啟,避免裸奔風險authentication_string,語法為 ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpass';ERROR 1045 看似權限錯誤,實則多為「服務啟動上下文不一致」導致的權限表加載失敗。配置文件法通過標準化服務啟動流程,確保參數生效環境與運行環境完全一致,是解決此類問題的黃金標準。理解底層機制,比記憶步驟更重要。