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

MySQL ERROR 1045 (28000) 連線被拒:匿名用戶干擾排查與解決

     編輯:MySQL 資料庫相關知識

剛建立的 MySQL 用戶明明密碼正確,卻總報 ERROR 1045 (28000): Access denied for user 'test'@'localhost'?這通常是因為 mysql.user 表中存在匿名用戶(user 為空字串),導致連線匹配優先級錯誤。本文詳細解析成因並提供解決方案。

一、現象重現

# 建立用戶
mysql> GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' IDENTIFIED BY 'test' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;

# 嘗試連線
$ mysql -u test -p
ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: YES)

二、根因分析:匿名用戶搶佔匹配

查看 mysql.user 表:

mysql> SELECT host, user FROM mysql.user;
+---------------------+------+
| host                | user |
+---------------------+------+
| %                   | test |
| localhost           |      |  <-- 匿名用戶
| localhost           | root |
| test.saeg.com.cn    |      |  <-- 匿名用戶
| test.saeg.com.cn    | root |
+---------------------+------+

MySQL 連線驗證邏輯:按 host + user 排序,具體 host 優先於通配符 %,具體 user 優先於空 user。但當從 localhost 連線時,localhost 匿名用戶(user='')比 % 的 test 用戶優先級更高,導致認證走進匿名用戶通道,密碼當然不匹配。

三、解決方案

方法 1:刪除匿名用戶(推薦,最徹底)

DELETE FROM mysql.user WHERE user = '';
FLUSH PRIVILEGES;

方法 2:將匿名用戶改為具體用戶(不推薦,易留隱患)

UPDATE mysql.user SET user = 'test' WHERE user = '';
FLUSH PRIVILEGES;

四、補充:MySQL 5.7+ 新建用戶語法

新版本建議使用標準 DDL:

CREATE USER 'test'@'%' IDENTIFIED BY 'test';
GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION;
-- 或
CREATE USER 'test'@'localhost' IDENTIFIED BY 'test';

五、環境參考資訊

  • OS:RHEL 4.0
  • MySQL 配置檔:/usr/local/mysql/my-*.cnf
  • 資料庫初始化:/usr/bin/mysql_install_db

清理匿名用戶後,重新連線即可成功。生產環境部署時,執行 mysql_secure_installation 可自動移除匿名用戶、禁止 root 遠程登入、移除 test 資料庫,建議納入標準初始化流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved