萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL "Access denied for user 'root'@'localhost'" 錯誤 1045 完整排查與解決大全

錯誤 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES/NO) 是 MySQL 連線失敗最常見的錯誤。本文系統整理 Windows/Linux 環境下的多種成因與對應解決方案,涵蓋密碼重置、Socket 設定、權限表修復、配置檔檢查等完整排查路徑。

錯誤代碼 1045 核心成因分類

  1. 密碼錯誤/遺失:實際密碼與輸入不符。
  2. 權限表損壞/缺失:mysql.user 表無 root 記錄、Host 欄位不匹配。
  3. Socket/連線參數錯誤:客戶端與伺服器 Socket 路徑不一致(Linux 常見)。
  4. 配置檔錯誤:my.cnf 中 socket、datadir 路徑錯誤。
  5. 啟動方式錯誤:直接執行 mysql 而非服務腳本、環境變數缺失。

場景一:Windows 環境重置 root 密碼 (官方標準流程)

  1. 以管理員身分登入,停止 MySQL 服務(服務管理器或 net stop mysql)。
  2. 建立文字檔 C:\mysql-init.txt,內容:
    SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPassword');
  3. 命令列啟動:
    C:\mysql\bin\mysqld-nt --init-file=C:\mysql-init.txt
  4. 服務啟動後刪除 mysql-init.txt,正常重啟服務。

場景二:Linux (Ubuntu/CentOS) 重置 root 密碼

方法 1:--skip-grant-tables (推薦)

/etc/init.d/mysql stop
mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
mysql -u root mysql
UPDATE user SET Password=PASSWORD('newpassword') WHERE USER='root';
FLUSH PRIVILEGES;
quit
/etc/init.d/mysql restart
mysql -uroot -p'newpassword'

方法 2:mysqladmin (知舊密碼)

mysqladmin -uroot -p'oldpassword' password 'newpassword'

場景三:Linux 連線失敗的常見誤區與修正

現象原因解決
輸入 mysql start 無反應啟動指令錯誤用 /etc/init.d/mysql start 或 systemctl start mysqld
PHP 連線報 1045 / 2002PHP 讀取的 socket 路徑與 MySQL 實際不同修改 /etc/php.ini:
mysql.default_socket=/var/lib/mysql/mysql.sock
並建立軟連結:ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
提示 command not foundPATH 未包含 MySQL bin 目錄用絕對路徑 /usr/local/mysql/bin/mysql 或加入 PATH
需用 service mysql start/stop系統服務管理方式習慣使用 service/systemctl 指令

場景四:RedHat/CentOS 配置檔檢查清單

  1. /etc/my.cnf 的 [client] 與 [mysqld] 區塊 socket 路徑一致(如 /var/lib/mysql/mysql.sock)。
  2. datadir 指向正確資料目錄。
  3. 啟動腳本 /etc/init.d/mysql 中 datadir 變數正確。

權限表修復:root 記錄遺失/Host 錯誤

-- 進入 skip-grant-tables 模式後
USE mysql;
-- 確認 root 存在
SELECT User, Host, authentication_string FROM user WHERE User='root';
-- 若無或 Host 不對(如缺 'localhost' 或 '%')
INSERT INTO user (Host, User, Password) VALUES ('%', 'root', PASSWORD('newpass'));
-- 或修正 Host
UPDATE user SET Host='%' WHERE User='root' AND Host='::1';
FLUSH PRIVILEGES;

總結排查順序

  1. 確認服務已啟動(ps aux | grep mysqld)。
  2. 確認連線參數(-h, -P, -S, -u, -p)與服務端一致。
  3. 嘗試 mysql -uroot -p 輸入密碼;失敗則進入密碼重置流程。
  4. 若密碼正確仍失敗,檢查 Socket、權限表、防火牆/SELinux。
  5. 查看錯誤日誌 /var/log/mysqld.log 定位具體原因。

系統化排查 1045 錯誤,從密碼重置到 Socket 修正再到權限表修復,層層遞進,總能找到癥結點恢復連線。

copyright © 萬盛學電腦網 all rights reserved