Хост 'xxx.xx.xxx.xxx' заборонено підключатися до цього сервера MySQL


667

Це повинно бути мертвим простим, але я не можу змусити його працювати на все життя.
Я просто намагаюся віддалено підключитися до свого сервера 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', як і інший з хостом '%'.

Я до кінця дотепний і не знаю, як діяти. Будь-які ідеї вітаються.


Неможливо ввійти як корінь у більшості обставин через запобіжну безпеку ..
AO_

Відповіді:


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. Для будь-якої іншої дії вкажіть саме потрібні вам привілеї та обмежте доступність користувача, як запропонував Pascal нижче.

Редагувати:

З питань FAQ на MySQL:

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


17
Добре спіймайте Янніка, проте я б не рекомендував йому надавати всі привілеї користувачеві, який не має права доступу. Можливо, зменшений набір?
Корі Баллу

3
Ну, це справді не було б гарною ідеєю, але дозволити «root» підключатися з усіх хостів точно так само, оскільки він знаходиться на одному рівні привілеїв.
Яннік Моттон

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

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

1
Я вважав, що надання доступу всіх хостів до root не є правильним рішенням. Натомість я створив нового користувача та надав зменшений набір привілеїв, набір, який я використав, описаний як "DBManager" на MySQL Workbench. Я також дозволив доступ лише до певної групи хостів у моїй локальній мережі, зокрема 192.168.0.%
Gustavo Guevara

271

Слід створити 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? Чи недостатньо, якщо ви просто створили ім'я користувача @%? Я маю на увазі, якщо ви просто створите ім'я користувача @%, ви не зможете зв’язатися з цим користувачем від 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. Перевірити для:

    • порт (за замовчуванням це 'port = 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 сервіс mysqld перезапуск

  5. Тепер ви можете мати можливість віддаленого підключення до вашої бази даних. Наприклад, я використовую MySQL Workbench і ввожу "Ім'я хоста: 10.1.1.7", "Порт: 3306", "Ім'я користувача: root"

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

3
мені вдалося це зробити, не перезапустивши mysqlсервіс наприкінці
Райан Тук

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

Це працювало для мене для MySQL 5.5 у Windows 10 за допомогою PRIVILEGES FLUSH, не перезапускаючи службу. У Windows властивості служби повинні ідентифікувати файл my.ini, який використовується для конфігурації (Властивості | Загальний | Шлях до виконуваного файлу)
FreeText

Я припускав, що, вказавши bind-address = "0.0.0.0", він прослухав би всі інтерфейси і віддалені з'єднання спрацювали б, але я помилявся. Так, netstat показав, що mysql слухав на 0.0.0.0 (усі інтерфейси), але я отримував помилку в заголовку питання. Як тільки я повністю видалив рядок прив’язки-адреси, він почав працювати. Дивно.
Генно

71

Вам потрібно надати доступ користувачеві з будь-якого імені хоста.

Ось так ви додаєте нові привілеї від phpmyadmin

Привілеї Goto> Додати нового користувача

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

Виберіть Будь-хост для потрібного імені користувача

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


65

Просто виконайте наступні дії:

1a) Підключення до mysql (через localhost)

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
ERROR 1045 (28000): Доступ заборонений для користувача 'корінь' @ 'локальний' (використовуючи 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):" тощо.
PJ Brunet

20

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

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

тоді

FLUSH PRIVILEGES;

зроблено!


що значить%?
огляди даних

1
це як все. Ви можете на зразок прикладу: WHERE CustomerName LIKE 'a%'- Знаходить будь-які значення, що починаються з "a"
user5510975

16

Якщо ви змінюєте таблиці грантів вручну (використовуючи INSERT, UPDATE тощо), вам слід виконати FLUSH PRIVILEGESоперацію, щоб повідомити серверу перезавантажити таблиці грантів.

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


4

Просто використовуйте інтерфейс, наданий Інструментом графічного інтерфейсу MySql (SQLyog):

Клацніть на Менеджер користувачів: введіть тут опис зображення

Тепер, якщо ви хочете надати доступ до будь-якого іншого ПЕЧАЛЬНОГО ПК, просто переконайтесь, що, як і під малюнком під ним, значення поля Хост -% (що є підстановкою)

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


4

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

Зверніть увагу, що окрім вбудованого користувача localhost, такого як root, цього робити не потрібно. Якщо ви просто хочете створити нового користувача, який може ввійти з будь-якого місця, ви можете скористатися цим

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

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


3

простий спосіб - увійти до phpmyadmin з кореневим обліковим записом, там перейдіть до бази даних mysql та виберіть таблицю користувача, там редагуйте кореневий рахунок та у поле хосту додайте% wild card. а потім через привілеї ssh flush

 FLUSH PRIVILEGES;

Це допомогло мені поєднатись із цим: ВІДКЛЮЧИТИ ВСІ ПРИВИЛЕГИ . ДО 'root' @ '%' З ОГОЛОШЕНОМ
Lanklaas

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, ви отримаєте помилку, відхилену в з'єднанні.
аксон

Але це адреса, яка дозволить усім хостам підключитися до сервера na?
Кішань Бхеемаджіані

Але надання всіх дозволів користувачеві не буде розумним варіантом для цього bcoz, якщо у вас є користувач клієнта, а вам не дозволяється створювати користувача з усіма дозволами, то що було б рішенням?
Кішань Бхеемаджіані

1

Якщо у вас трапляється працювати в Windows; Просте рішення - запустити майстра конфігурації екземпляра сервера MySQL. Це у вашій групі MYSQL у меню "Пуск". На другому з останнього екрану клацніть поле, де написано "Дозволити кореневий доступ з віддалених машин".


1

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


0

Я також стикався з тим же питанням. Я вирішив це за 2 хв, для мене я просто перелік ip через cpanel

Припустимо, ви намагаєтесь з'єднати базу даних сервера B з сервером A. Перейдіть на сервер B Cpanel-> Remote MySQL-> введіть IP-адресу сервера та все.


0

Ця відповідь може допомогти комусь ...

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

У мене mysql працює в контейнері docker, який працює на іншому порту. Я вказував на свою хост-машину на порт 3306, на якому працює сервер mysql. Мій контейнер виставляє сервер на порт 33060. Отже, весь цей час я дивився на неправильний сервер! До!


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

ця помилка, оскільки немає пароля до кореня, і це, можливо, сталося з вами при спробі підключення ззовні.


0

Рішення CPANEL

Перейдіть до Cpanel, шукайте віддалений 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 з визначальним stringstring, ви отримаєте цю помилку.

Можливо, ви забули визначити рядок з'єднання перед виконанням. Ви це перевірили? (вибачте за погану англійську)


-1

Проблема: root @ localhost не в змозі підключитися до нової установки mysql-спільноти-сервера на 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

Користувач файлу.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.