MySQL 登錄報錯 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES),通常是密碼錯誤、權限表損壞或認證插件不匹配導致。本文提供 Windows/Linux 通用的跳過權限表啟動 → 重置密碼 → 刷新權限 → 正常啟動標準流程,並針對 MySQL 5.7+/8.0 的 authentication_string 字段變更給出對應 SQL。
以 --skip-grant-tables 參數啟動 mysqld,Server 將不加載權限表(mysql.user 等),允許無密碼、任意用戶連接並擁有超級權限。此時可直接更新 mysql.user 表修改密碼,再正常重啟生效。
C:\> net stop mysql
或
C:\> sc stop mysql
C:\> "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --console --skip-grant-tables --skip-networking
--console:輸出日誌到控制台,便於觀察。--skip-networking:禁用 TCP/IP 連接,僅允許本地管道/共享內存,提升安全性。C:\> "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -u root -p
Enter password: <-- 直接回車,無需輸入密碼
MySQL 5.7 / 8.0(推薦):
mysql> FLUSH PRIVILEGES; -- skip-grant-tables 下必須先刷新,否則 user 表不可寫
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
mysql> FLUSH PRIVILEGES;
MySQL 5.6 / 早期版本:
mysql> FLUSH PRIVILEGES;
mysql> UPDATE mysql.user SET Password = PASSWORD('NewStrongPass123!') WHERE User = 'root' AND Host = 'localhost';
mysql> FLUSH PRIVILEGES;
注意: 5.7+ 已移除 Password 列,改為 authentication_string,直接 UPDATE 會報錯 Unknown column 'Password',務必用 ALTER USER。
mysql> QUIT;
C:\> Ctrl+C 關閉 --skip-grant-tables 的 mysqld 窗口
C:\> net start mysql
C:\> mysql -u root -p
Enter password: NewStrongPass123!
mysql> SELECT USER(), CURRENT_USER();
# 1. 停止服務
systemctl stop mysqld
# 2. 創建臨時啟動配置(避免修改主配置)
mkdir -p /var/run/mysqld
chown mysql:mysql /var/run/mysqld
# 3. 手動啟動 --skip-grant-tables(前台運行,另開終端操作)
/usr/sbin/mysqld --skip-grant-tables --skip-networking --user=mysql --datadir=/var/lib/mysql --socket=/var/run/mysqld/mysqld.sock --pid-file=/var/run/mysqld/mysqld.pid &
# 4. 本地無密碼登錄
mysql -u root -p # 直接回車
# 5. 重置密碼(同 Windows,按版本選 ALTER USER 或 UPDATE)
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPass123!';
FLUSH PRIVILEGES;
# 6. 關閉手動進程,正常啟動
kill $(cat /var/run/mysqld/mysqld.pid)
systemctl start mysqld
# 7. 驗證
mysql -u root -p'NewStrongPass123!' -e "SELECT VERSION();"
| 現象 | 原因 | 對策 |
|---|---|---|
ERROR 1290: The MySQL server is running with the --skip-grant-tables option so it cannot execute this statement | 未執行 FLUSH PRIVILEGES; 就嘗試修改 user 表 | 先 FLUSH PRIVILEGES; 再 ALTER USER |
Unknown column 'Password' | MySQL 5.7+ 使用 authentication_string | 改用 ALTER USER ... IDENTIFIED BY |
密碼策略報錯 validate_password | 新密碼不滿足長度/複雜度要求 | 設置強密碼(大小寫+數字+特殊符號≥8位)或臨時降低策略 SET GLOBAL validate_password.policy=LOW; |
宿主為 % 或 127.0.0.1 的 root 仍舊密碼 | 只改了 localhost 行 | 按需更新所有 Host 行,或統一用 ALTER USER 'root'@'%' IDENTIFIED BY ...(慎用) |
DELETE FROM mysql.user WHERE User='';UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;validate_password 插件強制密碼複雜度。