首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL ERROR 1045 (28000) 訪問被拒絕:Root 密碼重置完整操作手冊

     編輯:MySQL 資料庫相關知識

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 表修改密碼,再正常重啟生效。

Windows 環境操作步驟

1. 停止 MySQL 服務

C:\> net stop mysql
或
C:\> sc stop mysql

2. 跳過權限表啟動(保持窗口開啟)

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 連接,僅允許本地管道/共享內存,提升安全性。
  • 路徑請根據實際安裝目錄調整。

3. 新開命令行窗口,無密碼登錄

C:\> "C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" -u root -p
Enter password:  <-- 直接回車,無需輸入密碼

4. 重置密碼(按版本選擇 SQL)

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。

5. 退出並正常重啟服務

mysql> QUIT;
C:\> Ctrl+C 關閉 --skip-grant-tables 的 mysqld 窗口
C:\> net start mysql

6. 驗證新密碼

C:\> mysql -u root -p
Enter password: NewStrongPass123!
mysql> SELECT USER(), CURRENT_USER();

Linux 環境操作步驟(systemd 管理)

# 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 ...(慎用)

安全建議

  1. 重置後立即刪除匿名用戶:DELETE FROM mysql.user WHERE User='';
  2. 禁止 root 遠程登錄:UPDATE mysql.user SET Host='localhost' WHERE User='root'; FLUSH PRIVILEGES;
  3. 啟用 validate_password 插件強制密碼複雜度。
  4. 定期輪換密碼,採用密碼管理工具存儲。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved