Включить удаленное подключение MySQL: ОШИБКА 1045 (28000): доступ запрещен для пользователя

136

MySQL 5.1.31 работает на Windows XP.

С локального сервера MySQL (192.168.233.142) я могу подключиться как root следующим образом:

>mysql --host=192.168.233.142 --user=root --password=redacted

С удаленной машины (192.168.233.163) я вижу, что порт mysql открыт:

# telnet 192.168.233.142 3306
Trying 192.168.233.142...
Connected to 192.168.233.142 (192.168.233.142).

Но при попытке подключиться к mysql с удаленной машины я получаю:

# mysql --host=192.168.233.142 --user=root --password=redacted
ERROR 1045 (28000): Access denied for user 'root'@'192.168.233.163' (using password: YES)

У меня есть только 2 записи в mysql.user:

Host         User     Password
--------------------------------------
localhost    root     *blahblahblah
%            root     [same as above]

Что еще мне нужно сделать, чтобы включить удаленный доступ?

РЕДАКТИРОВАТЬ

Как предложено Пауло ниже, я попытался заменить запись mysql.user для% на запись, специфичную для IP, поэтому моя таблица пользователей теперь выглядит так:

Host             User     Password
------------------------------------------
localhost        root     *blahblahblah
192.168.233.163  root     [same as above]

Затем я перезапустил машину, но проблема сохраняется.

Майк Чемберлен
источник

Ответы:

211

Вы должны поместить это как root:

GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'IP' IDENTIFIED BY 'PASSWORD' with grant option;

;

где IP - это IP-адрес, к которому вы хотите разрешить доступ, USERNAME - это пользователь, которого вы используете для подключения, а PASSWORD - соответствующий пароль.

Если вы хотите разрешить доступ с любого IP, просто поставьте %вместо своего IP

и тогда вам нужно только поставить

FLUSH PRIVILEGES;

Или перезапустите сервер MySQL и все.

Октавио
источник
Есть ли способ сделать это без локального клиента MySQL?
cmcginty
как убрать привилегии конкретного ip?
Умайр Аюб
4
stackoverflow.com/a/21151255/470749 мне тоже помог, потому что я думаю, что мои настройки связывания адресов должны быть закомментированы. Предоставление удаленных привилегий было недостаточно, чтобы заставить его работать.
Райан
8
Не объяснил в ответе, но замените PASSWORDпароль учетной записи. Я попытался выше только изменения USERNAMEи IPи он не работает для меня , пока я не изменил PASSWORD.
Ричард Парнаби-Кинг,
После этого следуйте тому, что сказано в следующем ответе: stackoverflow.com/a/21151255/445438
budhajeewa
85

Я получал ту же ошибку после предоставления удаленного доступа, пока я не сделал это:

Из /etc/mysql/my.cnf

В более новых версиях MySQL расположение файла /etc/mysql/mysql.conf.d/mysqld.cnf

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1

(закомментировать эту строку: bind-address = 127.0.0.1)

Тогда беги service mysql restart.

братва
источник
6
Или измените его на bind-address = 0.0.0.0
lolski
2
Только комментирование bind-addressне сработало для меня. Либо bind-address = 0.0.0.0или bind-address = <server_ip>работает.
chhantyal
58

По умолчанию в MySQL сервер удаленного доступа отключен. Процесс предоставления удаленного доступа пользователю.

  1. Перейдите в мою папку sql bin или добавьте ее в PATH
  2. Войдите в систему как пользователь root mysql -uroot -proot(или любой другой пароль root).
  3. В случае успеха вы получите mysql>
  4. Предоставить доступ для всех пользователей.

GRANT ALL PRIVILEGES ON *.* TO 'username'@'IP' IDENTIFIED BY 'password';

Здесь IP - это IP-адрес, для которого вы хотите разрешить удаленный доступ, если мы % любой IP-адрес, можно получить удаленный доступ.

Пример:

C:\Users\UserName> cd C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin

C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin>mysql -uroot -proot

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.27 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.25 sec)

Это для другого пользователя.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'testUser'@'%' IDENTIFIED BY 'testUser';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Надеюсь, это поможет

Рави Кант
источник
+1 за отличные детали, это действительно помогло мне увидеть, что 0 rows affectedэто норма :) Кроме того, service mysqld restartрекомендуется в конце. [ mysqldиногда просто mysql]
Натан Дортман
# Примечание: для версии 5.6+ используйте «Предоставить все на ...» (без привилегий)
Nicke Manarin
21

Помощь Пауло приводит меня к решению. Это была комбинация следующего:

  • пароль содержал знак доллара
  • Я пытался подключиться из оболочки Linux

Оболочка bash рассматривает знак доллара как специальный символ для расширения до переменной среды, поэтому мы должны экранировать его обратной косой чертой. Между прочим, нам не нужно делать это в случае, когда знак доллара является последним символом пароля.

Например, если ваш пароль «pas $ word», из Linux bash мы должны подключиться следующим образом:

