Увімкнути віддалене підключення MySQL: ERROR 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]

Що ще потрібно зробити, щоб увімкнути віддалений доступ?

EDIT

Як запропонував Пауло нижче, я спробував замінити запис mysql.user на% на специфічний IP-запис, тому моя таблиця користувачів зараз виглядає так:

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

Потім я перезапустив машину, але проблема зберігається.

Відповіді:


211

Ви повинні поставити це як корінь:

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. Увійдіть до кореня за допомогою mysql -uroot -proot(або будь-якого паролю кореня.)
  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
Buminda

2
Як альтернативу можна використовувати одиничні лапки , щоб запобігти розширенню $: mysql --host=192.168.233.142 --user=root --password='pas$word' stackoverflow.com/a/6697781/500942
jalanb

'$' у паролі. Безцінне. Дякую тони !!
Нагендра Какарла

після удару головою об монітор деякий час я натрапив на це, і воно спрацювало. Я маю ! і @ у моєму паролі. Змінений пароль, розмитий привілей, і я знову на нього. Дякую!
AJM

9

У вас є брандмауер? переконайтесь, що порт 3306 відкритий.

У Windows за замовчуванням створюється кореневий обліковий запис mysql, якому дозволено мати доступ лише з localhost, якщо ви не вибрали опцію для включення доступу з віддалених машин під час встановлення.

створення або оновлення потрібного користувача за допомогою "%" як імені хоста.

приклад:

CREATE USER 'krish'@'%' IDENTIFIED BY 'password';

6
Відповідь сервера з "ПОМИЛКА 1045 (28000): Доступ заборонено для" ... якщо блок брандмауера отримає тайм-аут ...
Пауло Х.

просто хотів опублікувати перший. мій поганий
Вамсі Кришна B

@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;
Пауло Х.

4

У моєму випадку я намагався підключитися до віддаленого сервера mysql на ОС OS. Після перегляду багатьох рішень (надання всіх привілеїв, видалення ip-прив’язок, включення в мережу) проблема все ще не вирішувалася.

Як виявилось, переглядаючи різні рішення, я натрапив на iptables, завдяки чому я зрозумів, що порт mysql 3306 не приймає з'єднання.

Ось невеличка примітка про те, як я перевірив і вирішив цю проблему.

  • Перевірка, чи порт приймає з'єднання:

    telnet (сервер mysql ip) [portNo]

  • Додавання правила таблиці ip, щоб дозволити з'єднання на порту:

    iptables -A INPUT -i eth0 -p tcp -m tcp --portport 3306 -j ACCEPT

  • Не рекомендував би це для виробничого середовища, але якщо ваші iptables не налаштовані належним чином, додавання правил може все-таки вирішити проблему. У цьому випадку слід зробити наступне:

    сервісні iptables зупиняються

Сподіваюся, це допомагає.


3

якщо ви використовуєте динамічний ip, просто надайте доступ до 192.168.2.%, тому тепер вам не доведеться турбуватися про надання доступу до вашої ip адреси кожного разу.


1

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


1

Нове місце для файлу конфігурації mysql є

/etc/mysql/mysql.conf.d/mysqld.cnf

0

MySQL ODBC 3.51 Драйвер полягає в тому, що спеціальні символи в паролі не обробляються.

"Попередження - у вас може виникнути серйозна головна біль з MySQL ODBC 3.51, якщо пароль у вашій команді GRANT містить спеціальні символи, наприклад! @ # $% ^?. Драйвер MySQL ODBC 3.51 ODBC не підтримує цих спеціальних символів у вікні пароля. Єдине повідомлення про помилку, яке ви отримаєте, - "Заборонено доступ" (з використанням пароля: ТАК) "- від http://www.plaintutorials.com/install-and-create-mysql-odbc-connector-on-windows-7/


0

Комбінація користувача / хоста, можливо, була створена без пароля.

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

Я міг би увійти в систему

mysql -u username -p PASSWORD

локально, але не від IPADDRESS з

mysql -u --host=HOST -p PASSWORD

(Я фактично міг увійти з IPADDRESS без використання пароля)

mysql -u --host=HOST

Встановлення пароля, дозволений доступ:

set password for '<USER>'@'<IPADDRESS>' = '<PASSWORD>';

1
Дякую, я витратив багато часу, намагаючись дистанційно підключитися до свого сервера Mysql, і ця лінія дуже допомогла. Під час встановлення пароля користувача я отримав помилку, ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal numberяка призвела до цієї статті: knowmysql.blogspot.com/2013/09/… Після виконання цих кроків я могла нарешті підключитися до сервера.
Енді Форсно,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.