萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 連線錯誤 ERROR 1045 (28000) Access denied 完整排查手冊

建立新用戶後無法登入,報錯 ERROR 1045 (28000): Access denied for user 'test'@'localhost' (using password: YES)。核心原因: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'

根因分析

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

MySQL 認證順序:Host 排序(具體 > 通配)→ User 排序(非空 > 空)。localhost + 空用戶 排在 % + test 之前,導致以 test@localhost 連線時匹配到匿名用戶,密碼不符被拒。

解決方案(任選一)

方案 A:刪除匿名用戶(推薦)

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

方案 B:將匿名用戶改為具體用戶

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

方案 C:建立同樣具體的 localhost 帳號

GRANT ALL PRIVILEGES ON *.* TO 'test'@'localhost' IDENTIFIED BY 'test' WITH GRANT OPTION;
FLUSH PRIVILEGES;

用戶管理最佳實踐

操作SQL(MySQL 5.7+)SQL(MySQL 8.0+)
建立用戶GRANT ... IDENTIFIED BY 'pwd'CREATE USER 'u'@'%' IDENTIFIED BY 'pwd'; GRANT ...
刪除用戶DROP USER 'u'@'%'同
修改密碼SET PASSWORD FOR 'u'@'%' = PASSWORD('new')ALTER USER 'u'@'%' IDENTIFIED BY 'new'
查看權限SHOW GRANTS FOR 'u'@'%'同

配置檔與初始化備查

  • 配置檔:/usr/local/mysql/my.cnf 或 /etc/my.cnf。
  • 初始化資料目錄:/usr/bin/mysql_install_db(5.7)或 mysqld --initialize(8.0)。

記住:匿名用戶是 1045 錯誤的頭號兇手,新建用戶後務必清理 mysql.user 中的空 User 行。

copyright © 萬盛學電腦網 all rights reserved