6

У меня похожая проблема, как здесь. Проблема в том, что предложенное там решение не работает для меня:

Просто пока у меня есть пользователи:

+----------+------------------------------------+
| user     | host                               |
+----------+------------------------------------+
| root     | 127.0.0.1                          |
| root     | localhost                          |

оба без паролей (только сейчас. Я знаю, что это плохо!).

Я подключаюсь к MySQL с помощью этой команды:

mysql -u root -h 127.0.0.1 --protocol=tcp

После входа в систему я получаю:

mysql -u root -h 127.0.0.1 --protocol=tcp
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.1.61-log Source distribution

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.1.61, for redhat-linux-gnu (x86_64) using readline 5.1

Connection id:      5
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.1.61-log Source distribution
Protocol version:   10
Connection:     127.0.0.1 via TCP/IP
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    latin1
Conn.  characterset:    latin1
TCP port:       3306
Uptime:         2 days 9 hours 2 min 13 sec

Threads: 1  Questions: 102  Slow queries: 0  Opens: 19  Flush tables: 1  Open tables: 12  Queries per second avg: 0.0
--------------

mysql> SELECT USER(),CURRENT_USER();
+----------------+----------------+
| USER()         | CURRENT_USER() |
+----------------+----------------+
| root@localhost | root@localhost |
+----------------+----------------+
1 row in set (0.00 sec)

mysql> 

ВОПРОС:

Как войти в систему как root'127.0.0.1?

2 ответа2

2

Добрый вечер, это @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 не имеет шансов на работу

-1

PHP все еще пытается использовать расположение сокетов по умолчанию. Эта проблема может возникнуть, если вы переместили папку MariaDB/MySQL из /var/lib/mysql в другое место. Чтобы решить эту проблему, вы должны определить местоположение нового сокета в файле /etc/php.ini .

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

Будьте внимательны, в зависимости от того, какой драйвер вы используете, вам может потребоваться указать pdo_mysql.default_socket = !

Чтобы проверить текущий каталог, запустите следующую команду в mysql:

select @@datadir;

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .