Хосту "xxx.xx.xxx.xxx" не разрешено подключаться к этому серверу MySQL


668

Это должно быть очень просто, но я не могу заставить его работать на всю жизнь.
Я просто пытаюсь удаленно подключиться к моему серверу MySQL.

соединяясь как

mysql -u root -h localhost -p  

работает нормально, но пытается

mysql -u root -h 'any ip address here' -p

не удается с ошибкой

ERROR 1130 (00000): Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server

В mysql.userтаблице точно такая же запись для пользователя 'root' с хостом 'localhost', как и у другой записи с хостом '%'.

Я в своем уме и не знаю, как поступить. Любые идеи приветствуются.


В большинстве случаев не
удается

Ответы:


816

Возможно, меры предосторожности. Вы можете попробовать добавить новую учетную запись администратора:

mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
    ->     WITH GRANT OPTION;
mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
    ->     WITH GRANT OPTION;

Хотя, как отмечали Паскаль и другие, не очень хорошая идея, чтобы пользователь с таким видом доступа был открыт для любого IP. Если вам нужен администратор, используйте root и оставьте его на localhost. Для любого другого действия укажите именно те привилегии, которые вам нужны, и ограничьте доступ пользователя, как предлагает Паскаль ниже.

Редактировать:

Из FAQ по MySQL:

Если вы не можете понять, почему вы получаете отказ в доступе, удалите из пользовательской таблицы все записи, в которых значения хоста содержат подстановочные знаки (записи, содержащие символы «%» или «_»). Очень распространенная ошибка - вставить новую запись с Host = '%' и User = 'some_user', полагая, что это позволяет указать localhost для подключения с той же машины. Причина, по которой это не работает, состоит в том, что привилегии по умолчанию включают запись с Host = 'localhost' и User = ''. Поскольку эта запись имеет значение Host «localhost», которое является более конкретным, чем «%», она используется в предпочтении новой записи при подключении с localhost! Правильная процедура - вставить вторую запись с Host = 'localhost' и User = 'some_user', или удалить запись с помощью Host = 'localhost' и User = ''. После удаления записи не забудьте выполнить инструкцию FLUSH PRIVILEGES для перезагрузки таблиц предоставления. См. Также раздел 5.4.4, «Контроль доступа, этап 1: проверка соединения».


17
Хороший улов Янник, однако я бы не советовал ему предоставлять все привилегии пользователю без полномочий root. Возможно уменьшенный набор?
Кори Баллу

3
Что ж, это действительно не очень хорошая идея, но разрешение «root» подключаться со всех хостов абсолютно одинаково, поскольку оно имеет тот же уровень привилегий.
Янник Моттон

2
Я думаю, что вы упускаете мою точку зрения Паскаль. Дело в том, что пользователь root уже обладает этими правами, и он хочет, чтобы любой ip аутентифицировался как этот пользователь. Так что, если это действительно то, что он хочет, пример создания по умолчанию нового пользователя-администратора (у которого точно такие же права) является альтернативой тому, что он пытается.
Янник Моттон

2
Это верно, Янник, я быстро прочитал и удалю свой комментарий. Тем не менее, AFAIK, разрешения в MySQL работают нормально, поэтому: 1. возможно, OP изменил таблицы предоставления вручную и затем должен сбросить привилегии. 2. возможно, он не использовал правильный синтаксис гранта для root. Добавление другого администратора может быть обходным путем, но это не решит реальную проблему, IMHO.
Паскаль Thivent

1
Я чувствовал, что предоставление доступа от всех хостов к root не было правильным решением. Вместо этого я создал нового пользователя и предоставил ограниченный набор привилегий, который я использовал и описал как «DBManager» в MySQL Workbench. Я также разрешил доступ только определенной группе хостов в моей локальной сети, в частности, 192.168.0.%
Густаво Гевара

272

Нужно создать new MySQL Userи назначить привилегии, как Query promptпоказано ниже, через phpMyAdmin или командную строку:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

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

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

После завершения всех четырех запросов он должен соединиться с username / password


5
Пришлось перезапустить mysql после выполнения вышеуказанных шагов, чтобы это работало на меня.
сбор звонков

Вы должны создать имя пользователя @ localhost? Разве мало, если вы просто создаете имя пользователя @%? Я имею в виду, если вы просто создадите имя пользователя @%, вы не сможете соединиться с этим пользователем с локального хоста?
Сорин Постельнику

1
да, создание @localhostсмысла имело бы смысл, если бы привилегии были как-то отличны, но здесь они одинаковы, и это, вероятно, будет более запутанным, чем что-либо другое (например, изменение паролей на одном, не понимая, что существует другой, и что ваш логин может попасть в него). ).
Братчли

как новичок это действительно помогло мне
Мухаммед Найаб

1
спасибо, что решает мой "SQLSTATE [HY000] [1130] Узел 'DESKTOP-xxx.xx' не имеет права подключаться к этому серверу MariaDB" в контейнере приложения Laravel в Windows
Zulqarnain

117

Мое сообщение об ошибке было похожим и гласило: « Хосту XXX не разрешено подключаться к этому серверу MySQL », хотя я использовал root. Вот как убедиться, что root имеет правильные разрешения.

Моя настройка :

  • Ubuntu 14.04 LTS
  • MySQL v5.5.37

Решение

  1. Откройте файл в «etc / mysql / my.cnf»
  2. Проверить:

    • порт (по умолчанию это «порт = 3306»)
    • bind-address (по умолчанию это «bind-address = 127.0.0.1»; если вы хотите открыть для всех, просто закомментируйте эту строку. В моем примере я скажу, что реальный сервер находится на 10.1.1.7)
  3. Теперь получите доступ к базе данных MySQL на вашем фактическом сервере (скажем, ваш удаленный адрес 123.123.123.123 на порту 3306 как пользователь 'root', и я хочу изменить разрешения для базы данных 'dataentry'. Не забудьте изменить IP-адрес, порт и имя базы данных в твои настройки)

    mysql -u root -p
    Enter password: <enter password>
    mysql>GRANT ALL ON *.* to root@'123.123.123.123' IDENTIFIED BY 'put-your-password';
    mysql>FLUSH PRIVILEGES;
    mysql>exit
  4. sudo service mysqld restart

  5. Теперь вы должны иметь возможность удаленного подключения к вашей базе данных. Например, я использую MySQL Workbench и добавляю «Имя хоста: 10.1.1.7», «Порт: 3306», «Имя пользователя: root»

1
Вы можете пропустить use dataentryстроку (так как большинство людей не будет создавать эту базу данных).
Джедиджа

3
я смог сделать это, не перезапуская mysqlслужбу в конце
Райан Так

5
FLUSH PRIVILEGESдолжно позволить вам не нужно перезагружать.
Адам Б

У меня это работало для MySQL 5.5 в Windows 10 с привилегиями FLUSH, без перезапуска службы. В Windows, свойство сервиса следует определить my.ini файл , используемый для настройки (Свойства | Общий | Путь к исполняемому)
FREETEXT

Я предполагал, что, указав bind-address = "0.0.0.0", он будет прослушивать все интерфейсы, и удаленные соединения будут работать, но я ошибался. Да, netstat показал, что mysql прослушивает 0.0.0.0 (все интерфейсы), но я получаю сообщение об ошибке в заголовке вопроса. Как только я полностью удалил строку адреса привязки, она начала работать. Weird.
Хенно

73

Вам необходимо предоставить доступ пользователю с любого имени хоста.

Вот как вы добавляете новую привилегию из phpmyadmin

Перейти к привилегиям> Добавить нового пользователя

введите описание изображения здесь

Выберите любой хост для желаемого имени пользователя

введите описание изображения здесь


Очень полезно, спасибо братан
Андерсон Лаверде

65

Просто выполните следующие шаги:

1a) Подключение к MySQL (через локальный хост)

mysql -uroot -p

1b) Если сервер myslq работает в Kubernetes (K8s) и доступ к нему осуществляется через NodePort

kubectl exec -it [pod-name] -- /bin/bash
mysql -uroot -p

2) Создать пользователя

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

3) Предоставить разрешения

 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;

4) Флеш привилегии

FLUSH PRIVILEGES;

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

11
Должно быть *.* ?
sgarg

26

Сообщение *Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL serverявляется ответом от сервера MySQL клиенту MySQL. Обратите внимание, как возвращается IP-адрес, а не имя хоста.

Если вы пытаетесь установить соединение mysql -h<hostname> -u<somebody> -pи возвращает это сообщение с IP-адресом, сервер MySQL не может выполнить обратный поиск на клиенте. Это очень важно, потому что именно так он сопоставляет клиента MySQL с грантами.

Убедитесь, что вы можете сделать nslookup <mysqlclient>С сервера MySQL. Если это не сработает, значит, на DNS-сервере нет записи. Кроме того, вы можете поместить запись в файл HOSTS сервера MySQL ( <ipaddress> <fullyqualifiedhostname> <hostname><- Порядок здесь может иметь значение).

Запись в файле хоста моего сервера, разрешающая обратный поиск клиента MySQL, решила эту проблему.


1
"является ответом от сервера MySQL клиенту MySQL." Спасибо, мне было интересно, откуда возникла ошибка: моя машина или сервер. У меня ошибка «ОШИБКА 1130 (HY000):» и т. Д.
П.Дж. Брюне