# mysql --host=192.168.233.142 --user=root --password=pas\$word
Майк Чемберлен
источник
4
В дополнение к вышесказанному, пожалуйста, проверьте /etc/mysql/my.cnf и прокомментируйте bind-address = 127.0.0.1
Буминда
2
В качестве альтернативы можно использовать одинарные кавычки, чтобы предотвратить расширение $: mysql --host=192.168.233.142 --user=root --password='pas$word' stackoverflow.com/a/6697781/500942
jalanb
'$' в пароле. Бесценный. Благодаря тонну !!
Нагендра Какарла
после того, как я ударился головой о монитор, я наткнулся на это, и это сработало. У меня есть ! и @ в моем пароле. Изменили пароль, удалили привилегии, и я вернулся к нему. Спасибо!
AJM
9

У вас есть брандмауэр? убедитесь, что порт 3306 открыт.

В windows по умолчанию создается корневая учетная запись mysql, которой разрешен доступ только с локального хоста, если вы не выбрали опцию, чтобы разрешить доступ с удаленных компьютеров во время установки.

создание или обновление нужного пользователя с «%» в качестве имени хоста.

пример :

CREATE USER 'krish'@'%' IDENTIFIED BY 'password';
Вамси Кришна Б
источник
6
Ответ сервера: «ОШИБКА 1045 (28000): доступ запрещен для» ... если блок брандмауэра получит тайм-аут ...
Пауло Х.
просто хотел опубликовать первым. мой плохой
вамси Кришна Б
@Krish - Все, что вы предложили, уже рассмотрено в вопросе
Майк Чемберлен
5
  1. Попробуй еще flush privilegesраз.

  2. Попробуйте перезагрузить сервер, чтобы перезагрузить гранты.

  3. Попробуйте создать пользователя с хостом "192.168.233.163". «%», кажется, не позволяет всем (это странно)

Пауло Х.
источник
Спасибо, я попробовал это, но безрезультатно. Я обновил вопрос с вашими предложениями.
Майк Чемберлен
4
Попробуйте создать другого пользователя, и не забудьте установить все гранты:CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass'; GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' WITH GRANT OPTION;
Paulo H.
4

В моем случае я пытался подключиться к удаленному серверу mysql на цент ОС. После прохождения многих решений (предоставление всех привилегий, удаление привязок ip, включение сетей) проблема все еще не решалась.

Как оказалось, при поиске различных решений я натолкнулся на iptables, который заставил меня понять, что порт mysql 3306 не принимает соединения.

Вот небольшая заметка о том, как я проверил и решил эту проблему.

  • Проверка, принимает ли порт соединения:

    telnet (ip сервера mysql) [номер_порта]

  • Добавление правила таблицы ip для разрешения подключений к порту:

    iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ПРИНЯТЬ

  • Не рекомендую это для производственной среды, но если ваши iptables не настроены должным образом, добавление правил может не решить проблему. В этом случае должно быть сделано следующее:

    остановка сервиса iptables

Надеюсь это поможет.

Kushal
источник
3

если вы используете динамический ip, просто предоставьте доступ к 192.168.2.%, так что теперь вам не нужно беспокоиться о предоставлении доступа к вашему ip-адресу каждый раз.

Нитин Джайман
источник
1

Я боролся с удаленным входом в MYSQL для моего экземпляра Amazon EC2 Linux. Было найдено решение, чтобы убедиться, что моя группа безопасности включила входящее правило для порта MySQL 3306, чтобы включить мой IP-адрес (или 0.0.0.0/0 для любого места). Сразу могу подключиться удаленно, как только я добавлю это правило.

Брендан Мур
источник
1

Новое местоположение для конфигурационного файла mysql

/etc/mysql/mysql.conf.d/mysqld.cnf
stackMonk
источник
0

Драйвер MySQL ODBC 3.51 заключается в том, что специальные символы в пароле не обрабатываются.

«Предупреждение. У вас может возникнуть серьезная головная боль с MySQL ODBC 3.51, если пароль в вашей команде GRANT содержит специальные символы, такие как! @ # $% ^?. Драйвер ODBC MySQL 3.51 ODBC не поддерживает эти специальные символы в поле пароля. Единственное сообщение об ошибке, которое вы получите, - «Отказано в доступе» (с использованием пароля: ДА) »- http://www.plaintutorials.com/install-and-create-mysql-odbc-connector-on-windows-7/

PiperKeith
источник
0

Комбинация пользователь / хост может быть создана без пароля.

Я предполагал, что при добавлении нового хоста для существующего пользователя (с помощью приложения с графическим интерфейсом) существующий пароль также будет использоваться для новой комбинации пользователь / хост.

Я мог войти с

mysql -u username -p PASSWORD

локально, но не из IPADDRESS с

mysql -u --host=HOST -p PASSWORD

(Я мог бы войти в систему с IPADDRESS без пароля)

mysql -u --host=HOST

Установка пароля разрешенного доступа:

set password for '<USER>'@'<IPADDRESS>' = '<PASSWORD>';
andkrup
источник
1
Спасибо, я потратил много времени, пытаясь подключиться удаленно к моему серверу Mysql, и эта линия очень помогла. При установке пароля пользователя я получил ошибку, ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal numberкоторая привела меня к этой статье: knowmysql.blogspot.com/2013/09/… После выполнения этих шагов я смог наконец подключиться к серверу.
Энди Форцено