Зміна дозволу хоста для користувачів 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.