Зміна дозволу хоста для користувачів MySQL


44

У мене є такі гранти для користувача / бази даних

mysql> SHOW GRANTS FOR 'username'@'localhost';
+---------------------------------------------------------------------------+
| Grants for username@localhost                                             |
+---------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD 'xxx' |
| GRANT ALL PRIVILEGES ON `userdb`.* TO 'username'@'localhost'              |
+---------------------------------------------------------------------------+

Щоб увімкнути зовнішній доступ до бази даних, мені потрібно змінити localhost на %. Один із способів зробити це REVOKEвсі дозволи та встановити їх знову. Проблема полягає в тому, що існує набір паролів, який я не знаю, тому якщо я відкликаю дозвіл, я не можу його встановити назад.

Чи є спосіб змінити ім'я хоста localhostна %(і знову), не відкликаючи сам дозвіл?

Відповіді:


59

Якщо у вас є доступ до mysqlбази даних, ви можете безпосередньо змінити таблиці грантів:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;

... і аналогічне UPDATEтвердження, щоб змінити його назад.

Також вам може знадобитися внести зміни в mysql.dbтаблицю:

UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';

Невелике виправлення (версія mysql Server: 5.7.5-m15 - MySQL Community Server): як від phpmyadmin, так і командного рядка mysql - UPDATE mysql. userSET Host= 'localhost' ДЕ user. Host= '%' І user. User= 'XXXdbusr';
Jadeye

1
Щодо виробничої бази даних, я б обережний із%, це може бути ризиком для безпеки. Якщо у вас є декілька веб-серверів, ви також можете використовувати хости, що відмічаються на зразок "192.168.0.%" Або "% .example.com". Інший варіант - додати одного і того ж користувача кілька разів для кожного хоста або створити окремо названого користувача на одному веб-сервері.
Fx32

Якщо, як я, спробував дозволити доступ до root на локальній тестовій машині (в моєму випадку RasPi), це не буде працювати з MySQL 5.7. Дивіться цю тему
Рауль Пінто

@RaulPinto: ця тема, схоже, стосується phpMyAdmin, що тут не зовсім актуально, але добре зазначити для людей, які цим лише користуються.
nickgrim

Краще скористатися добре задокументованою заявою КОРИСТУВАЧА
РЕНАМ

6

Найкраща відповідь на Stackoverflow, пропонуючи використовувати, RENAME USERякі копіюють привілеї користувача.

Використання мови управління даними (висловлювання як GRANT, REVOKE, RENAME тощо) не вимагає FLUSH PRIVILEGES;і не потребує такої архітектури, як Galera або Group Replication, де таблиці MyISAM не копіюються.


2

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

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;

І "це" спрацювало?
Pierre.Vriens

1

Щоб змінити привілеї, спочатку анулюйте весь дозвіл користувачеві

 revoke all privileges on *.* from 'username'@'localhost';

 grant SELECT,INSERT,UPDATE,DELETE ON `db`.* TO 'username'@'%';

 flush privileges;

Ось саме моя проблема, я не можу відкликати дозвіл через пароль. Прочитайте, будь ласка, моє запитання.
Fu86

Ви можете встановити хеш пароля таким, як старий за допомогою оновлення. Для цього вам не потрібно знати фактичний пароль.
drogart

0

Відсутність багатьох таблиць, якщо у вас є інші привілеї, ніж просто db (наприклад, таблиці чи стовпці тощо). Залежно від того, які гранти має ваш користувач, вам може знадобитися оновити всі ці таблиці чи деякі:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.db SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.tables_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.columns_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.procs_priv SET Host='%' WHERE Host='localhost' AND User='username';
UPDATE mysql.proxies_priv SET Host='%' WHERE Host='localhost' AND User='username';
FLUSH PRIVILEGES;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.