2

Я настроил перенаправление портов MySQL на моей машине как:

ssh -f -N -L :9906:localhost:3306 <ssh login>

Теперь, если я попытаюсь подключиться к MySQL с моего локального хоста как:

mysql -u<user> -p<password> -P9906 -h127.0.0.1 <schema> 

Работает нормально. Но если я выберу параметр - h в моем локальном компьютере, то есть, если я подключусь к MySQL, как показано ниже, из localhost:

mysql -u<user> -p<password> -P9906 <schema> 

Я получаю следующую ошибку:

ОШИБКА 1045 (28000): доступ запрещен для пользователя '' @ 'localhost' (используется пароль: ДА)

Почему это поведение?

Я попытался установить переадресацию портов для localhost, а также 127.0.0.1, но ошибка все еще остается.

Также на сервере предоставили пользователю привилегию как для localhost, так и для 127.0.0.1.

2 ответа2

4

Есть четыре (4) СЦЕНАРИИ, на которые следует обратить внимание

СЦЕНАРИЙ № 1

Когда вы указываете -P<port number> вы должны использовать TCP/IP. Таким образом, -h<IPAddress> будет работать.

СЦЕНАРИЙ № 2

Когда вы указываете -P<port number> без -h<IPAddress> , предполагается localhost . В этом случае TCP/IP не используется, но для аутентификации используется файл сокета mysql.

СЦЕНАРИЙ № 3

Когда вы указываете -h127.0.0.1 без -P<port number> , предполагается localhost . В этом случае TCP/IP не используется, но для аутентификации используется файл сокета mysql.

СЦЕНАРИЙ № 4

Когда вы указываете -h127.0.0.1 с -P<port number> , localhost не предполагается. Будет использоваться TCP/IP, но пользователь должен быть правильно определен.

Учитывая сообщение об ошибке:

ОШИБКА 1045 (28000): доступ запрещен для пользователя '' @ 'localhost' (используется пароль: ДА)

и они так, как вы пытались войти

mysql -u -p -P9906 -h127.0.0.1

Вы нажали СЦЕНАРИЙ № 4

ПРЕДЛОЖЕНИЕ

В mysql.user убедитесь, что у вас есть

  • user@localhost (хорошо)
  • user@127.0.0.1 , (ок)
  • user@% (не рекомендуется, но может сделать)

с тем же паролем (или другими паролями, если это необходимо)

После успешного входа в систему, выполните этот запрос

SELECT USER(),CURRENT_USER();

USER() сообщает, как вы пытались пройти аутентификацию в MySQL

CURRENT_USER() сообщает, как вам разрешили проходить аутентификацию в MySQL

Добавление правильного пользователя позволяет вам правильно проходить аутентификацию. Ваша цель должна состоять в том, чтобы настроить пользователей в mysql.user таким образом, чтобы USER() и CURRENT_USER() имели одинаковый вывод или, по крайней мере, как можно более специфичные для хоста.

0

Клиент MySQL подключается к файлу сокета, если имя хоста не указано (или если имя хоста localhost указано с помощью -hlocalhost , даже если вы указали порт. Поэтому, когда вы пытаетесь подключиться к вашей удаленной базе данных, используя mysql -u -p -P9906 , вы фактически пытаетесь получить доступ к вашему локальному экземпляру сервера MySQL. Введите SHOW DATABASES и ваш список локальных баз данных будет напечатан.

Таким образом, чтобы получить доступ к удаленному экземпляру через переадресацию портов, необходимо указать хост (127.0.0.1), чтобы избежать подключения к файлу сокета.

Вот документация MySQL :

В Unix программы MySQL обрабатывают имя хоста localhost специально, что, вероятно, отличается от того, что вы ожидаете по сравнению с другими сетевыми программами. Для подключения к localhost программы MySQL пытаются подключиться к локальному серверу с помощью файла сокета Unix. Это происходит, даже если для указания номера порта указана опция --port или -P. Чтобы убедиться, что клиент устанавливает соединение TCP/IP с локальным сервером, используйте --host или -h, чтобы указать значение имени хоста 127.0.0.1, или IP-адрес или имя локального сервера. Вы также можете указать протокол соединения явно, даже для localhost, используя параметр --protocol = TCP.

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