Возможно, у вас есть анонимный пользователь ''@'localhost'
или ''@'127.0.0.1'
.
Согласно инструкции :
Если возможно несколько совпадений, сервер должен определить, какое из них использовать. Это решает эту проблему следующим образом: (...)
- Когда клиент пытается подключиться, сервер просматривает строки [таблицы mysql.user] в отсортированном порядке.
- Сервер использует первую строку, которая соответствует имени хоста клиента и имени пользователя.
(...) Сервер использует правила сортировки, которые сначала упорядочивают строки с наиболее конкретными значениями хоста . Литеральные имена хостов [например, localhost] и IP-адреса являются наиболее конкретными.
Следовательно, такой анонимный пользователь «маскирует» любого другого пользователя, как '[any_username]'@'%'
при подключении с localhost
.
'bill'@'localhost'
соответствует 'bill'@'%'
, но будет соответствовать (например) ''@'localhost'
заранее.
Рекомендуемое решение состоит в том, чтобы удалить этого анонимного пользователя (как правило, в любом случае это хорошая вещь).
Приведенные ниже правки в основном не имеют отношения к основному вопросу. Они предназначены только для ответа на некоторые вопросы, поднятые в других комментариях в этой теме.
Редактировать 1
Аутентификация как 'bill'@'%'
через сокет.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
Добро пожаловать на монитор MySQL (...)
mysql> ВЫБЕРИТЕ пользователя, хост FROM mysql.user;
+ ------ + ----------- +
| пользователь | хозяин |
+ ------ + ----------- +
| счет | % |
| корень | 127.0.0.1 |
| корень | :: 1 |
| корень | местный хост |
+ ------ + ----------- +
4 ряда в наборе (0,00 сек)
mysql> SELECT USER (), CURRENT_USER ();
+ ---------------- + ---------------- +
| ПОЛЬЗОВАТЕЛЬ () | CURRENT_USER () |
+ ---------------- + ---------------- +
| счет @ localhost | счет @% |
+ ---------------- + ---------------- +
1 ряд в наборе (0,02 сек)
mysql> SHOW VARIABLES LIKE 'skip_networking';
+ ----------------- + ------- +
| Переменное_имя | Значение |
+ ----------------- + ------- +
| skip_networking | ON |
+ ----------------- + ------- +
1 ряд в наборе (0,00 сек)
Редактировать 2
Точно такая же настройка, за исключением того, что я повторно активировал сеть, и теперь я создаю анонимного пользователя ''@'localhost'
.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
Добро пожаловать на монитор MySQL (...)
mysql> CREATE USER '' @ 'localhost', ИДЕНТИФИЦИРОВАНЫ 'anotherpass';
Запрос в порядке, затронуто 0 строк (0,00 с)
mysql> Пока
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket = / TMP / MySQL-5.5.sock
ОШИБКА 1045 (28000): доступ запрещен для пользователя 'bill' @ 'localhost' (используя пароль: ДА)
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol = TCP
ОШИБКА 1045 (28000): доступ запрещен для пользователя 'bill' @ 'localhost' (используя пароль: ДА)
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol = TCP
ОШИБКА 1045 (28000): доступ запрещен для пользователя 'bill' @ 'localhost' (используя пароль: ДА)
Редактировать 3
Та же ситуация, что и в редактировании 2, теперь указывается пароль анонимного пользователя.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
Добро пожаловать на монитор MySQL (...)
mysql> SELECT USER (), CURRENT_USER ();
+ ---------------- + ---------------- +
| ПОЛЬЗОВАТЕЛЬ () | CURRENT_USER () |
+ ---------------- + ---------------- +
| счет @ localhost | @localhost |
+ ---------------- + ---------------- +
1 ряд в наборе (0,01 с)
Вывод 1, из редактирования 1: Можно аутентифицироваться как 'bill'@'%'
через сокет.
Вывод 2, из редактирования 2. Независимо от того, подключается ли кто-либо через TCP или через сокет, процесс аутентификации не влияет (за исключением того, что никто не может подключиться, как кто-либо другой, но 'something'@'localhost'
через сокет, очевидно).
Вывод 3, из редактирования 3: Хотя я указал -ubill
, мне предоставили доступ в качестве анонимного пользователя. Это из-за "правил сортировки", рекомендованных выше. Обратите внимание, что в большинстве установок по умолчанию анонимный пользователь без пароля существует (и должен быть защищен / удален).
FLUSH PRIVILEGES
?