Добрый вечер, это @RolandoMySQLDBA, автор того поста, который вы упомянули.
Посмотрите на последние три строки
Server version: 5.1.61-log Source distribution
Protocol version: 10
Connection: 127.0.0.1 via TCP/IP
Последняя строка говорит 127.0.0.1 via TCP/IP
так что вы на 100% используете протокол TCP/IP.
Вы запустили SELECT USER(),CURRENT_USER();
?
Если вы сделали, это должно сказать
root@127.0.0.1 | root@127.0.0.1
Было бы странно, если бы вывод
root@127.0.0.1 | root@localhost
Обратите внимание на следующее: поскольку оба пользователя root имеют одинаковые права доступа и идентичные пароли (в данном случае ни одного), mysqld решила выбрать root@localhost
. В этот момент вы, вероятно, задаетесь вопросом: «Почему mysqld
делает такой выбор?"
В DBA StackExchange у меня есть этот двухлетний пост (ошибка MySQL: доступ запрещен для пользователя 'a' @ 'localhost' (с использованием пароля: YES)). В прошлом я точно описал, как mysqld выполняет аутентификацию пользователей. Обратите внимание на абзацы со страниц 486,487 Руководства по сертификации MySQL 5.0
Существует два этапа управления клиентским доступом:
На первом этапе клиент пытается подключиться, и сервер либо принимает, либо отклоняет подключение. Чтобы попытка увенчалась успехом, некоторые записи в пользовательской таблице должны соответствовать хосту, с которого соединяется клиент, имени пользователя и паролю.
На втором этапе (который происходит только в том случае, если клиент уже успешно подключился) сервер проверяет каждый запрос, который он получает от клиента, чтобы увидеть, имеет ли клиент достаточные привилегии для его выполнения.
Сервер сопоставляет клиента с записями в таблицах предоставления на основе хоста, с которого клиент соединяется, и пользователя, которого предоставляет клиент. Однако возможно совпадение нескольких записей:
Как я уже упоминал в Книге сертификации, it's possible for more than one record to match
. Поэтому mysqld
сделал выбор.
Если вы удалите root@localhost
из mysql.user
, это один из способов получить SELECT USER(),CURRENT_USER();
чтобы соответствовать. Другой способ - дать root@127.0.0.1
пароль.
РЕЗЮМЕ
Наличие двух корневых пользователей с одинаковыми средствами использования для аутентификации пользователей является основной причиной того, почему вы не видите root@127.0.0.1
. Несмотря на это, вы используете TCP/IP
.
ПРИМЕЧАНИЕ
Пожалуйста, убедитесь, что в ОС определено 127.0.0.1
. Запустите это:
cat /etc/hosts | grep -c "127\.0\.0\.1"
Если вы получаете 0
, то ОС не знает об этом. Вам нужно добавить 127.0.0.1
в /etc/hosts
и перезапустить сеть, а затем mysql.
ОБНОВЛЕНИЕ 2014-04-26 20:00 ПО ВОСТОЧНОМУ ВРЕМЕНИ
То, что я собираюсь сказать, может показаться глупым, но в документации используется TCP вместо TCP
В Unix программы MySQL обрабатывают имя хоста localhost специально, что, вероятно, отличается от того, что вы ожидаете по сравнению с другими сетевыми программами. Для подключения к localhost программы MySQL пытаются подключиться к локальному серверу с помощью файла сокета Unix.
Это происходит, даже если для указания номера порта указана опция --port или -P. Чтобы убедиться, что клиент устанавливает соединение TCP/IP с локальным сервером, используйте --host или -h, чтобы указать значение имени хоста 127.0.0.1, или IP-адрес или имя локального сервера. Вы также можете указать протокол соединения явно, даже для localhost, используя параметр --protocol = TCP. Например:
shell> mysql --host=127.0.0.1
shell> mysql --protocol=TCP
Опция --protocol позволяет вам установить определенный тип соединения, даже если другие опции обычно по умолчанию используют какой-либо другой протокол.
Попробуйте использовать протокол = TCP, как это
mysql -u root -h 127.0.0.1 --protocol=TCP -ANe"SELECT USER(),CURRENT_USER()"
mysql -u root -h localhost --protocol=TCP -ANe"SELECT USER(),CURRENT_USER()"
чтобы увидеть, если это имеет значение.
ОБНОВЛЕНИЕ 2014-05-09 16:19
Вам нужно внимательно просмотреть /etc/hosts
Если вы видите это в /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
тогда вход в систему как root@127.0.0.1
должен работать правильно
Если вы видите это в /etc/hosts
127.0.0.1 localhost
тогда root@127.0.0.1
не имеет шансов на работу