20

Простой способ:

Grant All Privileges ON *.* to 'USER_NAME'@'%' Identified By 'YOUR_PASSWORD'; 

тогда

FLUSH PRIVILEGES;

сделанный!


что означает%?
dataviews

1
это как все. Вы можете привести пример: WHERE CustomerName LIKE 'a%'- Находит любые значения, которые начинаются с "a"
user5510975

16

Если вы изменяете таблицы грантов вручную (используя INSERT, UPDATE и т. Д.), Вы должны выполнить FLUSH PRIVILEGESинструкцию, чтобы сообщить серверу перезагрузить таблицы грантов.

PS: я бы не советовал разрешать любому хосту подключаться к любому пользователю (особенно не к rootиспользованию). Если вы используете mysql для клиент-серверного приложения, предпочтите адрес подсети. Если вы используете mysql с веб-сервером или сервером приложений, используйте определенные IP-адреса.


4

Просто используйте интерфейс, предоставляемый MySql GUI Tool (SQLyog):

Нажмите на менеджер пользователя: введите описание изображения здесь

Теперь, если вы хотите предоставить доступ ДЛЯ ЛЮБОГО ДРУГОГО ДИСТАНЦИОННОГО ПК, просто убедитесь, что, как и на рисунке ниже, значение поля Host равно% (это подстановочный знак)

введите описание изображения здесь


4

Большинство ответов здесь показывают, что вы создаете пользователей с двумя значениями хоста: один для localhostи один для %.

Обратите внимание, что кроме встроенного локального пользователя, такого как root, вам не нужно этого делать. Если вы просто хотите создать нового пользователя, который может войти из любого места, вы можете использовать

CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT <whatever privileges are appropriate> ON <relevant tables> TO myuser;

и это будет работать просто отлично. (Как уже упоминалось, это ужасная идея - предоставлять административные привилегии пользователю из любого домена.)


3

Простой способ - войти в phpmyadmin с учетной записью root, перейдите в базу данных mysql и выберите таблицу пользователей, там отредактируйте учетную запись root и в поле хоста добавьте подстановочный знак%. а потом через ssh флеш привилегии

 FLUSH PRIVILEGES;

Это помогло мне в сочетании с этим: ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА . TO 'root' @ '%' С GRANT OPTION;
Ланклаас

2

Если это недавняя установка mysql, то прежде чем что-либо менять, попробуйте просто выполнить эту команду и попробуйте снова:

flush privileges;

Это одно исправляет проблему для меня в Ubuntu 16.04, mysql 5.7.20. YMMV.


2

Просто найдите лучший способ сделать это из панели управления хостингом (я использую DirectAdmin здесь)

просто перейдите к целевой БД сервера на панели управления, в моем случае: Управление MySQL -> выберите вашу БД -> вы найдете: «Хосты доступа», просто добавьте сюда свой удаленный хост и он работает сейчас! введите описание изображения здесь

Я думаю, что есть аналогичная опция на других C.panels, таких как plesk и т.д ..

Я надеюсь, что это было полезно и для вас.


2

Ну, ничего из вышеприведенного ответа не помогло мне. После долгих исследований я нашел решение. Хотя я могу опоздать, это может помочь другим в будущем.

Авторизуйтесь на вашем SQL сервере с терминала

 mysql -u root -p
 -- root password
GRANT ALL ON *.* to root@'XX.XXX.XXX.XX' IDENTIFIED BY 'password';

Это должно решить проблему с разрешениями.

До устранения ошибки

После решения проблемы

Удачного кодирования!


1

Ну, что вы можете сделать, это просто открыть файл mysql.cfg, и вы должны изменить Bind-адрес на этот

bind-address = 127.0.0.1

а затем перезапустите MySQL, и вы сможете подключить этот сервер к этому.

Посмотрите, что вы можете иметь идею от этого.

это настоящий золь


3
Это связано, но не та же проблема. Первоначально полученная ошибка указывает, что клиент успешно подключается к серверу MySQL, но затем не проходит аутентификацию. Если для bind-address установлено значение 127.0.0.1, вы получите сообщение об ошибке отказа в соединении.
аксон

Но это адрес, который позволит всем Хосту подключиться к серверу?
Кишан Бхемаджияни

Но предоставление всего разрешения пользователю не будет разумным вариантом для этого bcoz, если у вас есть клиентский пользователь и вам не разрешено создавать пользователя со всеми разрешениями, тогда каким будет решение.?
Кишан Бхемаджияни

1

Если вы работаете в Windows; Простое решение - запустить мастер настройки экземпляра сервера MySQL. Он находится в вашей группе MYSQL в меню «Пуск». На втором из последнего экрана щелкните поле с надписью «разрешить root-доступ с удаленных компьютеров».


