建立新用戶後無法登入,報錯 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 連線時匹配到匿名用戶,密碼不符被拒。
DELETE FROM mysql.user WHERE user = '';
FLUSH PRIVILEGES;
UPDATE mysql.user SET user='test' WHERE user = '';
FLUSH PRIVILEGES;
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 行。