MySQL 5.6+ 為安全起見,不再預設空密碼,而是生成隨機密碼存放在 ~/.mysql_secret。若找不到該文件或安裝方式不同,導致 ERROR 1045 (28000): Access denied,本文提供標準重置方案。
[root@DB-Server ~]# mysql -u root -p Enter password: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
提示 using password: NO 表示客戶端未傳遞密碼,或服務端拒絕空密碼登錄。
systemctl stop mysqld # 或 /etc/init.d/mysql stop
mysqld_safe --skip-grant-tables --skip-networking --user=mysql &
--skip-grant-tables:不載入權限表,繞過密碼驗證。--skip-networking:僅本地套接字連接,防止外部入侵。&:後台運行。終端會卡住輸出日志,Ctrl+C 返回 shell 不影響進程。mysql -u root mysql
# 進入 mysql 庫
UPDATE user SET authentication_string=PASSWORD('NewPass123#')
WHERE User='root' AND Host IN ('localhost','127.0.0.1','::1');
FLUSH PRIVILEGES;
QUIT;
注意:MySQL 5.7+ 密碼列為 authentication_string,5.6 為 Password。請根據版本調整列名。
systemctl restart mysqld mysql -u root -p'NewPass123#' # 應成功登錄
| 現象 | 原因 | 解決 |
|---|---|---|
| mysqld_safe 後台卡住 | 前台輸出日志 | Ctrl+C 返回,或新開終端操作 |
| 修改密碼後仍報 1045 | 未執行 FLUSH PRIVILEGES | 必須刷新權限或重啟服務 |
| 密碼列名報錯 | 版本差異 | 用 DESC mysql.user 確認列名 |
| 權限表損壞 | 誤操作 | 用 mysql_upgrade 修復或重建實例 |
--init-file 法更優雅,無需 skip-grant-tables:
# 1. 建立 SQL 文件 echo "ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass123#';" > /tmp/reset.sql # 2. 啟動時載入 mysqld --init-file=/tmp/reset.sql --user=mysql & # 3. 登錄驗證後移除 init-file 參數正常重啟
mysql_secure_installation:移除匿名用戶、禁止 root 遠程登錄、刪除 test 庫。localhost/Unix Socket 登錄。validate_password 插件強制複雜度。