1

Если у вас есть сервер WAMP + Windows 10 и вы используете его для разработки, щелкните правой кнопкой мыши на значке Wamp => Wamp Settings=>Check Allow Virtual Hosts other than 127* введите описание изображения здесь


0

Я также столкнулся с той же проблемой. Я решил это за 2 минуты для меня, я просто белый список IP через Cpanel

Предположим, вы пытаетесь подключить базу данных сервера B с сервера A. Перейдите на C-панель сервера B -> Удаленный MySQL -> введите IP-адрес сервера A и все.


0

Этот ответ может помочь кому-то ...

Все эти ответы не помогли, тогда я понял, что забыл проверить одну важную вещь .. Порт :)

У меня MySQL работает в док-контейнере на другом порту. Я указывал на мою хост-машину через порт 3306, на котором запущен сервер mysql. Мой контейнер выставляет сервер на порт 33060. Так что все это время я смотрел не на тот сервер! DOH!


0
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

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


0

CPANEL решение

Зайдите в Cpanel, поищите Remote MySQL. Добавьте IP в поле ввода:

Хост (подстановочный знак% разрешен)

Комментарий, чтобы запомнить, что это за IP. Это было для меня.


0

Это работает для любого будущего удаленного подключения MySQL!

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

Перейдите к строке, которая начинается с директивы bind-address. Это должно выглядеть так:

    bind-address            = 0.0.0.0

Войдите в свой mysql как корневой терминал

    mysql -u root -p
    -- root password

    CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

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

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

    FLUSH PRIVILEGES;

    EXIT;

наконец, предоставьте этой машине эксклюзивное разрешение на удаленное подключение к базе данных с помощью следующей команды.

    sudo ufw allow from remote_IP_address to any port 3306

-1

На случай, если кто-то столкнулся с этой проблемой из-за SQLyog, это произошло:

Я подключился к удаленной базе данных (изнутри SQLyog) и работал несколько часов. После этого я на несколько минут вышел из системы, а затем вернулся, чтобы продолжить работу - ОШИБКА 1130 ! Ничто из того, что я пробовал, не сработало; Перезапуск SQLyog не помог. Затем я перезапустил систему - она ​​все еще не работала.

Поэтому я попытался подключиться с терминала - все заработало. Затем повторил это на SQLyog ... и это сработало. Я не могу объяснить это иначе, как «случайные компьютерные причуды», но я думаю, что это может кому-то помочь.


-1

если вы пытаетесь выполнить запрос MySQL без определения строки подключения, вы получите эту ошибку.

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


-1

Проблема: root @ localhost не может подключиться к новой установке mysql-community-server на openSUSE 42.2-1.150.x86_64. Mysql отказывается от соединений - точка.

Решение:

$ ls -l /var/lib/mysql/mysql/user.*
-rw-rw---- 1 mysql mysql     0 Apr 29 19:44 /var/lib/mysql/mysql/user.MYD
-rw-rw---- 1 mysql mysql  1024 Apr 29 19:44 /var/lib/mysql/mysql/user.MYI
-rw-rw---- 1 mysql mysql 10684 Apr 29 19:44 /var/lib/mysql/mysql/user.frm

Файл user.MYD имеет размер 0 (правда?!). Я скопировал все 3 файла из другой рабочей системы.

$ /usr/sbin/rcmysql stop
$ cd /var/lib/mysql/mysql/
$ scp root@othersytem:/var/lib/mysql/mysql/user.* ./
$ /usr/sbin/rcmysql start
$ cd -
$ mysql -u root -p

Я смог войти в систему. Тогда это было просто вопросом повторного применения всех привилегий схемы. Кроме того, если вы отключили IPv6, повторно включите его временно, чтобы учетная запись root @ :: 1 также могла работать.


-1

Это работает для DirectAdmin ;

  1. Иди к своему DirectAdmin.
  2. Иди к своему MySQL Management.
  3. Выберите свой database.
  4. Под вашей Accesse Hostвкладкой есть поле. Вы должны заполнить это поле через xxx.xx.xxx.xx.
  5. Нажмите на Add Host.

Законченный. Теперь вы можете получить доступ к этой базе данных с помощью your_database_username& your_database_password.
Так просто!


-3

Все ответы здесь не сработали в моем случае, так что я гость, это может помочь другим пользователям в будущем. Это также может быть проблемой в нашем коде, а не только в MySQL.

Если вы используете VB.NET

Вместо этого кода:

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database

 MysqlConn = New MySqlConnection()

Вам нужно перейти MysqlConn = New MySqlConnection()на первую строку. Так было бы так

 MysqlConn = New MySqlConnection()

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.