MySQL 錯誤代碼 1045 (Access denied for user 'root'@'localhost') 代表帳號密碼驗證失敗,最常見原因是遺忘 root 密碼。本文提供兩種經實測有效的重設方案,適用於 Linux 環境(Debian/Ubuntu 系列),Windows 使用者請參考官方文件以 --init-file 方式處理。
Debian 系列安裝 MySQL 時會自動建立 debian-sys-maint 維護帳號,其密碼儲存於 /etc/mysql/debian.cnf。此帳號擁有完整權限,可直接登入修改 root 密碼,且不需停止 MySQL 服務,業務零中斷。
sudo cat /etc/mysql/debian.cnf
找到 [client] 區塊下的 user = debian-sys-maint 與 password = xxx。
mysql -u debian-sys-maint -p
輸入上一步取得的密碼。
UPDATE mysql.user SET authentication_string=PASSWORD('新密碼') WHERE User='root';
FLUSH PRIVILEGES;
QUIT;
注意: MySQL 5.7+ 欄位為 authentication_string,5.6 及舊版為 Password。
mysql -u root -p
輸入新設定的密碼,成功登入即完成重設。
適用於無 debian-sys-maint 帳號或該帳號亦失效的情況。核心原理:以 --skip-grant-tables 參數啟動 MySQL,暫時繞過權限驗證,修改密碼後重啟恢復正常模式。
sudo /etc/init.d/mysql stop
或 sudo systemctl stop mysql(systemd 系統)。
sudo mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
--skip-networking 防止外部連入,提升安全性。& 讓進程在背景執行,保留終端機操作。mysql -u root mysql
UPDATE user SET authentication_string=PASSWORD('新密碼') WHERE User='root';
FLUSH PRIVILEGES;
QUIT;
sudo /etc/init.d/mysql restart
mysql -u root -p
| 現象 | 原因 | 解決方式 |
|---|---|---|
| UPDATE 語法錯誤 | MySQL 版本差異導致欄位名不同 | 先執行 DESC mysql.user; 確認密碼欄位名稱 |
| 方案二修改後仍無法登入 | 未執行 FLUSH PRIVILEGES 或服務未重啟 | 務必執行 FLUSH PRIVILEGES 並完整重啟服務 |
| Plugin 欄位為 auth_socket | Ubuntu 18.04+ 預設使用 auth_socket 外掛 | 同步修改 plugin 欄位為 mysql_native_password |
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼'; 語法。掌握這兩種方案,下次遇到 ERROR 1045 即可從容應對,快速恢復資料庫存取權限。